点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
The worst part of life is waiting. The best part of life is having someone worth waiting for.
生命中最糟糕的部分是等待,而最美好的部分则是有一个值得等的人。
每日掏心话
人活得糊涂一点挺好,我不太想去知道别人背后是怎么评价我的,人们内心的真实想法总会毫不留情的戳伤你,不要意外,这很正常,不是因为你不好,只是大多数人都会在背后放大你的缺点。
来自:Richard_Yi | 责编:乐乐
链接:segmentfault.com/a/1190000021424972
程序员小乐(ID:study_tech)第 771 次推文 图片来自 Pexels
往日回顾:“拐点还得要几天!”钟南山最新疫情预判,送你一组钟老表情包
正文
本 JVM 系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握 JVM 相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习 JVM 知识,还是需要去阅读专业的书籍和文档。
JVM 内存区域概览
堆区的空间分配是怎么样?堆溢出的演示
创建一个新对象内存是怎么分配的?
方法区 到 Metaspace 元空间
栈帧是什么?栈帧里有什么?怎么理解?
本地方法栈
程序计数器
Code Cache 是什么?
推荐阅读:深入理解Java中的逃逸分析 hollischuang.com/archives/2583
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)
/**
* 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 spaceDumping 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)
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/
栈对应线程,栈帧对应方法
局部变量表就是存放方法参数和方法内部定义的局部变量的区域。
public int test(int a, int b) { Object obj = new Object(); return a + b;}
/** * @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
简而言之, JVM 代码缓存是 JVM 将其字节码存储为本机代码的区域 。我们将可执行本机代码的每个块称为 nmethod。该 nmethod 可能是一个完整的或内联 Java 方法。
参考:《深入理解Java虚拟机》 - 周志明《码出高效》Metaspace in Java 8JVM机器指令集图解:Introduction to JVM Code Cache
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。
欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
Spring 体系常用项目一览
性能优化:要2个月才跑完的程序我是如何优化到到4小时的?
2020 年最棒的 9 个 Java 框架,哪个最香?
文章有问题?点此查看未经处理的缓存