一:JDK体系结构

二:Java语言的跨平台性
参考提供统一的接口,底层是以不同的实现的设计方式,去做系统设计
三:JVM整体结构以及内存模型
Oracle官网文档地址:
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
Jvm包含三个部分
- 类装载系统 (c++,c 实现)
- 运行时数据局(内存模型)
堆:年老代 2/3
年轻代:1/3
eden: 8
s0: 1
s1: 1
栈:线程栈,各个线程栈在内存上是同级的,
栈帧:一个方法对应一块栈帧内存区域
局部变量表
操作数栈
动态链接
方法出口
本地方法栈 :native 修饰的方法 (c++,c实现)
方法区
常量池
静态变量
类信息
程序计数器
- 字节码执行引擎(c++,c实现)
先触发 minor gc , 再 触发 full gc ,最后 报oom
触发mionr gc 条件: s1或s0达到阈值
触发full gc的条件:老年代达到阈值,或方法区达到阈值
触发oom 条件:fullGc 后老年代仍然不足
四:字节码反汇编以及相应指令
对class字节码经常反汇编javap -c Test.class > Test.txt
Compiled from "Test.java"public class com.sean.learn.sort.class01.Test {public com.sean.learn.sort.class01.Test();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: bipush 62: istore_13: sipush -10006: istore_27: iload_18: iload_29: ixor10: istore_111: iload_112: iload_213: ixor14: istore_215: iload_116: iload_217: ixor18: istore_119: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;22: iload_123: invokevirtual #3 // Method java/io/PrintStream.println:(I)V26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;29: iload_230: invokevirtual #3 // Method java/io/PrintStream.println:(I)V33: iconst_334: newarray int36: dup37: iconst_038: iconst_339: iastore40: dup41: iconst_142: iconst_143: iastore44: dup45: iconst_246: bipush 10048: iastore49: astore_350: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;53: aload_354: iconst_055: iaload56: invokevirtual #3 // Method java/io/PrintStream.println:(I)V59: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;62: aload_363: iconst_264: iaload65: invokevirtual #3 // Method java/io/PrintStream.println:(I)V68: aload_369: iconst_070: iconst_071: invokestatic #4 // Method swap:([III)V74: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;77: aload_378: iconst_079: iaload80: invokevirtual #3 // Method java/io/PrintStream.println:(I)V83: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;86: aload_387: iconst_288: iaload89: invokevirtual #3 // Method java/io/PrintStream.println:(I)V92: returnpublic static void swap(int[], int, int);Code:0: aload_01: iload_12: aload_03: iload_14: iaload5: aload_06: iload_27: iaload8: ixor9: iastore10: aload_011: iload_212: aload_013: iload_114: iaload15: aload_016: iload_217: iaload18: ixor19: iastore20: aload_021: iload_122: aload_023: iload_124: iaload25: aload_026: iload_227: iaload28: ixor29: iastore30: return}
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 对内存监控

