其他
图文并茂,傻瓜都能看懂的 JVM 内存布局
Java技术栈
www.javastack.cn
优秀的Java技术公众号
JVM 内存区域概览 堆区的空间分配是怎么样?堆溢出的演示 创建一个新对象内存是怎么分配的? 方法区 到 Metaspace 元空间 栈帧是什么?栈帧里有什么?怎么理解? 本地方法栈 程序计数器 Code Cache 是什么?
概念
Heap (堆区)
延伸知识点:JIT 编译优化中的一部分内容 - 逃逸分析。推荐阅读:面试问我 Java 逃逸分析,瞬间被秒杀了。
2. 堆区的调整
3. 堆的默认空间分配
java -XX:+PrintFlagsFinal -version
输出
>java -XX:+PrintFlagsFinal -version
[Global flags]
...
uintx InitialSurvivorRatio = 8
uintx NewRatio = 2
...
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
参数解释
4. 堆溢出演示
/**
* VM Args:-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
* @author Richard_Yi
*/
public class HeapOOMTest {
public static final int _1MB = 1024 * 1024;
public static void main(String[] args) {
List<byte[]> byteList = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
byte[] bytes = new byte[2 * _1MB];
byteList.add(bytes);
}
}
}
输出
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid32372.hprof ...
Heap dump file created [7774077 bytes in 0.009 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at jvm.HeapOOMTest.main(HeapOOMTest.java:18)
创建一个新对象内存分配流程
Metaspace 元空间
In JDK 8, classes metadata is now stored in the native heap and this space is called Metaspace.
延伸阅读:关于 Metaspace 比较好的两篇文章Metaspace in Java 8http://lovestblog.cn/blog/2016/10/29/metaspace/
Java 虚拟机栈
栈对应线程,栈帧对应方法
1. 局部变量表
局部变量表就是存放方法参数和方法内部定义的局部变量的区域。
public int test(int a, int b) {
Object obj = new Object();
return a + b;
}
2. 操作栈
/**
* @author Richard_yyf
*/
public class OperandStackTest {
public int sum(int a, int b) {
return a + b;
}
}
> javac OperandStackTest.java
> javap -v OperandStackTest.class > 1.txt
public int sum(int, int);
descriptor: (II)I
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3 // 最大栈深度为2 局部变量个数为3
0: iload_1 // 局部变量1 压栈
1: iload_2 // 局部变量2 压栈
2: iadd // 栈顶两个元素相加,计算结果压栈
3: ireturn
LineNumberTable:
line 10: 0
3. 动态连接
4. 方法返回地址
正常退出,即正常执行到任何方法的返回字节码指令,如 RETURN、IRETURN、ARETURN 等 异常退出
返回值压入上层调用栈帧 异常信息抛给能够处理的栈帧 PC 计数器指向方法调用后的下一条指令
本地方法栈
程序计数器
直接内存
Code Cache
诊断选项
参考:
《深入理解Java虚拟机》 - 周志明《码出高效》Metaspace in Java 8JVM机器指令集图解:Introduction to JVM Code Cache
END
学习资料:
最近热文:
Spring干货:
点击「阅读原文」带你飞~