大型Scala Monorepo编译时GC老年代内存持续增长问题排查
Scala编译内存异常问题分析
环境信息
- Scala版本:2.12.15
- SBT版本:1.4.9
- JVM版本:1.8
- GC类型:ParallelGC (marksweep/scavenge)
- 堆内存配置:14GB
- 代码规模:Monorepo包含大量Spark代码,需编译3-4个子项目下的34013个文件
问题现象
编译过程中老年代内存持续增长,GC频繁触发但无法有效释放内存,推测存在大量存活对象。已通过jmap -histo生成堆dump,结果如下:
13: 1209208 181.843 [Ljava.lang.Object; 12: 8881966 203.292 xsbti.api.NameHash 11: 9080251 207.83 scala.collection.immutable.HashSet$HashSet1 10: 7052557 215.227 scala.reflect.internal.Trees$Literal 9: 6539689 249.469 scala.reflect.internal.Trees$TypeTree 8: 10487573 320.055 scala.reflect.internal.Symbols$TypeHistory 7: 4839129 332.277 scala.reflect.internal.Symbols$TermSymbol 6: 10500404 400.559 scala.reflect.internal.Trees$Apply 5: 10728133 409.246 scala.reflect.internal.Trees$Ident 4: 30407384 695.97 java.lang.String 3: 18842332 718.778 scala.reflect.internal.Trees$Select 2: 35977908 823.469 scala.collection.immutable.$colon$colon 1: 30412139 1942.91 [C
堆内存分析
统计各类对象的保留大小后发现,scala.collection.immutable.$colon$colon(Scala不可变链表)占用约5GB堆内存,是内存占用最高的对象类型之一。
核心需求
- 了解scalac的工作机制,定位老年代内存持续增长的根源
- 确认编译该Monorepo是否确实需要14GB的堆内存配置
内容的提问来源于stack exchange,提问作者ffff
相关产品推荐
相关产品推荐

