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
Trả lời
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,
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
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
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
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. –
Xem bài viết trên blog của tôi về thr permsize of Eclipse
Nói tóm lại các Analyzer Memory thể DoIT, nhưng bạn cần SAP JVM.
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ó ...
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.
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.
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.
Một kỹ thuật đã giúp tôi là sử dụng -verbose:class
command-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.
- 1. Làm thế nào để tôi tắt gỡ lỗi trong quá trình tháo gỡ vĩnh viễn?
- 2. Vĩnh viễn thay thế một chức năng
- 3. Làm thế nào để thiết lập một biến môi trường vĩnh viễn trong Linux?
- 4. Làm thế nào để vô hiệu hóa stringsAsFactors = TRUE trong data.frame vĩnh viễn?
- 5. Làm thế nào để thiết lập dbpath vĩnh viễn cho mongodb
- 6. Cuộn vĩnh viễn UITableView
- 7. Làm thế nào để tôi khám phá quý của một ngày nhất định
- 8. Không có hệ thống tệp vĩnh viễn cho Heroku?
- 9. Biến PowerShell vĩnh viễn
- 10. Máy chủ Django vĩnh viễn
- 11. Làm thế nào để xóa vĩnh viễn một trang từ một wiki MediaWiki?
- 12. Làm thế nào để thay đổi vĩnh viễn ngôn ngữ của dòng lệnh mercurial trên Windows?
- 13. Kết quả bộ nhớ đệm vĩnh viễn của thế hệ lớp Python
- 14. các chuỗi ký tự và vùng bộ nhớ thế hệ vĩnh viễn
- 15. HttpServletResponse sendRedirect vĩnh viễn
- 16. Làm thế nào để bạn khám phá các thuộc tính mô hình trong Rails
- 17. vĩnh viễn Xóa Thư mục
- 18. Làm thế nào/những gì để thử trong BDD
- 19. Gói khám phá không hiển thị ... gói, trong Eclipse. Làm thế nào để sửa chữa nó?
- 20. Làm thế nào để bạn yêu cầu git bỏ qua vĩnh viễn các thay đổi trong một tệp?
- 21. Vĩnh viễn chỉ kích hoạt mã số của tôi
- 22. Thay đổi CodePage trong CMD vĩnh viễn?
- 23. netbeans: thêm thư viện vĩnh viễn
- 24. Khám phá IP công trình
- 25. Làm thế nào để tự động khám phá một dịch vụ WCF?
- 26. mysql báo cáo chuẩn bị vĩnh viễn
- 27. Netbeans: Làm thế nào để tôi phá vỡ một NullPointerException?
- 28. Làm cách nào để bật tính năng tạo bên ngoài trong Android Studio vĩnh viễn?
- 29. Cách cập nhật vĩnh viễn iptables
- 30. tăng kích thước heap java vĩnh viễn?
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
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
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