JVM学习系列

JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的

JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的又名:Java虚拟机的内存模型(JMM)是什么样的.通过前面两篇文章的学习,我们知道了一个Java类的生命周期及类加载器。我们可以得到如下两幅图:类生命周期:父类委托机制:思考:我们编写的类中的变量、方法、对象这些都需要内存存放的。那么在运行时候这些数据在Java虚拟机内存中是怎么存放的呢?本文目标:凯哥(凯哥Java:kaigejav

JVM学习第三篇思考:一个Java类在Jvm内存中是怎么存在的

又名:Java虚拟机的内存模型(JMM)是什么样的.

通过前面两篇文章的学习,我们知道了一个Java类的生命周期及类加载器。我们可以得到如下两幅图:

类生命周期:

http://img2.mukewang.com/60de78e20001770708020352.jpg


父类委托机制:

http://img4.mukewang.com/60de78e20001591f07680439.jpg


思考:

http://img1.mukewang.com/60de78e30001e6ba06310413.jpg



我们编写的类中的变量、方法、对象这些都需要内存存放的。那么在运行时候这些数据在Java虚拟机内存中是怎么存放的呢?

本文目标:

凯哥(凯哥Java:kaigejava)希望通过本文学习,大家对Java虚拟机运行时数据区域有更深的了解

我们写的代码在JVM中是怎么存在的?

1:我们现在看看总体Java运行时数据模型:

http://img4.mukewang.com/60de78e30001af1e11280775.jpg



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

http://img2.mukewang.com/60de78e30001ebcf06000670.jpg



上面代码很简单,那么对应的变量、对象等在内存中都是怎么分配的呢?

2.1:方法区

注:在JDK1.8之后,方法区被元空间替换了。

方法区:用来存放的是类的信息、常量、静态变量等。该区域也是各个线程共享的内存区域。

根据Java虚拟机规范中的规定,当方法去无法满足内存分配的时候,会抛出:OutOfMemoryError异常的。

根据上面的 定义,我们可以知道比如我们JvmDemo.class信息、static string str=“jvmDemo”是在方法区存放的。

对应咱们代码,方法区存放的如下图:

http://img1.mukewang.com/60de78e30001a72e07290296.jpg



2.2:堆区

堆区是JVM所管理的内存中的最大的一块区域。该区域是所有线程共享的一块内存区域。该区域空间在虚拟机启动的时候就被创建了(-Xms的设置。后面凯哥(凯哥Java:kaigejava)也会详细讲解的)。

此区域的目的是存放对象实例的。几乎所有的对象实例都是在这里分配的。Java虚拟机规范中是这么描述的:所有的对象的实例以及数组都要在堆上分配。

堆区是垃圾收集器管理的主要区域(后面凯哥(凯哥Java

原创不易,完成人机校验,阅读全文

相关推荐