jmap命令

jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM中的heap,以二进制输出文本。
打印出某个java进程(使用pid)内存内的,所有’对象’的情况(如:产生哪些对象,及其数量)

采用springboot来试验

步骤1:打包springboot
步骤2:上传到linux,然后执行java -jar -Xms512m -Xmx512m app.jar
image.png
打开另外一个窗口
image.png

  1. [root@iZ8vb4nxo286g9whbamf57Z app]# jmap -heap 23894
  2. Attaching to process ID 23894, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 25.131-b11
  6. using thread-local object allocation.
  7. Mark Sweep Compact GC #采用标记-清除-压缩的GC算法
  8. Heap Configuration:
  9. MinHeapFreeRatio = 40 #JVM最小空闲比率 可由-XX:MinHeapFreeRatio=<n>参数设置, jvm heap 在使用率小于 n 时 ,heap 进行收缩
  10. MaxHeapFreeRatio = 70 #JVM最大空闲比率 可由-XX:MaxHeapFreeRatio=<n>参数设置, jvm heap 在使用率大于 n 时 ,heap 进行扩张
  11. MaxHeapSize = 536870912 (512.0MB) #JVM堆的最大大小 可由-XX:MaxHeapSize=<n>参数设置
  12. NewSize = 178913280 (170.625MB) #JVM新生代的默认大小 可由-XX:NewSize=<n>参数设置
  13. MaxNewSize = 178913280 (170.625MB) #JVM新生代的最大大小 可由-XX:MaxNewSize=<n>参数设置
  14. OldSize = 357957632 (341.375MB) #JVM老生代的默认大小 可由-XX:OldSize=<n>参数设置
  15. NewRatio = 2 #新生代:老生代(的大小)=1:2
  16. 可由-XX:NewRatio=<n>参数指定New GenerationOld Generation heap size的比例
  17. SurvivorRatio = 8 #survivor:eden = 1:8,即survivor space是新生代大小的1/(8+2)
  18. [因为有两个survivor区域] 可由-XX:SurvivorRatio=<n>参数设置
  19. MetaspaceSize = 21807104 (20.796875MB) #元空间的默认大小,超过此值就会触发Full GC 可由-XX:MetaspaceSize=<n>参数设置
  20. CompressedClassSpaceSize = 1073741824 (1024.0MB) #类指针压缩空间的默认大小 可由-XX:CompressedClassSpaceSize=<n>参数设置
  21. MaxMetaspaceSize = 17592186044415 MB #元空间的最大大小 可由-XX:MaxMetaspaceSize=<n>参数设置
  22. G1HeapRegionSize = 0 (0.0MB) #使用G1垃圾收集器的时候,堆被分割的大小 可由-XX:G1HeapRegionSize=<n>参数设置
  23. Heap Usage:
  24. New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含eden区 和 Survivor区
  25. capacity = 161021952 (153.5625MB)
  26. used = 72713528 (69.34502410888672MB)
  27. free = 88308424 (84.21747589111328MB)
  28. 45.15752485723189% used
  29. Eden Space: #Eden区内存
  30. capacity = 143130624 (136.5MB)
  31. used = 65191968 (62.171905517578125MB)
  32. free = 77938656 (74.32809448242188MB)
  33. 45.54718352936126% used
  34. From Space: #Survivor区的from内存
  35. capacity = 17891328 (17.0625MB)
  36. used = 7521560 (7.173118591308594MB)
  37. free = 10369768 (9.889381408691406MB)
  38. 42.04025548019688% used
  39. To Space: #Survivor区的to内存
  40. capacity = 17891328 (17.0625MB)
  41. used = 0 (0.0MB)
  42. free = 17891328 (17.0625MB)
  43. 0.0% used
  44. tenured generation: #老生代区内存分布
  45. capacity = 357957632 (341.375MB)
  46. used = 6921632 (6.600982666015625MB)
  47. free = 351036000 (334.7740173339844MB)
  48. 1.9336455997116442% used
  49. 11898 interned Strings occupying 1024104 bytes.

image.png

总结

java的堆是按照 垃圾收集器设计的。目前主流的垃圾收集器G1
芬待设计的垃圾收集器主要是CMS,G1。
堆的分代设计,就是把一块内存划分为多块。
堆的内存空间分配主要分为2块,年轻代和老年代。
年轻代和老年代的比例是1:2,可采用-XX:NewRatio=来调节设置
年轻代分为Eden和Survivor From、Survivor To的大小比例是8:1:1,可采用-XX:SurvivorRatio=来调节设置。