JVM内存模型及分区

原创 2016年05月30日 23:43:12

Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间。
jvm管理的内存区域包括以下几个区域:
这里写图片描述

栈区:
栈分为java虚拟机栈和本地方法栈

  • 重点是Java虚拟机栈,它是线程私有的,生命周期与线程相同。
  • 每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态链接,方法出口等。每个方法从被调用,直到被执行完。对应着一个栈帧在虚拟机中从入栈到出栈的过程。
  • 通常说的栈就是指局部变量表部分,存放编译期间可知的8种基本数据类型,及对象引用和指令地址。局部变量表是在编译期间完成分配,当进入一个方法时,这个栈中的局部变量分配内存大小是确定的。
  • 会有两种异常StackOverFlowError和 OutOfMemoneyError。当线程请求栈深度大于虚拟机所允许的深度就会抛出StackOverFlowError错误;虚拟机栈动态扩展,当扩展无法申请到足够的内存空间时候,抛出OutOfMemoneyError。
  • 本地方法栈 为虚拟机使用到本地方法服务(native)

堆区:

  • 堆被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例
  • 堆区是gc的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为Eden区最要放新创建对象,From survivor 和 To survivor 保存gc后幸存下的对象,默认情况下各自占比 8:1:1。
    不过很多文章介绍分为3个区块,把方法区算着为永久代。这大概是基于Hotspot虚拟机划分, 然后比如IBM j9就不存在永久代概论。不管怎么分区,都是存放对象实例。
  • 会有异常OutOfMemoneyError

方法区:

  • 被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被Java虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代(permanment generation)
  • 垃圾回收很少光顾这个区域,不过也是需要回收的,主要针对常量池回收,类型卸载。
  • 常量池用于存放编译期生成的各种字节码和符号引用,常量池具有一定的动态性,里面可以存放编译期生成的常量;运行期间的常量也可以添加进入常量池中,比如string的intern()方法。

程序计数器

  • 当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。
  • Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线程切换能恢复到正确的位置,每条线程都需要一个独立的程序计数器,所以它是线程私有的。
  • 唯一一块Java虚拟机没有规定任何OutofMemoryError的区块

jvm分区大致就这个块,具体里面还有很多细节,及其各个模块工作的算法都很复杂,这里只是对分区进行简单介绍,掌握一些基本的知识点。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JVM内存模型

JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁。 程序计数器 ...

聊聊jvm内存模型及垃圾回收算法

jvm内存模型 1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代)Tenured(年老代)永久代(Perm)  其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:...

JVM初探 -JVM内存模型

JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时间研读了几本评价较高的JVM入门书籍, 算是总结...

JVM虚拟机内存模型

java虚拟机运行时内存主要包括:程序计数器、虚拟机栈、本地方法栈、java堆、方法区(包含运行时方法区)以及直接内存几个部分。 下面分别介绍几个部分: 1.  程序计数器(Program Count...

JVM内存模型及垃圾回收算法

JVM内存模型总体架构图及垃圾回收算法

jvm内存模型和内存分配

jvm内存模型和内存分配 1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 (2)jvm包...

JVM之内存构成(二)--JAVA内存模型与并发

物理机中的并发硬件效率与一致性 Java线程执行的内存模型 工作内存 主内存 内存间交互 long和double的非源自性协定 Volatile类型变量的特殊规则和语义 保证可见性 禁止指令重排优化 ...

【理解JVM】JVM内存模型

JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁。 ...

《深入理解java虚拟机》之内存模型与安全

不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结jav...

深入理解JVM(一)——JVM内存模型

JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM内存模型及分区
举报原因:
原因补充:

(最多只允许输入30个字)