Java虚拟机一看就懂01
2019-08-27 本文已影响0人
西瓜汁and柠檬水
-
Jvm内存结构
图片
线程隔离区域说明:
1.1、程序计数器
- 线程私有
- 是一块内存空间
- 唯一的一个在Java虚拟机规范中没有规定任何OOM情况的区域(不会OOM?)
1.2、Java虚拟机栈
- 线程私有
- 声明周期与线程相同
- 在Java虚拟机规范中规定两种异常状况:
1、线程的栈深度大于虚拟机所允许,抛出StackOverflowError异常;
2、如果虚拟机栈可以动态扩展,当扩展到无法申请足够的内存,抛出OOM
PS:每一个方法在执行的同时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用到完成,就对应着一个栈帧从入栈到出栈的过程
1.3、本地方法栈
- 线程私有
- 声明周期与线程相同
- 在Java虚拟机规范中规定两种异常状况:
1、线程的栈深度大于虚拟机所允许,抛出StackOverflowError异常;
2、如果虚拟机栈可以动态扩展,当扩展到无法申请足够的内存,抛出OOM
PS:可以看出本地方法栈和Java虚拟机栈的特征基本一致。
区别是:Java虚拟机栈为执行Java方法服务,而本地方法栈为Native方法服务。
线程共享区域说明:
1.4、Java堆
- 线程共享
- 存放对象实例
- 虚拟机内存中最大的一块
- 逻辑连续,物理不需要连续
- 存在OOM
- 是Java垃圾回收主要的区域
1.5、方法区
- 线程共享
- 存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码
- ≈永久代(Permanent Generation)本质不等价
- 不需要连续内存
- 存在垃圾回收,但是回收区域仅限于常量池和类型的卸载
- 存在OOM
好了,第一部分就这么讲完了,其实就这么些内容,后面会继续深入,慢慢来,不急不难
其实很多时候,我们只需要鱼,而不是渔,呐,给你鱼。
关注公众号 watermelon_code 获取第一手的满足~
TO BE CONTINUE !