谁能给我解释一下(最好是找到文件),两者之间有什么区别?
jcmd ${jpid} GC.run_finalization
jcmd ${jpid} GC.run与应用程序(springboot + tomcat)一样,经过测试(使用gatling)后,许多内存保持分配而不释放。

在应用程序生命周期中:
启动
所示。
我找到的唯一文档是https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#gc--,但它更让我感到困惑(我知道GC.run_finalization会建议完成对象的发布,而GC.run则建议为将来的重用准备内存对象,而不需要释放内存对象)。
提前感谢
发布于 2020-05-13 14:57:06
(最好是引导文档)
这里有关于jcmd及其子命令的文档:
该文档解释了jcmd <pid or class> help将列出可用的命令,jcmd <pid or class> help <command>将为您提供<command>的帮助信息。
GC.run和GC.run_finalization有什么区别?
从我从JVM源代码中可以看出的内容来看:
GC.run运行一个完整的垃圾收集。我不知道终结器是否运行(立即),但我怀疑not.GC.run_finalization只是调用了System.runFinalization()。根据javadoc,这在正在等待完成的对象上运行终结器;即GC已经找到的Java对象:。
1. to be currently unreachable,
2. to have a non-default `finalize()` method, and
3. to not have already been marked as finalized.
(我的理解是,
GC.run_finalization将建议最后确定要发布的对象,而GC.run则建议为将来的重用准备内存对象,而不必释放内存对象)。
不是那样的。正常的GC循环是这样的:
immediately.
GC完成
方法,并将其标记为finalized.
最后确定的对象留在它们所在的位置。它们将被GC在将来的集合中删除,条件是它们仍然无法到达。
请注意,终结是在删除对象之前整理对象的一种旧机制。绝大多数Java对象从未最终确定。
这就是你所看到的行为的解释。
,
GC_run中,触发了收集所有空间的完整集合。这会导致更多的内存成为freed.GC_run_finalization没有任何效果,因为终结不会释放对象。而且,队列中可能没有可完成的对象。-
https://stackoverflow.com/questions/61776147
复制相似问题