Java 需要对明显的堆大小减少进行解释吗
从GC日志中可以看出,堆大小似乎在一段时间后在年轻一代和老一代之间逐渐减小 下面是日志中的三个条目 {gc调用前的堆=5: PSYoungGen总计44800K,使用44180K[0x18220000、0x1b420000、0x24a20000) eden空间38400K,100%使用[0x18220000,0x1a7a0000,0x1a7a0000) 从空间6400K开始,90%已使用[0x1ade0000,0x1b3853c8,0x1b420000) 到空间6400K,使用了0%[0x1a7a0000,0x1a7a0000,0x1ade0000) PSOldGen总计51200K,使用16K[0x0ba20000、0x0ec20000、0x18220000) 对象空间51200K,已使用0%[0x0ba20000,0x0ba24128,0x0ec20000) PSPermGen总计32768K,使用12417K[0x03a20000、0x05a20000、0x0ba20000) 对象空间32768K,已使用37%[0x03a20000,0x046406c0,0x05a20000) 1047.599:[GC[PSYoungGen:44180K->5990K(44032K)]44197K->6006K(95232K),0.0046671秒] gc调用后的堆=5: PSYoungGen总计44032K,使用5990K[0x18220000、0x1b5a0000、0x24a20000) 伊甸园空间37632K,0%已使用[0x18220000,0x18220000,0x1a6e0000) 从空间6400K开始,93%已使用[0x1a7a0000,0x1ad79990,0x1ade0000) 对于7552K空间,0%已使用[0x1ae40000,0x1ae40000,0x1b5a0000) PSOldGen总计51200K,使用16K[0x0ba20000、0x0ec20000、0x18220000) 对象空间51200K,已使用0%[0x0ba20000,0x0ba24128,0x0ec20000) PSPermGen总计32768K,使用12417K[0x03a20000、0x05a20000、0x0ba20000) 对象空间32768K,已使用37%[0x03a20000,0x046406c0,0x05a20000) }Java 需要对明显的堆大小减少进行解释吗,java,memory,garbage-collection,stack,heap,Java,Memory,Garbage Collection,Stack,Heap,从GC日志中可以看出,堆大小似乎在一段时间后在年轻一代和老一代之间逐渐减小 下面是日志中的三个条目 {gc调用前的堆=5: PSYoungGen总计44800K,使用44180K[0x18220000、0x1b420000、0x24a20000) eden空间38400K,100%使用[0x18220000,0x1a7a0000,0x1a7a0000) 从空间6400K开始,90%已使用[0x1ade0000,0x1b3853c8,0x1b420000) 到空间6400K,使用了0%[0x1a7
{gc调用前的堆=174: PSYoungGen总计9728K,使用9666K[0x18220000、0x18d30000、0x24a20000) 伊甸园空间8640K,99%已使用[0x18220000,0x18a8fa58,0x18a90000) 从空间1088K,94%已使用[0x18a90000,0x18b910f0,0x18ba0000) 对于空间1344K,使用了0%[0x18be0000,0x18be0000,0x18d30000) PSOldGen总计51200K,使用21113K[0x0ba20000、0x0ec20000、0x18220000) 对象空间51200K,41%已使用[0x0ba20000,0x0cebe540,0x0ec20000) PSPermGen总计32768K,使用12611K[0x03a20000、0x05a20000、0x0ba20000) 对象空间32768K,已使用38%[0x03a20000,0x04670fa0,0x05a20000) 26968.748:[GC[PSYoungGen:9666K->1271K(9920K)]30780K->22465K(61120K),0.0025274秒] gc调用后的堆=174: PSYoungGen总计9920K,使用1271K[0x18220000、0x18d50000、0x24a20000) 伊甸园空间8576K,0%已使用[0x18220000,0x18220000,0x18a80000) 从空间1344K开始,94%已使用[0x18be0000,0x18d1dd00,0x18d30000) 对于空间1408K,使用了0%[0x18a80000,0x18a80000,0x18be0000) PSOldGen总计51200K,使用量21194K[0x0ba20000、0x0ec20000、0x18220000) 对象空间51200K,41%已使用[0x0ba20000,0x0ced29e0,0x0ec20000) PSPermGen总计32768K,使用12611K[0x03a20000、0x05a20000、0x0ba20000) 对象空间32768K,已使用38%[0x03a20000,0x04670fa0,0x05a20000) }
{gc调用前的堆=23195: PSYoungGen总计1536K,使用1372K[0x18220000、0x18440000、0x24a20000) 伊甸园空间896K,100%使用[0x18220000,0x18300000,0x18300000) 从空间640K开始,74%已使用[0x183a0000,0x184173e8,0x18440000) 对于空间640K,使用了0%[0x18300000,0x18300000,0x183a0000) PSOldGen总计6272K,使用4627K[0x0ba20000、0x0C0400000、0x18220000) 对象空间6272K,73%已使用[0x0ba20000,0x0bea4d70,0x0c040000) PSPermGen总计32768K,使用量12930K[0x03a20000、0x05a20000、0x0ba20000) 对象空间32768K,已使用39%[0x03a20000,0x046c0aa0,0x05a20000) 71908.146:[GC[PSYoungGen:1372K->533K(1536K)]6000K->5423K(7808K),0.0107964秒] gc调用后的堆=23195: PSYoungGen总计1536K,使用533K[0x18220000、0x18460000、0x24a20000) 伊甸园空间896K,0%已使用[0x18220000,0x18220000,0x18300000) 从空间640K开始,83%已使用[0x18300000,0x18385438,0x183a0000) 到空间704K,使用了0%[0x183b0000,0x183b0000,0x18460000) PSOldGen总计6272K,使用4890K[0x0ba20000、0x0C0400000、0x18220000) 对象空间6272K,已使用77%[0x0ba20000,0x0bee6868,0x0c040000) PSPermGen总计32768K,使用量12930K[0x03a20000、0x05a20000、0x0ba20000) 对象空间32768K,已使用39%[0x03a20000,0x046c0aa0,0x05a20000) }
使用的(相关)JVM参数如下: -服务器 -Xms600m -Xss256k -XX:+UseParallelGC -XX:+PrintHeapAtGC -XX:+HEAPDUMPONAUTOFMEMORYERROR -Xloggc:verbose\u gc.log -Djavax.net.debug=none -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintClassHistogram -Xmx800m -XX:NewRatio=1 -XX:CompileThreshold=1500 -XX:PermSize=32m -XX:MaxPermSize=128m 当使用VisualVM观察到一个简单地创建了新线程的示例应用程序时,认为内存被太多线程占用的假设(基于堆栈内存不同于堆内存的理解)被证明是错误的(年轻的和终身的一代被填满了) 对这种行为有什么解释吗 更新#1: 更正和更新: 上面的示例应用程序还包括一个使用每个线程创建的数组对象。数组大小是总堆的一个非常小的部分。 这个问题在JDK1.5中可以观察到
-R实际上,这是JVM的正常行为。当JVM注意到您有一段时间没有使用当前分配的一些堆内存时,它会假定您的应用程序可以使用比您提供的更少的内存运行,并会在垃圾收集期间减少堆的总大小(但决不能低于使用-Xms指定的最小堆大小)将内存释放回操作系统 如果将来您的应用程序实际需要使用更多堆内存,则