下面是一些apache Spark执行器的GCViewer图:
老gen使用堆
年轻的gen使用堆
GC时间
有问题的现象
我试着去理解(4)中的斜率。为什么gc会在使用整个年轻的gen堆之前启动(就像以前的gcs阶段一样)?为什么它会在恢复之前单调减少约5分钟?我认为如果分配了一个非常大的对象(例如,从io socket读取),就会发生这种情况。但这可能是错误的,因为在此之后老一代没有改变。我并不特别关心这个例子,而只是为了学习更多关于jvm内存管理的知识。
我能想到的一个可能的解释是线程局部分配块(TLAB)的结果。为了避免在多个线程使用的指向Eden空间的单个指针上发生争用,每个应用程序线程都有自己的指针,指向Eden空间中的内存块。当TLAB用完时,分配一个新的(这也可能涉及分配更大的块,因此可以平滑线程分配速率之间的差异)。
这意味着当GC需要发生时,TLAB中通常会有未使用的空间(因为一个线程需要一个新的TLAB并且没有足够的空间)。由于其他线程的分配率,您可能会遇到TLAB中剩余空间量增加的情况。
由于这是整个年轻一代,幸存者空间中的物体也有可能以一定的速度获得终身,这将导致使用的空间量像这样下降。
不幸的是,根据提供的数据,无法给出明确的答案。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。