是否有一种(简单的)方法来确定 GC 是什么对象 "removing"?
Is there an (easy) way to determine what objects the GC is "removing"?
我有一个 Java 程序可以创建十几个数组,每个数组的长度约为 1.6 亿。数组包含原语(char、short 和 float)。在我的算法中,我注意到(通过 jprofiler)GC 在我的系统上运行得很好(Windows 虚拟机在 Google 云上,16 CPU 核心,64GB RAM)但是我不明白为什么 GC 运行 如此频繁并且消耗了总计算 CPU 的 80%。
所以我想:如果我能弄清楚(通过 jvm commands/logs 或者最好通过像 jprofiler 这样的分析器)它是什么精确对象 "garbage collecting",我就有机会理解发生了什么,要么解决一个简单的问题,要么根据我对 Java 正在做的事情的更好理解进行重构。 (据我所知,我已经最小化了对象创建;不过我确实使用了很多 jdk8 并行流功能,所以我不知道这是否会以某种方式导致 GC 问题。)有没有办法确定 GC 试图在任何特定时间对哪些对象(或哪些对象类型)进行垃圾收集,以便我更好地理解为什么 GC 运行 如此频繁且如此困难?
在 JProfiler 中,您可以为此目的使用分配记录。
要在 "Recorded objects" 视图中显示垃圾收集对象,请将工具栏中的活动选择器更改为 "Garbage collected objects" 或 "Live and garbage collected objects"。分配调用树和分配热点视图的选项对话框有一个等效的下拉列表。
我有一个 Java 程序可以创建十几个数组,每个数组的长度约为 1.6 亿。数组包含原语(char、short 和 float)。在我的算法中,我注意到(通过 jprofiler)GC 在我的系统上运行得很好(Windows 虚拟机在 Google 云上,16 CPU 核心,64GB RAM)但是我不明白为什么 GC 运行 如此频繁并且消耗了总计算 CPU 的 80%。
所以我想:如果我能弄清楚(通过 jvm commands/logs 或者最好通过像 jprofiler 这样的分析器)它是什么精确对象 "garbage collecting",我就有机会理解发生了什么,要么解决一个简单的问题,要么根据我对 Java 正在做的事情的更好理解进行重构。 (据我所知,我已经最小化了对象创建;不过我确实使用了很多 jdk8 并行流功能,所以我不知道这是否会以某种方式导致 GC 问题。)有没有办法确定 GC 试图在任何特定时间对哪些对象(或哪些对象类型)进行垃圾收集,以便我更好地理解为什么 GC 运行 如此频繁且如此困难?
在 JProfiler 中,您可以为此目的使用分配记录。
要在 "Recorded objects" 视图中显示垃圾收集对象,请将工具栏中的活动选择器更改为 "Garbage collected objects" 或 "Live and garbage collected objects"。分配调用树和分配热点视图的选项对话框有一个等效的下拉列表。