java - 如何确定哪些对象在次要 GC 中幸存下来

标签 java garbage-collection heap-memory dump

在我的应用程序中,我看到一些对象不断进入旧一代:

- age   1:   23911192 bytes,   23911192 total
- age   2:     627816 bytes,   24539008 total
- age   3:      60344 bytes,   24599352 total
- age   4:      19488 bytes,   24618840 total
- age   5:      12864 bytes,   24631704 total
- age   6:      10632 bytes,   24642336 total
- age   7:      11472 bytes,   24653808 total
- age   8:      10944 bytes,   24664752 total
- age   9:      39480 bytes,   24704232 total
- age  10:      10288 bytes,   24714520 total
- age  11:       8072 bytes,   24722592 total
- age  12:       9976 bytes,   24732568 total
- age  13:      13112 bytes,   24745680 total
- age  14:       8928 bytes,   24754608 total
- age  15:       8600 bytes,   24763208 total <-- who are these guys?

所以,我想问一下,找出在 15 次小型 GC 中幸存下来的对象是谁的最佳方法是什么?

应用程序运行一个小时,因此这不是预热期。

最佳答案

我不知道有任何选项可以按任期年龄来分割实例

但是如果我们问哪些对象能活到 16 岁,那么这些对象就会被提升到老年代。可以使用-XX:+PrintClassHistogram进行追踪。比较完整 GC 之后和下一次完整 GC 之前的直方图将显示哪些对象在其间的年轻集合中渗入了旧代。

使用支持快照及其比较的内存分析器可以提供类似的见解。

对于 java 9 的统一日志记录,等效选项是 -Xlog:classhisto*=trace

关于java - 如何确定哪些对象在次要 GC 中幸存下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38327902/

相关文章:

java - 垃圾收集器 (.net/java) 是实时系统的问题吗?

c++ - 动态内存分配,堆,间接,NULL

java - 为什么 Java 使用静态堆而不是允许任意数量的内存?

java - 父类(super class)引用子类对象?

java - 像 startsWith() 不是 equals() 这样的快速字符串搜索

java - 为什么 DFS 和 BFS 的复杂度不是 O(V)?

Java CMS GC : can a minor GC occur between final remark and concurrent sweep?

java - 我如何发现永久代中的内容

c# - 何时以及如何交换 .NET 托管堆?

java - OCaml 到 Java 的翻译