Java 如何识别巨大的物体?

Java 如何识别巨大的物体?,java,g1gc,Java,G1gc,当使用G1GC时,我得到了大量的分配 服务器一次接收大约300个客户机的请求,通常来自数据库的不同类型的大型数据集 这很可能是导致巨大分配的原因,然而,呼叫的数量让我很难仅仅根据时间来确定是哪个呼叫导致分配,因为有太多的事情在进行 有没有办法让JVM打印并记录庞大对象的类名?我认为这不会有多大帮助,即使它存在。Java中的大多数对象都很小,只包含少数引用和原语。要真正需要一大块连续的内存,对象通常是一个数组。数组的类名通常不会提供太多信息,特别是如果它是一个隐藏在ArrayList中的数组,其中

当使用G1GC时,我得到了大量的分配

服务器一次接收大约300个客户机的请求,通常来自数据库的不同类型的大型数据集

这很可能是导致巨大分配的原因,然而,呼叫的数量让我很难仅仅根据时间来确定是哪个呼叫导致分配,因为有太多的事情在进行


有没有办法让JVM打印并记录庞大对象的类名?

我认为这不会有多大帮助,即使它存在。Java中的大多数对象都很小,只包含少数引用和原语。要真正需要一大块连续的内存,对象通常是一个数组。数组的类名通常不会提供太多信息,特别是如果它是一个隐藏在
ArrayList
中的数组,其中它被定义为
Object[]
。堆转储中是否有这些信息?但问题是什么?巨大的分配是一种正常现象。问题是,由于分配失败,堆变得支离破碎,然后完全GC启动,并在20-30秒内停止这一切。如果我能识别可疑名单,我可以尝试稍微优化代码。