Tag:

无法访问的对象不是从堆中收集的垃圾

我在JVM堆(Java 1.7)中遇到了无法访问的对象。 正如你从图片中看到的那样(图片上的所有类都无法访问),我们有超过74%的对象没有参考,所以它应该被收集起来。 这个状态在我们的tomcat 7服务器上运行3周之后,只运行探测监控应用程序,tomcat管理器和我们的webapp,这可能是问题的根源。 我们的应用程序基于JSF 1.2,在客户端上保存状态,如下图所示 – 主要使用ViewSaveState的char数组。 当我从jVisualVM手动运行GC时,它会删除所有无法访问的对象,并且在堆达到其限制的3周之前一切正常。 如何清除某些物体? 我们的JVM参数 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=29001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= -Dorg.apache.el.parser.SKIP_IDENTIFIER_CHECK=true -Xms320m -Xmx2500m -XX:MaxPermSize=500m -XX:PermSize=96m -verbose:gc -Xloggc:/var/log/gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xdebug -Xrunjdwp:transport=dt_socket,address=1044,server=y,suspend=n -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC OutOfMemoryError的STACKTRACES 我认为原因隐藏在其他地方,堆栈跟踪来自app的不同部分。 可能存在一些泄漏,但堆栈跟踪仅报告最后一个组件,该组件在没有任何内存的情况下及时声明了一些内存。 java.lang.OutOfMemoryError: Java heap space at java.util.LinkedHashMap.createEntry(LinkedHashMap.java:442) at java.util.HashMap.addEntry(HashMap.java:888) at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:427) at java.util.HashMap.put(HashMap.java:509) at sun.util.resources.OpenListResourceBundle.loadLookup(OpenListResourceBundle.java:134) at sun.util.resources.OpenListResourceBundle.loadLookupTablesIfNecessary(OpenListResourceBundle.java:113) at sun.util.resources.OpenListResourceBundle.handleGetObject(OpenListResourceBundle.java:74) at sun.util.resources.TimeZoneNamesBundle.handleGetObject(TimeZoneNamesBundle.java:75) at java.util.ResourceBundle.getObject(ResourceBundle.java:389) […]

是否有可能在Java中有多个堆?

是否有可能在Java中有多个堆? 如果有可能那么它会在哪些情况下发生?

堆参数对GC /性能的影响?

大多数网上的地方,我得到关于堆参数的信息 -Xms set initial Java heap size -Xmx set maximum Java heap size 当我提到-Xms 512M -Xmx 2048M参数时,这是我的理解/问题, -Xms: –我的理解是如果我的java进程实际上只需要200M,提到-Xms 512M,java进程仍将只分配200M(实际内存需要)而不是500M。 但是如果我已经知道我的应用程序将在启动时使用这个512M内存,那么指定少于将会影响性能,因为无论如何堆块需要resize,这是昂贵的操作。 在与我的同事讨论时 ,默认情况下,GC将触发60%的Xms值。 那是对的吗 ? 如果是,是次要GC还是完全GC依赖于Xms值? 关于Xms的更新: –在读取JVM堆参数之后这似乎是真的,但默认情况下值是60%并且是依赖于Xms值的次要GC还是完整GC? -Xmx: –我的理解是提到-Xmx 2048M,java进程实际上是要从OS中保留2048M内存,因为另一个进程无法给它的共享。如果java进程无论如何都需要2048M以上的内存,那么内存不足将被抛出。 另外我认为在-Xmx的值上有一些Full GC触发器的关系。 因为我观察到的是当内存达到Xmx的70%时,Full GC发生在jconsole中。 那是对的吗? 配置: –我使用的是linux box(64位JVM 8)。 默认GC即并行GC

64位java不会分配超过2GB的堆内存

我正在从eclipse运行我的程序并使用64位java,但我仍然无法分配超过2GB的内存。 我正在运行一些基准,所以我需要大量的内存。 我在eclipse.ini中有这个:-Xmx8g 我希望它能用掉我所有的记忆。 这可能是因为32位版本的eclipse? 我不确定我对日食的看法。 我在运行程序时尝试将-Xmx8g发送到VMArgs。 我正在运行64位Windows 7和64位JRE。

在java中使用大字符串时StringBuilder内存不足错误

我从String test += str; test成倍增长,成千上万的角色。 运行需要45分钟,可能是因为创建了大字符串并删除了垃圾。 然后,我将这样的输入交错,使其达到30秒。 这似乎是廉价的方式,但它运作良好: if (secondDump.length() > 50) { intermedDump = intermedDump + secondDump; secondDump = “”; } if (intermedDump.length() > 100) { thirdDump = thirdDump + intermedDump; intermedDump = “”; } if (thirdDump.length() > 500) { fourthDump = fourthDump + thirdDump; thirdDump = “”; } if (fourthDump.length() > 1000) { […]

在运行时读取最大堆空间

众所周知, java -Xmx选项用于设置Java程序可用的最大堆空间。 但Java程序是否有办法读取已设置的值? 像System.getMaximumHeapSpace() (它不存在)之类的东西。

在生产系统上详细分析Tomcat Heap

在使用JMX控制台分析了在tomcat中运行的轻量级Web应用程序之后,事实certificate“PS Old Gen”正在缓慢但不变地增长。 它以200MB开始,每小时增长约80MB。 CPU不是问题,它平均运行在0-1%,但它在某处泄漏内存,因此在部署后几天它会变得不稳定。 我如何找出堆上分配的对象? 你知道有什么好的教程或工具吗?

删除()后,ConcurrentLinkedQueue $ Node保留在堆中

我有一个multithreading应用程序编写和读取ConcurrentLinkedQueue,它在概念上用于支持列表/表中的条目。 我最初为此使用了ConcurrentHashMap,效果很好。 需要跟踪订单条目的新要求,因此可以在最早的第一个订单中删除它们,具体取决于某些条件。 ConcurrentLinkedQueue似乎是一个不错的选择,function上它运作良好。 可配置数量的条目保存在内存中,当达到限制时提供新条目时,将以最早的顺序搜索队列以查找可以删除的队列。 系统不会删除某些条目并等待客户端交互。 似乎正在发生的事情是我在队列的前面有一个条目,比如100K条目之前。 队列似乎具有有限数量的已配置条目(size()== 100),但在分析时,我发现内存中有~100K ConcurrentLinkedQueue $ Node对象。 这似乎是设计上的,只是浏览了ConcurrentLinkedQueue的源代码,删除只删除对存储对象的引用,但留下链接列表进行迭代。 最后我的问题是:是否有一种“更好”的懒惰方式来处理这种性质的集合? 我喜欢ConcurrentLinkedQueue的速度,我无法承受在这种情况下似乎可能出现的无界泄漏。 如果没有,似乎我必须创建第二个结构来跟踪订单,可能有相同的问题,加上同步问题。

Java进程内存无限增长。 内存泄漏?

我们在Solaris 10上运行了一个java进程,为大约200-300个并发用户提供服务。 管理员报告说,进程使用的内存会随着时间的推移而显着增加。 它在几天内达到2GB并且永远不会停止增长。 我们已经使用Eclipse Memory Profiler转储堆并对其进行了分析,但是在那里看不到任何exception。 堆大小非常小。 添加内存统计日志记录后,我们发现在应用程序中,“管理员使用的”top“实用程序报告的内存使用量与MemoryMXBean和Runtime库报告的使用情况之间存在差异。 这是两者的输出。 Memory usage information From the Runtime library Free memory: 381MB Allocated memory: 74MB Max memory: 456MB Total free memory: 381MB From the MemoryMXBean library. Heap Committed: 136MB Heap Init: 64MB Heap Used: 74MB Heap Max: 456MB Non Heap Committed: 73MB Non Heap Init: 4MB Non […]

Java堆大小未完全使用

我正在使用Visual VM监视我正在运行的java应用程序: http : //visualvm.java.net/ 我用-Xmx128m强调内存使用量。 运行时我看到堆大小增加到128m(正如预期的那样)但是在遇到java堆空间错误之前,使用的堆收敛到大约105m。 为什么这些剩下20米,没用过?