2009-02-19 37 views

Trả lời

1

Điều này không bình thường và có thể là dấu hiệu của một số memory leak.

Bạn nên thử sử dụng memory profiler để xem ứng dụng của bạn đang bị rò rỉ ở đâu.

Nói chung, bạn nên tìm kiếm các vòng lặp hoặc các hoạt động lặp lại nơi các đối tượng được tạo nhưng không phải là disposed of chính xác.

+0

Điều này là bình thường đối với JVM của máy chủ. –

+1

@sjbotha: Tăng trưởng liên tục chắc chắn là/không/bình thường. – GEOCHET

+0

Tôi nghĩ rằng nó phụ thuộc nếu nó liên tục tăng trưởng mà không có bất kỳ giới hạn hoặc không –

0

Bạn có thể bị rò rỉ bộ nhớ. Trước tiên tôi sẽ kết nối jconsole với ứng dụng của bạn để xác định xem nó có phải là không gian permgen hay chỉ là bộ nhớ heap và sau đó tiến hành tìm ra nơi rò rỉ. Bạn có thể cung cấp thêm thông tin cho chúng tôi không? Điều gì đang xảy ra trong ứng dụng của bạn khi bộ nhớ tăng lên?

Nếu bạn tương đối mới để chẩn đoán loại vấn đề này, tôi sẽ giới thiệu jprofiler. Bạn có thể tải xuống phiên bản dùng thử đầy đủ chức năng và chụp nhanh bộ nhớ để xem những đối tượng nào có trong bộ nhớ. Bạn có thể sử dụng thông tin này để tìm ra đối tượng nào là nguồn rò rỉ.

+0

Ứng dụng này đã chạy trong nhiều năm. Gần đây, tôi đã tìm thấy vấn đề này, bởi vì trang web đang chạy rất chậm. Tôi tự hỏi nếu có ai đó thay đổi cấu hình. Tôi không nghĩ rằng có một rò rỉ bộ nhớ vì không ai thay đổi mã. – user68461

9

Nếu nó chỉ phát triển, thì đó là rò rỉ bộ nhớ. Nhưng nếu nó phát triển lên đến heap tối đa của bạn, sau đó giảm xuống, sau đó đó là hành vi thu gom rác bình thường. Có nhiều công cụ bạn có thể sử dụng để tìm hiểu thêm. Một trong những cách đơn giản nhất là kết nối với JConsole (một phần của JDK) và quan sát đống của bạn theo thời gian.

Bạn cũng có thể xem thông tin thu thập rác với nhiều công tắc và thông số khác nhau như -verbose: gc để bắt đầu.

Nếu bạn muốn để chẩn đoán rò rỉ bộ nhớ, có một số công cụ tuyệt vời có sẵn, bao gồm một số những người Việt làm việc với Eclipse, NetBeans, IntelliJ vv

5

Hành vi mặc định của Sun "máy chủ" HotSpot là để phóng to heap hơn là xóa SoftReference s (được sử dụng cho cache). Mặc định là giữ chúng trong một giây cho mỗi megabyte kích thước heap tối đa có sẵn. Vì vậy, mong đợi các đống để phát triển đến kích thước tối đa. Nếu bạn thực sự hết bộ nhớ với OutOfMemoryException hoặc hiệu suất trở nên kém (do GC quá mức hoặc bộ nhớ cache nhỏ), thì bạn cần phải tìm rò rỉ bộ nhớ.

Máy chủ Tomcat thường bị rò rỉ bộ nhớ sau khi tải lại ứng dụng. Ví dụ, Tomcat chia sẻ chủ đề giữa tất cả các ứng dụng, thường gây ra việc thực hiện ThreadLocal của Sun để giữ lại các giá trị không đúng cách.

+0

Tomcat không bị rò rỉ trừ khi các ứng dụng rời khỏi các luồng phía sau hoặc cài đặt các móc trong máy ảo. –

+2

Xảy ra rất nhiều với các khuôn khổ nhất định, Trình nạp lớp ngớ ngẩn ... – wds

+0

Tôi sẽ chỉnh sửa đủ điều kiện tuyên bố của tôi một chút. Việc thực hiện Sun ThreadLocal, ví dụ, thường dẫn đến rò rỉ khi Tomcat không loại bỏ các luồng. Tôi không biết thực hiện Harmonybob của Harmony làm gì. –

4

Câu trả lời của IMO Tom Hawtin là tốt nhất. Nó phát triển cho đến khi nó đạt đến mức tối đa, sau đó chạy GC. Trong môi trường máy chủ, điều này có ý nghĩa: Bạn muốn có hiệu suất tốt nhất, không sử dụng bộ nhớ tốt nhất. Bạn tính trước tổng số lượng bộ nhớ, sau đó cung cấp cho mỗi ứng dụng một tối đa và sau đó tất cả mọi thứ phù hợp và có hiệu suất tốt nhất. Hành vi này có thể được tinh chỉnh.

Sử dụng jconsole để xem mức độ thực sự được sử dụng. Làm GC và xem những gì nó đi xuống. Con số đó không nên phát triển theo thời gian hoặc bạn bị rò rỉ bộ nhớ. Sử dụng visualvm để gỡ lỗi rò rỉ bộ nhớ.

Mỗi khi bạn tải lại ứng dụng, nó sử dụng bộ nhớ Perm Gen bổ sung không thể khôi phục (trong Sun JVM, những người khác như JRockit không có vấn đề này). Trong sản xuất, bạn không nên tải lại ứng dụng. Khởi động lại Tomcat mỗi lần.Nếu bạn thực sự muốn tiếp tục làm điều đó thì bạn có thể tăng bộ nhớ tối đa và cũng tăng bộ nhớ Max Perm Gen với cờ -XX: MaxPermSize = 256m

+0

MaxPermSize hóa ra chính xác là vấn đề của tôi. Chúng tôi liên tục triển khai các phiên bản cập nhật của ứng dụng trong quá trình phát triển. –

4

Với chương trình Lambda Probe bạn có thể dễ dàng xem xét việc sử dụng bộ nhớ trong Tomcat . (tùy chọn Thông tin hệ thống - Sử dụng bộ nhớ). Bạn có thể thấy trong biểu đồ Survivor Space Perm Gen Tenured Gen Eden Mã không gian Cache

Chỉ triển khai warfile này vào tomcat và đặt tùy chọn khởi động -Dcom.sun.management.jmxremote để khởi động Java.

Bây giờ bạn có thể thấy phần nào của bộ nhớ phát triển.

Các vấn đề liên quan