JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的
Java类运行时数据存放在五个区域:方法区存放类信息、常量和静态变量(JDK1.8后由元空间替换);堆区存放new出来的对象实例和数组;程序计数器、虚拟机栈、本地方法栈为线程私有。程序计数器是JVM中唯一不会抛出OutOfMemoryError的区域。
- 方法区存放类信息、常量、静态变量,JDK1.8之后被元空间替换。
- 堆是JVM管理的最大内存区域,几乎所有对象实例和数组都在堆上分配。
- 程序计数器记录当前线程执行的字节码行号,执行Native方法时值为undefined。
- 虚拟机栈中每个方法对应一个栈帧,存放局部变量表、操作栈、动态链接。
- 方法区、堆区线程共享,虚拟机栈、程序计数器、本地方法栈线程私有。
JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的
又名:Java虚拟机的内存模型(JMM)是什么样的.
通过前面两篇文章的学习,我们知道了一个Java类的生命周期及类加载器。我们可以得到如下两幅图:
类生命周期:

父类委托机制:

思考:

我们编写的类中的变量、方法、对象这些都需要内存存放的。那么在运行时候这些数据在Java虚拟机内存中是怎么存放的呢?
本文目标:
凯哥(凯哥Java:kaigejava)希望通过本文学习,大家对Java虚拟机运行时数据区域有更深的了解
我们写的代码在JVM中是怎么存在的?
1:我们现在看看总体Java运行时数据模型:

2:我们来看看下面这段代码,执行的时候,在JVM中数据存放:

上面代码很简单,那么对应的变量、对象等在内存中都是怎么分配的呢?
2.1:方法区
注:在JDK1.8之后,方法区被元空间替换了。
方法区:用来存放的是类的信息、常量、静态变量等。该区域也是各个线程共享的内存区域。
根据Java虚拟机规范中的规定,当方法去无法满足内存分配的时候,会抛出:OutOfMemoryError异常的。
根据上面的 定义,我们可以知道比如我们JvmDemo.class信息、static string str=“jvmDemo”是在方法区存放的。
对应咱们代码,方法区存放的如下图:

2.2:堆区
堆区是JVM所管理的内存中的最大的一块区域。该区域是所有线程共享的一块内存区域。该区域空间在虚拟机启动的时候就被创建了(-Xms的设置。后面凯哥(凯哥Java:kaigejava)也会详细讲解的)。
此区域的目的是存放对象实例的。几乎所有的对象实例都是在这里分配的。Java虚拟机规范中是这么描述的:所有的对象的实例以及数组都要在堆上分配。
堆区是垃圾收集器管理的主要区域(后面凯哥(凯哥Java
原创不易,完成人机校验,阅读全文
常见问题
new出来的对象存放在JVM哪个区域?
存放在堆区。堆是所有线程共享的内存区域,虚拟机启动时创建,是垃圾收集器管理的主要区域;堆无法扩展且分配失败时会抛出OutOfMemoryError。
哪些JVM内存区域是线程私有的?
虚拟机栈、程序计数器和本地方法栈是线程私有的,生命周期与线程一致;方法区和堆区是所有线程共享的内存区域。