首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GC.run和GC.run_finalization有什么区别?

GC.run和GC.run_finalization有什么区别?
EN

Stack Overflow用户
提问于 2020-05-13 13:38:06
回答 1查看 868关注 0票数 1

谁能给我解释一下(最好是找到文件),两者之间有什么区别?

代码语言:javascript
复制
jcmd ${jpid} GC.run_finalization
jcmd ${jpid} GC.run

与应用程序(springboot + tomcat)一样,经过测试(使用gatling)后,许多内存保持分配而不释放。

在应用程序生命周期中:

启动

  • 攻击(gatling模拟),启动额外的tomcat执行器线程,攻击结束
  • ,过了一段时间之后,
  • / tomcat会话对象超时会被释放,而额外的tomcat执行器将被释放,但这不会发生--
  • --我等了很久(假设几天).这是上面的图形启动
  • 的地方,如果我执行GC.run_finalization -没有什么事情发生(只是更快的“锯片下降”)
  • ,如果我执行GC.run -内存被释放,如图像

所示。

我找到的唯一文档是https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#gc--,但它更让我感到困惑(我知道GC.run_finalization会建议完成对象的发布,而GC.run则建议为将来的重用准备内存对象,而不需要释放内存对象)。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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对象:

代码语言:javascript
复制
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.

  • The
  • 垃圾收集查找所有不可访问的对象。
  • 需要完成的任何不可访问对象都添加到队列中。
  • 其他不可访问对象被删除,

GC完成

  • ,终结线程唤醒并开始处理队列中的对象。调用每个排队对象的finalized.

方法,并将其标记为finalized.

最后确定的对象留在它们所在的位置。它们将被GC在将来的集合中删除,条件是它们仍然无法到达。

请注意,终结是在删除对象之前整理对象的一种旧机制。绝大多数Java对象从未最终确定。

这就是你所看到的行为的解释。

  • ,浅层锯齿,都是小收藏。他们只是在收集伊甸园的空间。据推测,“攻击”导致许多对象被永久保存到老space.
  • Calling GC_run中,触发了收集所有空间的完整集合。这会导致更多的内存成为freed.
  • Calling,GC_run_finalization没有任何效果,因为终结不会释放对象。而且,队列中可能没有可完成的对象。

-

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61776147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档