我看到使用-Xmx2g时,峰值内存达到1G并进行主要收集(markweep collector).使用-Xmx3g,它达到1.5G并进行主要收藏.使用-Xmg4g,它达到2G并进行主要收集.但是,从这里我尝试将最大内存增加到6G,8G,12G,并且峰值内存达到2G的所有时间都会进行主要收集.
如何使用超过2G?我没有遇到任何设置.-Xms在这里有用吗?那些-Xmx,我做了-Xms的一半-Xmx.
我正在使用Jetty,Java 1.6.024.
更新:是的,我使用的是64位JVM.我正在使用的JVM选项是:-Xmx6g -Xms3g -XX:MaxPermSize = 256m我确定峰值内存的方法是查看JConsole中的内存图.它达到2G并下降(主要收集).旧Gen达到1.5G最大然后下降发生.
谢谢,Prams.
我们的Java应用程序(在Jetty 7.5.4上运行的Web应用程序)使用底层数据库.有多个数据库用户,Java部分需要使用这些数据库用户访问数据库.我想知道是否有一个数据库连接池库让我们可以访问具有多个数据库用户的数据库.我知道有一堆dbcp库可以让我们使用单个数据库用户,但是找不到任何支持多个数据库用户的库.
任何帮助表示赞赏,谢谢,Pram.
我将首先给出我们创建的对象的一些细节。并且会问一个问题(最后)。
我在 linux 上使用 64-but JVM。
我的 jvm 选项是:-Xmx6g -Xms3g -XX:MaxPermSize=256m
探查器 (jprofiler) 指出 2 个地方消耗大量内存:1) 这里每秒创建大约 4 个字符串(每个 110KB),并对每个字符串执行 StringUtils.replace。还执行了一些其他字符串分配等,但分析器清楚地表明 StringUtils.replace 是保存大部分内存的内容。2)在这里,每分钟创建一个包含 4 个对象(单个类)的对象(如果为 3.5MB,则保留大小)并(重新)放置到静态并发哈希图中(因此映射在任何时候都只包含 1 个对象)。父对象只有这 4 个子对象,没有别的。这 4 个对象中的每一个都包含 10K 个数组列表、10K 个日期和其他字符串等。我明确地将旧的父对象(我从 map.replace() 获得的那个)分配给 null 并明确地清除 (ArrayList.clear())数组列表,
内存行为是:内存使用量不断增加,并且一度发生主要收集(2GB)。次要收集 (700MB) 也大约每分钟发生一次。
问题:您是否认为 #1 实际上导致 eden 空间已满,因此 JVM 将 #2 中的对象推送到tenure 空间,因此内存使用量不断增加,直到发生主要收集?出于诊断目的,我将 #2 中的父对象更改为保留 500KB 的大小(小 7 倍,还有 1.4K 的 Date、ArrayList 等实例),但我仍然看到相同的内存行为。
我将选项更改为 -Xmx12g -Xms3g -XX:MaxPermSize=256m -XX:NewSize=8g 现在,我看到内存中 #2 中的对象数量较少,我看到保有权空间/老一代的增长较慢。现在可以快速收集 #2 中的那些对象,这很好,但是 CPU 使用率非常高,因为小收集现在很大(8G)并且每 2 分钟发生一次。
我的目标是快速收集所有对象(因此我没有看到内存使用量不断增加),但不会使次要集合太大。
关于我应该采取什么方法的任何建议?