一:JDK体系结构

image.png

二:Java语言的跨平台性

参考提供统一的接口,底层是以不同的实现的设计方式,去做系统设计
image.png

三:JVM整体结构以及内存模型

Oracle官网文档地址:
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
Jvm包含三个部分

  1. 类装载系统 (c++,c 实现)
  2. 运行时数据局(内存模型)

堆:年老代 2/3
年轻代:1/3
eden: 8
s0: 1
s1: 1
栈:线程栈,各个线程栈在内存上是同级的,
栈帧:一个方法对应一块栈帧内存区域
局部变量表
操作数栈
动态链接
方法出口
本地方法栈 :native 修饰的方法 (c++,c实现)
方法区
常量池
静态变量
类信息
程序计数器

  1. 字节码执行引擎(c++,c实现)

先触发 minor gc , 再 触发 full gc ,最后 报oom
触发mionr gc 条件: s1或s0达到阈值
触发full gc的条件:老年代达到阈值,或方法区达到阈值
触发oom 条件:fullGc 后老年代仍然不足

1647524292(1).png
jvm图示如下
image.png

四:字节码反汇编以及相应指令

对class字节码经常反汇编
javap -c Test.class > Test.txt

  1. Compiled from "Test.java"
  2. public class com.sean.learn.sort.class01.Test {
  3. public com.sean.learn.sort.class01.Test();
  4. Code:
  5. 0: aload_0
  6. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  7. 4: return
  8. public static void main(java.lang.String[]);
  9. Code:
  10. 0: bipush 6
  11. 2: istore_1
  12. 3: sipush -1000
  13. 6: istore_2
  14. 7: iload_1
  15. 8: iload_2
  16. 9: ixor
  17. 10: istore_1
  18. 11: iload_1
  19. 12: iload_2
  20. 13: ixor
  21. 14: istore_2
  22. 15: iload_1
  23. 16: iload_2
  24. 17: ixor
  25. 18: istore_1
  26. 19: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  27. 22: iload_1
  28. 23: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  29. 26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  30. 29: iload_2
  31. 30: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  32. 33: iconst_3
  33. 34: newarray int
  34. 36: dup
  35. 37: iconst_0
  36. 38: iconst_3
  37. 39: iastore
  38. 40: dup
  39. 41: iconst_1
  40. 42: iconst_1
  41. 43: iastore
  42. 44: dup
  43. 45: iconst_2
  44. 46: bipush 100
  45. 48: iastore
  46. 49: astore_3
  47. 50: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  48. 53: aload_3
  49. 54: iconst_0
  50. 55: iaload
  51. 56: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  52. 59: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  53. 62: aload_3
  54. 63: iconst_2
  55. 64: iaload
  56. 65: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  57. 68: aload_3
  58. 69: iconst_0
  59. 70: iconst_0
  60. 71: invokestatic #4 // Method swap:([III)V
  61. 74: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  62. 77: aload_3
  63. 78: iconst_0
  64. 79: iaload
  65. 80: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  66. 83: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
  67. 86: aload_3
  68. 87: iconst_2
  69. 88: iaload
  70. 89: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
  71. 92: return
  72. public static void swap(int[], int, int);
  73. Code:
  74. 0: aload_0
  75. 1: iload_1
  76. 2: aload_0
  77. 3: iload_1
  78. 4: iaload
  79. 5: aload_0
  80. 6: iload_2
  81. 7: iaload
  82. 8: ixor
  83. 9: iastore
  84. 10: aload_0
  85. 11: iload_2
  86. 12: aload_0
  87. 13: iload_1
  88. 14: iaload
  89. 15: aload_0
  90. 16: iload_2
  91. 17: iaload
  92. 18: ixor
  93. 19: iastore
  94. 20: aload_0
  95. 21: iload_1
  96. 22: aload_0
  97. 23: iload_1
  98. 24: iaload
  99. 25: aload_0
  100. 26: iload_2
  101. 27: iaload
  102. 28: ixor
  103. 29: iastore
  104. 30: return
  105. }

jvm指令手册
参考:https://www.cnblogs.com/lsy131479/p/11201241.html

五:JVM内存参数设置

-Xss: 每个栈的大小,默认1M,实际不需要这么大,可以减小大小,对线程有一定的影响
-Xms: 堆的初始大小 ,默认 物理内存的1/64
-Xmx:堆的最大可用大小,默认物理内存的1/4
-Xmn:新生代大小
-XX:NewRatio 默认 2 ,表示新生代占老年的 1/2,整个堆内存的1/3
-XX:SurvivorRatio:默认8: 一个s区占 eden的1/8
-XX:MetaspaceSize: 触发fullGc 的阈值,默认21M,会动态伸缩,建议指定,
-XX:MaxMetaspaceSize: 元空间最大内存,默认-1,只受限于本地内存大小
-XX:-UseAdaptiveSizePolicy 禁用Survivor区自适应策略
-XX:TargetSurvivorRatio=80Survivor区对象使用率80%,默认是50%
full Gc 会触发 STW,
jvm 调优:目的是减少fullGc, 减少full gc 带来的STW对应于带来的影响
让对象尽可能在新生代里分配,回收
尽量不要太多的对象频繁进去老年代,
避免老年代的GC
尽可能给足够的内存,避免新生代频繁

Spring boot 设置JVM参数格式:

java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar microservice-eureka-server.jar

jvisualvm 对内存监控

参考:https://note.youdao.com/ynoteshare/index.html?id=ad3d29fc27ff8bd44e9a2448d3e2706d&type=note&_time=1645333790052