簡體   English   中英

我如何發現永久世代中的東西

[英]How do I discover what is in the permanent generation

給定堆轉儲或正在運行的VM,如何發現永久代的內容是什么? 我知道'jmap -permstat'但是在Windows上不可用。

永久代包含類對象。 因此,您應該檢查堆轉儲或其他形式的對象列表。 如果你對永久代的大小有問題,通常是由兩個原因引起的:

  • 您的程序或您使用的庫動態創建類,永久生成的默認大小太小 - 使用-XX簡單地增加大小:MaxPermSize = 256m
  • 您使用的程序或庫每次調用時都會動態創建新類,因此永久生成的大小會不停增加 - 這是一個編程錯誤,您應該修復它(或搜索修復/創建錯誤報告)

要查看您的情況,請檢查更長時間內永久代的大小。

關於永久性發電的一個很好的概述:

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

本文使用Java SE 5進行內存監視介紹了如何以編程方式發現有關堆使用情況,內存池(包括permgen空間)等的信息。 它非常簡單:

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

在我對OSX(Sun VM)的測試中,“非堆內存使用”與permgen池的返回值匹配,並且可能會對沒有permgen的VM執行一些有用的操作。

請參閱我關於Eclipse的thr permsize的博客文章

簡而言之,Memory Analyzer可以做,但您需要SAP JVM。

幫助我的一種技術是對java使用-verbose:class 命令行選項 ,並且您將獲得日志輸出,告訴您何時加載/卸載類。 由於類被加載到permgen,這在某些情況下會有所幫助。

我正在研究同樣的事情,但是由於嵌入式平台的內存限制。

查看jmap的代碼,permstat工具僅在sun.jvm.hotspot.tools.HeapSummary類可用時才可用。 此類是可維護性代理的一部分。 根據OpenJDK文檔(http://openjdk.java.net/groups/serviceability/svcjdk.html#bsa):

可維護性代理組件是作為HotSpot存儲庫的標准版本的一部分構建的。 這些組件是:

-libsaproc.so:這是SA的本機代碼組件。

-sa-jdi.jar:這包含SA的Java類。 它包括JDI的實現,它允許JDI客戶端對核心文件和掛起進程進行只讀調試。

SA由jinfo,jmap,jstack使用

注意:可維護性代理及其使用的技術當前未包含在Windows平台上的JDK版本中。

看起來也是Oracle JDK的情況。 我想修改jmap工具以獲取更多信息。

您有具體問題需要解決嗎? String.intern()的使用是permgen問題的典型原因之一。 此外,有很多課程的項目也存在permgen問題。

我不知道如何進入permgen,看看它是什么......

永久生成實際上只包含兩種東西:類定義和實習字符串。 后來很少給你帶來問題,但它常常被歸咎於問題。 由於代碼生成和部分熱重新加載(懸空引用),更常見的是前者產生問題。

與名稱不同,permgen最終也會得到GC,而不是常規GC循環的一部分。 因此,未引用的實習字符串和未使用的類確實得到清理。 但是permgen也沒有動態增長,這意味着有時需要手動調整其JVM啟動的設置。

您可以使用JConsole或jvisualvm.exe(使用jdk 1.6 7)來查找其中的內容。 如果您想知道所有對象如何相互關聯以及對象樹,那么您可能想要嘗試Eclipse Memory Analyzer - http://www.eclipse.org/mat/

總而言之,您將從“ http://www.eclipse.org/mat/ ”獲得您想要的。

祝好運,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM