gpt4 book ai didi

java - Java 中的急切垃圾收集

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:20 26 4
gpt4 key购买 nike

我想更好地了解我的应用程序,尤其是它的内存占用情况。

我确实理解垃圾收集的概念,并且我知道堆中总会有一定数量的死对象,但是,我想尽量减少这个数量,以便使用 JConsole(或 JVisualVM)进行监控为我提供有关当前所需(未占用)空间的一些信息。

是否有任何方法可以在 SunVM 中配置现有的垃圾收集器(例如 G1GC),以便(以响应性和运行时为代价)最小化堆中的死对象数量?

澄清

为了更清楚地说明我的目标:我的应用程序是非交互式的,因此随着时间的推移,两次运行之间的内存占用或多或少是相同的。我想确定所需的最小堆空间以及代码更改对该占用空间的影响。由于死对象,JConsole 的输出在这里并没有真正帮助。我也想知道,我的峰值内存是否真的是某个时间点的突出峰值,或者它是否随着时间的推移而被拉伸(stretch)。这就是为什么在我达到 OOME 之前减少 Xmx 并不是让我到达那里的原因。

另外:我说的是开发人员测试期间的使用,而不是生产中的使用。在生产中,吞吐量和性能 - 当然 - 比更现实的内存足迹更重要。

最佳答案

如果您想知道您的应用程序正在使用的内存总量,您必须对其进行相当长的监控。应用程序随机时刻的堆样本:

jps -> output the pid of java process
jmap -dump:live,format=b,file=heap.bin [pid]

然后使用jhat 导航堆。还有其他工具可以做到这一点。

这样做你马上就会知道堆上有什么。

请记住,内存映射文件 等对象不存储在堆中,而是存储在内存中。

当达到 OOM 时尝试添加这个,然后读取输出以查看哪些对象实际上在堆中:

-XX:-HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid<pid>.hprof

为此,请启用 GC 日志,然后使用 GCViewer 等工具.

-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-verbose:gc
-Xloggc:garbage_collector -> this set the file of the output

当您谈论堆时,我理解您是在谈论tenured 空间。如果是这样,您需要知道对象的平均生命周期。并遵循一些最佳实践,然后进行微调。另请记住,发出 System.gc() 并不能保证执行 GC

事情是实例进入年轻一代(eden),当它满时执行minor GC。仍可到达的对象被传递到称为 survivor 的两个空间之一。一旦它已满,空间就会被转储到 tenured 中。满时,full GC 执行并删除所有无法访问的实例。

您可以做的一件事是在方法中使用原语。那些不会被放置在堆中,因为它们的生命周期在线程堆栈中。

有用的参数是那些与 tenured 和 young generation (eden) 的大小相关联的参数。这些按比例工作。如果您要发出许多 GC,请记住为 GC 停止 设置最长时间。

一些有趣的参数是:

-XX:MinFreeHeapRatio=  
-XX:MaxHeapFreeRatio=
-XX:NewRatio=
-XX:SurvivorRatio

例如设置-XX:NewRatio=3,表示新生代和老年代的比例为1:3;换句话说,伊甸园和幸存者空间的组合大小将是堆的四分之一。

反正我不知道你为什么需要这个要求。我通常只担心 throughput 并且只在 throughput 不好时才关心那些参数。

关于java - Java 中的急切垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11240350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com