32 个问题,学习 Java 虚拟机的运行时数据区

学习 JVM 虚拟机是一个比较枯燥无味的过程,刚开始基本是看不懂学不懂,然后就是似懂非懂,最后觉得好像懂了一些,到后来又觉得还是没懂,反正就是懵懵懂懂,过目就忘,一问就卡住,说也说不清,其实说的就是我自己。
我觉得在学习了相关理论知识之后,除了进行实操之外,通过提问和回答的方式,也能更好的理解所学知识,并检验自己是否真的理解了。
今天我们要学习的是 Java 虚拟机的运行时数据区,包括程序计数器(Program Counter Register)、Java虚拟机栈(Java Virtual Machine Stack)、本地方法栈(Native Method Stack)、堆(Heap)、方法区(Method Area)、运行时常量池(Run-Time Constant Pool)。
主要是基于 Java SE 8 的规范(The Java Virtual Machine Specification, Java SE 8 Edition)。
那么接下来,我们正式进入问答环节。
公共问题
- 哪些区域是线程共享的,什么时候创建与销毁? 
- 哪些区域是线程私有的,什么时候创建与销毁? 
- Java 虚拟机栈、堆和方法区使用的内存要保证是连续的吗? 
- 所有区域都会抛出 OutOfMemoryError? 
程序计数器
- 什么是程序计数器?有什么用? 
- 程序计数器对于 Java 方法和本地方法有区别吗? 
- 为什么每个线程要有一个程序计数器? 
Java 虚拟机栈和本地方法栈
- 两者有什么区别? 
- Java 虚拟机栈的作用是什么? 
- Java 虚拟机栈在何时抛出何种异常? 
- Java 虚拟机栈默认大小是多少?如何修改? 
- 栈帧是什么,什么时候创建与销毁? 
- 栈帧里面都装了什么内容? 
- 不同线程的栈帧之间可以互相引用吗? 
- 如何理解当前栈帧?方法相互调用如何影响栈帧? 
局部变量表
- 什么是局部变量表? 
- 局部变量表存储在哪里? 
- 本地方法栈是必须的吗? 
- 本地方法栈在何时抛出何种异常? 
Java 堆
- 堆的作用 
- 所有的对象实例真的都要在堆上分配吗? 
- 堆一般会怎么划分使用? 
- 为什么堆内存要进行划分? 
TALB
- TLAB 是什么? 
- TLAB 有什么作用? 
- TLAB 如何工作? 
方法区
- 什么是方法区,以及其作用? 
- 方法区进行垃圾回收的目的是什么? 
- 方法区就是永久代吗? 
- 使用永久代来实现方法区有缺点吗? 
运行时常量池
- 运行时常量池是什么? 
- 何时创建? 
- 在哪里分配? 
看完三件事❤️
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。 
- 关注公众号 『 java 烂猪皮 』,不定期分享原创知识。 
- 同时可以期待后续文章 ing🚀 
 
 作者:二进制之路
出处:https://club.perfma.com/article/302829












 
    
评论