JVM内存模型解析

栏目: Java · 发布时间: 6年前

内容简介:JVM内存模型解析

JVM内存模型可以分为两个部分,如下图所示,堆和方法区是所有线程共有的,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。下面我们就来一一分析一下这些不同区域的作用。

JVM内存模型解析

堆内存

堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。下图中的 Perm 代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代也将被移除。

JVM内存模型解析

GC(垃圾回收器)对年轻代中的对象进行回收被称为 Minor GC ,用通俗一点的话说年轻代就是用来存放的年轻的对象,年轻对象是什么意思呢?年轻对象可以简单的理解为没有经历过多次垃圾回收的对象,如果一个对象经历过了一定次数的 Minor GC ,JVM一般就会将这个对象放入到年老代,而VM对年老代的对象的回收则称为 Major GC

如上图所示,年轻代中还可以细分为三个部分,我们需要重点关注这几点:

  1. 大部分对象刚创建的时候,JVM会将其分布到 Eden 区域。
  2. Eden 区域中的对象达到一定的数目的时候,就会进行 Minor GC ,经历这次垃圾回收后所有存活的对象都会进入两个 Suvivor Place 中的一个。
  3. 同一时刻两个 Suvivor Place ,即 s1s2 中总有一个总是空的。
  4. 年轻代中的对象经历过了多次的垃圾回收就会转移到年老代中。

对于永久代的描述,虽然在jdk1.8之后将不再存在,但是我们还是稍微了解一下,直接引用官方文档中的一段描述,可以得知永久代中主要存放的是JVM自身所需要的一些额外的关于对象的信息。

The permanent generation is special because it holds data needed by the virtual machine to describe objects that do not have an equivalence at the Java language level. For example objects describing classes and methods are stored in the permanent generation.

方法区

方法区与 Java 堆一样,是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译(JIT)后的代码等数据。

对于JDK1.8之前的HotSpot虚拟机而言,很多人经常将方法区成为我们上图中所描述的永久代,实际上两者并不等价,因为这仅仅是HotSpot的设计团队选择利用永久代来实现方法区而言。同时对于其他虚拟机比如IBM J9中是不存在永久代的概念的。

常量池其实是方法区中的一部分,因为这里比较重要,所以我们拿出来单独看一下。注意我们这里所说的运行时的常量池并仅仅是指Class文件中的常量池,因为JVM可能会进行即时编译进行优化,在运行时将部分常量载入到常量池中。

程序计算器

JVM中的程序计算器和计算机组成原理中提到的程序计算器PC概念类似,是线程私有的,用来记录当前执行的字节码位置。还是稍微解释一下吧,CPU的占有时间是以分片的形式分配给给每个不同线程的,从操作系统的角度来讲,在不同线程之间切换的时候就是依赖程序计数器来记录上一次线程所执行到具体的代码的行数,在JVM就是字节码。

Java虚拟机栈

与程序计数器一样,Java虚拟机栈也是线程私有的,用通俗的话将它就是我们常常听说到堆栈中的那个“栈内存”。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表(局部变量表需要的内存在编译期间就确定了所以在方法运行期间不会改变大小。

),操作数栈,动态链接,方法出口等信息。每一个方法从调用至出栈的过程,就对应着栈帧在虚拟机中从入栈到出栈的过程。p.s: 关于栈帧这里我们以后讲虚拟机字节码执行引擎的时候再来仔细分析。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript DOM高级程序设计

JavaScript DOM高级程序设计

Jeffrey Sambells、Aaron Gustafson / 李松峰、李雅雯 / 人民邮电出版社 / 2008-7 / 59.00元

本书注重理论与实践的结合,全面讲述高级的DOM 脚本编程。全书分为3 个部分:第一部分“深入理解DOM 脚本编程”,涉及W3C DOM 规范的各方面,包括非标准的浏览器支持和不支持的内容;第二部分“浏览器外部通信”,以Ajax 和客户端—服务器端通信为主题;第三部分“部分高级脚本编程资源”,集中介绍了一批第三方脚本编程资源,包括库和API。同时,每部分的最后一章都为案例研究,将学到的内容应用于实践......一起来看看 《JavaScript DOM高级程序设计》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试