学习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🚀
作者:二进制之路