我有一个Java程序,该程序创建十二个数组,每个数组的长度大约为1.6亿。数组包含基元(char,short和float)。在我的算法中,我注意到(通过jprofiler)GC在我的系统(Google Cloud上的Windows VM计算机,16个CPU内核,64GB RAM)上运行了相当多的位,但是我不知道为什么GC如此运行通常会消耗总计算CPU能力的80%。
所以我想:如果我能(通过jvm命令/日志,或者最好通过一个探查器,就像jprofiler一样)弄清楚“垃圾收集”是什么精确对象,那么我就有机会了解正在发生的事情,或者根据我对Java正在做什么的更好理解,解决一个简单的问题或重新设计。 (据我所知,我已最大限度地减少了对象的创建;尽管我确实使用了许多jdk8并行流功能,所以我不知道这是否以某种方式引起了GC问题。)是否有一种方法可以确定 GC会在任何特定时间尝试垃圾收集哪些对象(或哪种对象类型),以便我更好地理解为什么GC如此频繁且如此困难地运行?
答案 0 :(得分:0)
在JProfiler中,您可以为此使用分配记录。
要在“记录的对象”视图中显示垃圾收集的对象,请将工具栏中的活动性选择器更改为“垃圾收集的对象”或“活动和垃圾收集的对象”。分配调用树和分配热点视图的选项对话框具有等效的下拉列表。