Java 需要对明显的堆大小减少进行解释吗

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日志中可以看出,堆大小似乎在一段时间后在年轻一代和老一代之间逐渐减小

下面是日志中的三个条目

{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)

}


{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指定的最小堆大小)将内存释放回操作系统

如果将来您的应用程序实际需要使用更多堆内存,则