java内存模型

1 Java内存模型JMM (Java Memory Model)

Java虚拟机在执行Java程序的过程中,会把它管理的内存划分为几个不同的数据区域(也就是运行时的数据区域),这些区域都有各自的用途、创建时间、销毁时间。

2 Java虚拟机运行时数据区(JVM Runtime Data Area)

在Java虚拟机规范(JVMS)中定义了多种程序运行时会用到的存储不同类型数据的内存区域,统称为“Java虚拟机运行时数据区”,有的数据区是全局共享的,有的是线程私有的。

全局共享:随着JVM启动而创建,随着JVM退出而销毁

线程私有:随着线程开始而创建,随着线程结束而销毁

2.1 运行时数据区划分

  1. 程序计数器 (program counter register)
  2. Java虚拟机栈 (VM stack)
  3. 本地方法栈 (native method stack)
  4. 堆 (heap)
  5. 方法区 (method area)

jdk1.8之前的JMM模型图

JDK1.8以后的JMM模型图

2.2 程序计数器(Program Counter Register)

  1. 一块较小的内存空间,他的作用可以看做是:当前线程所执行的字节码的行号指示器
  2. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法(JDK自带的方法),这个计数器值为空。
  3. 此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError(内存溢出)情况的区域

2.3 虚拟机栈(VM Stack)

  1. 线程私有
  2. 后进先出(LIFO)栈  last in first out
  3. 存储栈帧,支撑Java方法的调用,执行和退出
  4. 可能出现OutOfMemeoryError异常和StackOverFlowError异常

OutOfMemeoryError(内存溢出):当jvm栈被设计成可动态扩展,在动态扩展时无法申请到足够的内存

StackOverFlowError(栈溢出):线程请求的栈深度大于jvm允许的最大深度

2.4 本地方法栈(Native Method Stack)

在HotSpot中本地方法栈与VM Stack合并

本地方法栈与Java虚拟机栈基本相同,区别在于:

  1. Java虚拟机栈为JVM执行字节码所服务
  2. 本地方法栈为JVM执行Native方法所服务,支撑Native方法的调用,执行和退出

2.5 方法区: static final

方法区存放了要加载的类的信息(名称、修饰符等)、类中的静态常量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当在程序中通过Class类的方法来获取对象信息时,这些数据都来源于方法区。方法区是被Java线程锁共享的,不像Java堆中其他部分一样会频繁被GC回收,它存储的信息相对比较稳定,在一定条件下会被GC,当方法区要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。方法区也是堆中的一部分,就是我们通常所说的Java堆中的永久区 Permanet Generation,大小可以通过参数来设置,可以通过-XX:PermSize指定初始值方法区包含所有的class和static变量、final变量,-XX:MaxPermSize指定最大值。

  • 又叫静态区,跟堆一样,被所有的线程共享。
  • 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。(两者区别为堆区存放new出来的对象信息,方法区存放类信息)

2.6 堆heap

堆是JVM所管理的内存中最大的一块,是被所有Java线程锁共享的,不是线程安全的,在JVM启动时创建。堆是存储Java对象的地方,这一点Java虚拟机规范中描述是:所有的对象实例以及数组都要在堆上分配。Java堆是GC管理的主要区域,从内存回收的角度来看,由于现在GC基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代;新生代再细致一点有Eden空间、From Survivor空间、To Survivor空间等。

私有内存区——伴随线程的产生而产生,一旦线程终止,私有内存区也会自动消除

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值