2016-09-05 20 views
7

chúng tôi có vấn đề rằng bộ nhớ không-heap của chúng tôi đang phát triển tất cả các thời gian. vì vậy chúng tôi phải khởi động lại jee (java8) - webapp của chúng tôi mỗi ngày thứ 3 (như bạn có thể thấy trong ảnh chụp màn hình tại đây: screenshot from non-heap- and heap-memory)Java: phân tích bộ nhớ không-heap-

Tôi đã cố gắng tìm hiểu những gì không đầy. Nhưng tôi không thể tìm thấy bất kỳ công cụ để tạo ra một nonheap-dump. bạn có bất kỳ ý tưởng làm thế nào tôi có thể điều tra về điều đó để tìm hiểu những yếu tố đang ngày càng phát triển?

java-phiên bản

java version "1.8.0_102" 
Java(TM) SE Runtime Environment (build 1.8.0_102-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) 

tomcat-phiên bản

Apache Tomcat Version 7.0.59 
+0

Trong nhận xét bên dưới, bạn nói rằng đó là một tomcat được nhúng. Bạn có thể thêm vào bài đăng của mình phiên bản JVM và các thông số được sử dụng để khởi động nó không? – Aris2World

+0

Ngoài ra phiên bản của tomcat là quan trọng – Aris2World

+0

Cảm ơn @Stefan nếu bạn cũng có phiên bản của tomcat được nhúng ... – Aris2World

Trả lời

0

Như @apangin chỉ ra có vẻ như bạn đang sử dụng Metaspace hơn theo thời gian. Điều này thường có nghĩa là bạn đang tải nhiều lớp hơn. Tôi sẽ ghi lại các lớp nào đang được nạp và các phương thức được biên dịch và cố gắng giới hạn số lượng này đang được thực hiện trong sản xuất liên tục. Có thể bạn có một thư viện tạo mã liên tục nhưng không làm sạch nó. Đây là nơi xem xét những gì các lớp học đang được tạo ra có thể cung cấp cho bạn một gợi ý như là một trong những.


Đối với bộ nhớ không phải bộ nhớ gốc.

Bạn có thể xem bản đồ bộ nhớ trên Linux bằng /proc/{pid}/maps Điều này sẽ cho bạn biết số lượng bộ nhớ ảo đang được sử dụng.

Bạn cần phải xác định xem điều này là do

  • số chủ đề, hoặc ổ cắm
  • ByteBuffers trực tiếp đang được sử dụng ngày càng tăng.
  • thư viện của bên thứ ba đang sử dụng bộ nhớ gốc/trực tiếp.

Từ khi xem biểu đồ, bạn có thể giảm heap và tăng bộ nhớ trực tiếp tối đa và kéo dài thời gian khởi động lại một tuần trở lên, nhưng giải pháp tốt hơn là giải quyết nguyên nhân.

+3

Dường như đồ thị của OP hiển thị mức sử dụng bộ nhớ được cung cấp bởi [MemoryPoolMXBean] (http://docs.oracle.com/javase/8/docs/api/java/lang/management/MemoryPoolMXBean.html). Không có bộ đệm, bộ đệm, bộ đệm byte trực tiếp hoặc bộ nhớ thư viện của bên thứ ba nào được bao gồm trong các thống kê không phải heap chuẩn. Các nhóm Non-Heap chỉ là Code Cache, Metaspace và Compressed Class Space. Đó là nó. – apangin

+1

Đó là một quan sát thú vị. Sau đó nó sẽ trỏ đến một vấn đề tải lớp (chẳng hạn như triển khai một tệp .war hoặc .ear mới ở đó phiên bản cũ không được phát hành đúng cách, hoặc tạo ra quá trình tạo và tải byte bytecode quá mức hoặc kết hợp). – Codo

+0

chúng tôi chạy ứng dụng web j2ee với tomcat được nhúng, vì vậy không triển khai tệp .war- hoặc .ear-file –

0

Với Java 8, dữ liệu meta lớp giờ đây nằm trong phần bộ nhớ không phải là bộ nhớ heap được gọi là Metaspace (và không ở trong PermGen nữa). Nếu bộ nhớ không phải heap của bạn chủ yếu được tiêu thụ bởi Metaspace, bạn có thể tìm ra nó với jstat.

Đây không phải là công cụ chung để phân tích bộ nhớ không phải đống. Nhưng nó vẫn có thể giúp ích trong trường hợp của bạn.

0

Non-đống sử dụng bộ nhớ, theo quy định của MemoryPoolMXBean đếm các hồ bộ nhớ sau:

  • Metaspace
  • nén Lớp Space
  • Mã cache

Nói cách khác, tiêu chuẩn không số liệu thống kê bộ nhớ cao bao gồm các khoảng trống bị chiếm bởi các phương thức được biên dịch và các lớp được nạp. Nhiều khả năng, việc sử dụng bộ nhớ không phải heap ngày càng tăng cho thấy một trình nạp lớp bị rò rỉ.

Sử dụng

  • jmap -clstats PID để đổ thống kê lớp nạp;
  • jcmd PID GC.class_stats để in thông tin chi tiết về mức sử dụng bộ nhớ của từng lớp đã tải. Sau đó yêu cầu -XX:+UnlockDiagnosticVMOptions.
Các vấn đề liên quan