我最近在我的JVM中得到了一些OutOfMemoryExceptions,并决定开始使用MAT分析我的堆转储,看看我是否可以查明哪些线程占用了大部分内存。
有趣的是,我正在查看系统中的所有线程,并看到所有线程的总保留堆大约是4.8G。但是,我的JVM的最大堆大小设置为10G。我可以关联我的堆转储是10G文件。
怎么可能?我的总保留大小是否需要接近10G限制才能生成OOM?我在这里误解了什么吗?
根据概览标签:
Size: 6.6 GB Classes: 15.7k Objects: 164.1m Class Loader: 690
确切的错误消息是:
java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space
at business.service.AuditImportHelper.importAuditStream(AuditImportHelper.java:580)
at business.service.AuditImportHelper.importAuditTrailFiles(AuditImportHelper.java:372)
at business.service.AuditImportHelper.doImport(AuditImportHelper.java:171)
....
....
....
at org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:170)
at org.jboss.mq.SpySession.run(SpySession.java:323)
at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:237)
at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:204)
at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:275)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:743)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535)
at java.lang.StringBuffer.append(StringBuffer.java:322)
at java.io.BufferedReader.readLine(BufferedReader.java:363)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at business.service.AuditImportHelper.importAuditStream(AuditImportHelper.java:457)
at business.service.AuditImportHelper.importAuditTrailFiles(AuditImportHelper.java:372)
我可以在我的堆转储中看到它试图复制的数组(char [])相当大(1G)。在尝试执行copyOf
时,JVM是否预先分配整个空间,还是按元素元素完成?
我正在尝试将哪些参数传递给copyOf()
方法,但不确定是否/如何在MAT中查看这些参数。有没有办法在线程视图中看到MAT中调用的方法的参数,还是其他?