一: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_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 6
2: istore_1
3: sipush -1000
6: istore_2
7: iload_1
8: iload_2
9: ixor
10: istore_1
11: iload_1
12: iload_2
13: ixor
14: istore_2
15: iload_1
16: iload_2
17: ixor
18: istore_1
19: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
22: iload_1
23: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
29: iload_2
30: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
33: iconst_3
34: newarray int
36: dup
37: iconst_0
38: iconst_3
39: iastore
40: dup
41: iconst_1
42: iconst_1
43: iastore
44: dup
45: iconst_2
46: bipush 100
48: iastore
49: astore_3
50: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
53: aload_3
54: iconst_0
55: iaload
56: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
59: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
62: aload_3
63: iconst_2
64: iaload
65: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
68: aload_3
69: iconst_0
70: iconst_0
71: invokestatic #4 // Method swap:([III)V
74: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
77: aload_3
78: iconst_0
79: iaload
80: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
83: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
86: aload_3
87: iconst_2
88: iaload
89: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
92: return
public static void swap(int[], int, int);
Code:
0: aload_0
1: iload_1
2: aload_0
3: iload_1
4: iaload
5: aload_0
6: iload_2
7: iaload
8: ixor
9: iastore
10: aload_0
11: iload_2
12: aload_0
13: iload_1
14: iaload
15: aload_0
16: iload_2
17: iaload
18: ixor
19: iastore
20: aload_0
21: iload_1
22: aload_0
23: iload_1
24: iaload
25: aload_0
26: iload_2
27: iaload
28: ixor
29: iastore
30: 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 对内存监控