jmap命令
jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM中的heap,以二进制输出文本。
打印出某个java进程(使用pid)内存内的,所有’对象’的情况(如:产生哪些对象,及其数量)
采用springboot来试验
步骤1:打包springboot
步骤2:上传到linux,然后执行java -jar -Xms512m -Xmx512m app.jar
打开另外一个窗口
[root@iZ8vb4nxo286g9whbamf57Z app]# jmap -heap 23894Attaching to process ID 23894, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.131-b11using thread-local object allocation.Mark Sweep Compact GC #采用标记-清除-压缩的GC算法Heap Configuration:MinHeapFreeRatio = 40 #JVM最小空闲比率 可由-XX:MinHeapFreeRatio=<n>参数设置, jvm heap 在使用率小于 n 时 ,heap 进行收缩MaxHeapFreeRatio = 70 #JVM最大空闲比率 可由-XX:MaxHeapFreeRatio=<n>参数设置, jvm heap 在使用率大于 n 时 ,heap 进行扩张MaxHeapSize = 536870912 (512.0MB) #JVM堆的最大大小 可由-XX:MaxHeapSize=<n>参数设置NewSize = 178913280 (170.625MB) #JVM新生代的默认大小 可由-XX:NewSize=<n>参数设置MaxNewSize = 178913280 (170.625MB) #JVM新生代的最大大小 可由-XX:MaxNewSize=<n>参数设置OldSize = 357957632 (341.375MB) #JVM老生代的默认大小 可由-XX:OldSize=<n>参数设置NewRatio = 2 #新生代:老生代(的大小)=1:2可由-XX:NewRatio=<n>参数指定New Generation与Old Generation heap size的比例SurvivorRatio = 8 #survivor:eden = 1:8,即survivor space是新生代大小的1/(8+2)[因为有两个survivor区域] 可由-XX:SurvivorRatio=<n>参数设置MetaspaceSize = 21807104 (20.796875MB) #元空间的默认大小,超过此值就会触发Full GC 可由-XX:MetaspaceSize=<n>参数设置CompressedClassSpaceSize = 1073741824 (1024.0MB) #类指针压缩空间的默认大小 可由-XX:CompressedClassSpaceSize=<n>参数设置MaxMetaspaceSize = 17592186044415 MB #元空间的最大大小 可由-XX:MaxMetaspaceSize=<n>参数设置G1HeapRegionSize = 0 (0.0MB) #使用G1垃圾收集器的时候,堆被分割的大小 可由-XX:G1HeapRegionSize=<n>参数设置Heap Usage:New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含eden区 和 Survivor区capacity = 161021952 (153.5625MB)used = 72713528 (69.34502410888672MB)free = 88308424 (84.21747589111328MB)45.15752485723189% usedEden Space: #Eden区内存capacity = 143130624 (136.5MB)used = 65191968 (62.171905517578125MB)free = 77938656 (74.32809448242188MB)45.54718352936126% usedFrom Space: #Survivor区的from内存capacity = 17891328 (17.0625MB)used = 7521560 (7.173118591308594MB)free = 10369768 (9.889381408691406MB)42.04025548019688% usedTo Space: #Survivor区的to内存capacity = 17891328 (17.0625MB)used = 0 (0.0MB)free = 17891328 (17.0625MB)0.0% usedtenured generation: #老生代区内存分布capacity = 357957632 (341.375MB)used = 6921632 (6.600982666015625MB)free = 351036000 (334.7740173339844MB)1.9336455997116442% used11898 interned Strings occupying 1024104 bytes.
总结
java的堆是按照 垃圾收集器设计的。目前主流的垃圾收集器G1
芬待设计的垃圾收集器主要是CMS,G1。
堆的分代设计,就是把一块内存划分为多块。
堆的内存空间分配主要分为2块,年轻代和老年代。
年轻代和老年代的比例是1:2,可采用-XX:NewRatio=
年轻代分为Eden和Survivor From、Survivor To的大小比例是8:1:1,可采用-XX:SurvivorRatio=
