Java虚拟机一看就懂01

3次阅读

共计 758 个字符,预计需要花费 2 分钟才能阅读完成。

  1. 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 !

正文完
 0