2008-10-11 28 views
11

Với một máy ảo hoặc máy ảo đang chạy, làm cách nào để khám phá nội dung của thế hệ vĩnh viễn là gì? Tôi biết về 'jmap -permstat' nhưng điều đó không có sẵn trên Windows.Làm thế nào để tôi khám phá những gì trong thế hệ vĩnh viễn

+0

Không trả lời câu hỏi của bạn, nhưng có thể đưa ra câu trả lời cho bạn - Sun JVM có một permgen, nhưng có các JVM khác không bị ảnh hưởng bởi điều này. – Tnilsson

+3

Vấn đề ở đây là các permgen (hoặc tương đương trong các JVM khác) không được tiếp xúc bởi giao diện JVMTI, và do đó các công cụ không có phương tiện để quan sát nó. Đó là một vấn đề lớn với các nhà cung cấp công cụ. – skaffman

+1

hãy nêu rõ phiên bản java. trong thời gian trước đó của jvm, gc rất khó về việc thu thập các lớp học. Ngoài ra, nếu bạn nhận được một heapdump bạn có thể đoán liệu chuỗi interned là vấn đề của bạn. – Ron

Trả lời

-1

bạn có thể sử dụng JConsole hoặc jvisualvm.exe (với jdk 1.6 7) để tìm địa điểm. Nếu bạn muốn biết làm thế nào tất cả các đối tượng của bạn có liên quan với nhau và cây của các đối tượng, sau đó bạn có thể muốn thử Eclipse Memory Analyzer - http://www.eclipse.org/mat/.

Tóm tắt, bạn sẽ nhận được mong muốn từ "http://www.eclipse.org/mat/".

Chúc may mắn,

+0

Tôi đang tìm kiếm cụ thể cho các đối tượng trong thế hệ vĩnh viễn. Những công cụ này sẽ không trả lời câu hỏi đó. – Tom

+0

Xin chào Tom, MAT có thể trả lời câu hỏi của bạn nhưng bạn sẽ phải sử dụng SAP JVM, thật không may vào lúc này hơi khó để có được. Bạn sẽ cần tải xuống NW CE từ https://www.sdn.sap.com/irj/sdn/nw-ce – kohlerm

1

Thế hệ vĩnh viễn chứa đối tượng lớp. Vì vậy, bạn nên kiểm tra đống đống hoặc hình thức khác của danh sách đối tượng cho các lớp học. Nếu bạn có vấn đề với kích thước của hệ lâu dài thường nó được gây ra bởi hai lý do:

  • chương trình của bạn hoặc một thư viện bạn sử dụng tạo ra các lớp học năng động và kích thước mặc định của hệ vĩnh viễn là quá nhỏ - đơn giản increate kích thước với -XX: MaxPermSize = 256m
  • chương trình hoặc thư viện bạn sử dụng tạo lớp mới động mỗi khi được gọi, do đó kích thước của thế hệ vĩnh viễn tăng không ngừng - đây là lỗi lập trình bạn nên sửa (hoặc tìm kiếm một bản sửa lỗi/tạo báo cáo lỗi)

Để xem đó là cas của bạn e kiểm tra kích thước của thế hệ vĩnh viễn trong một khoảng thời gian lớn hơn.

Và một cái nhìn tổng quan tốt về thế hệ vĩnh viễn:

http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

+0

Câu trả lời này chưa hoàn chỉnh: hiện tại chúng tôi có ứng dụng đang rò rỉ bộ nhớ permgen và số lượng các lớp đã tải là hoàn toàn không đổi. Cả hai sự kiện có thể được nhìn thấy bằng cách sử dụng JConsole. Chúng tôi phải chịu cùng một vấn đề như áp phích ban đầu ở chỗ chúng tôi không có cách nào để phân tích chi tiết về permlink. –

0

Bạn có vấn đề cụ thể cần giải quyết không? Việc sử dụng String.intern() là một trong những nguyên nhân điển hình cho các vấn đề permgen. Ngoài ra các dự án với rất nhiều lớp cũng có vấn đề permgen.

Tôi không biết làm thế nào để có được vào PermGen và xem những gì nó có ...

0

hệ vĩnh viễn thực sự chỉ chứa hai loại điều: định nghĩa lớp và thực tập nội trú chuỗi. Rất hiếm khi cho bạn vấn đề, nhưng nó thường bị đổ lỗi cho các vấn đề. Thường xuyên hơn trước đây là một trong những vấn đề, do thế hệ mã và tải lại một phần nóng (tham khảo lơ lửng).

Không giống như tên cho thấy, permgen cuối cùng cũng nhận được GC'ed quá, chỉ cần không phải là một phần của chu kỳ GC thường xuyên. Do đó các chuỗi ký tự không được tham chiếu và các lớp không sử dụng được làm sạch. Nhưng permgen cũng không phát triển động, có nghĩa là đôi khi cần thiết phải thay đổi kích thước các thiết lập của nó theo cách thủ công để bắt đầu JVM.

0

Tôi đang xem xét điều tương tự nhưng do hạn chế về bộ nhớ của nền tảng được nhúng.

Nhìn vào mã cho jmap, công cụ permstat chỉ khả dụng nếu lớp sun.jvm.hotspot.tools.HeapSummary có sẵn. Lớp này là một phần của tác nhân phục vụ. Theo tài liệu OpenJDK (http://openjdk.java.net/groups/serviceability/svcjdk.html # bsa):

Tính linh hoạt Các thành phần đại lý được xây dựng như một phần của bản dựng chuẩn của kho lưu trữ HotSpot. Các thành phần này là:

-libsaproc.so: đây là thành phần mã gốc của SA.

-sa-jdi.jar: Trường này chứa các lớp Java của SA. Nó bao gồm việc thực hiện JDI cho phép các máy khách JDI thực hiện gỡ lỗi chỉ đọc trên các tệp lõi và các quy trình treo.

SA được sử dụng bởi jinfo, jmap, jstack

Chú ý: bảo trì Agent và các công nghệ mà sử dụng nó hiện không được bao gồm trong JDK phát hành trên nền tảng Windows.

Cũng giống như trường hợp của Oracle JDK. Tôi đang tìm cách sửa đổi công cụ jmap để có thêm thông tin.

1

Bài viết này Memory Monitoring with Java SE 5 mô tả cách khám phá theo cách lập trình thông tin về cách sử dụng đống, vùng bộ nhớ (bao gồm khoảng trống permgen), v.v. Của nó rất đơn giản:

MemoryUsage usage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage(); 
    long nonHeapFree = usage.getMax() - usage.getUsed(); 
    long nonHeapTotal = usage.getMax(); 

Trong thử nghiệm của tôi trên OSX (Sun VM) "không sử dụng bộ nhớ heap" phù hợp với giá trị trả lại cho hồ bơi PermGen chặt chẽ và có lẽ sẽ làm điều gì đó hữu ích trên máy ảo mà không có PermGen.

0

Một kỹ thuật đã giúp tôi là sử dụng -verbose:classcommand-line option to java và bạn sẽ nhận được đầu ra nhật ký cho bạn biết khi các lớp được tải/không tải. Vì các lớp được nạp vào permgen, điều này có thể giúp trong một số trường hợp nhất định.

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