[英]In Maven, how do I discover what is depending on a particular dependency?
[英]How do I discover what is in the permanent generation
給定堆轉儲或正在運行的VM,如何發現永久代的內容是什么? 我知道'jmap -permstat'但是在Windows上不可用。
永久代包含類對象。 因此,您應該檢查堆轉儲或其他形式的對象列表。 如果你對永久代的大小有問題,通常是由兩個原因引起的:
要查看您的情況,請檢查更長時間內永久代的大小。
關於永久性發電的一個很好的概述:
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。
我正在研究同樣的事情,但是由於嵌入式平台的內存限制。
查看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.