开发者社区> 问答> 正文

JVM - 为什么YoungGen在gc之间使用堆减少?

下面是一些apache Spark执行器的GCViewer图:

老gen使用堆
年轻的gen使用堆
GC时间
有问题的现象
我试着去理解(4)中的斜率。为什么gc会在使用整个年轻的gen堆之前启动(就像以前的gcs阶段一样)?为什么它会在恢复之前单调减少约5分钟?我认为如果分配了一个非常大的对象(例如,从io socket读取),就会发生这种情况。但这可能是错误的,因为在此之后老一代没有改变。我并不特别关心这个例子,而只是为了学习更多关于jvm内存管理的知识。

展开
收起
社区小助手 2018-12-21 13:44:11 2196 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    我能想到的一个可能的解释是线程局部分配块(TLAB)的结果。为了避免在多个线程使用的指向Eden空间的单个指针上发生争用,每个应用程序线程都有自己的指针,指向Eden空间中的内存块。当TLAB用完时,分配一个新的(这也可能涉及分配更大的块,因此可以平滑线程分配速率之间的差异)。

    这意味着当GC需要发生时,TLAB中通常会有未使用的空间(因为一个线程需要一个新的TLAB并且没有足够的空间)。由于其他线程的分配率,您可能会遇到TLAB中剩余空间量增加的情况。

    由于这是整个年轻一代,幸存者空间中的物体也有可能以一定的速度获得终身,这将导致使用的空间量像这样下降。

    不幸的是,根据提供的数据,无法给出明确的答案。

    2019-07-17 23:23:24
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
JVM实战 立即下载
JVM的GC 立即下载
基于JVM的脚本语言开发、运用实践 立即下载