JVM内存模型的理解

JVM内存模型图

在这里插入图片描述

**方法区和堆是线程共有的,虚拟机栈、本地方法栈和程序计数器是线程私有的**

程序计数器

程序计数器是线程私有的,是一块很小的内存空间,可以看作当前线程的行号指示器
程序计数器的主要两个作用:
1、字节码解析器通过改变程序计数器的值来依次读取指令,从而实现代码的流程控制,比如:顺序执行、选择、循环、异常处理等
2、在多线程并发的情况下,程序计数器记录当前线程执行的位置,当线程再切换回来的时候可以知道当前线程所在的位置在哪个位置。

虚拟机栈

1、虚拟机栈描述的是java方法执行的内存模型,java的方法被调用的时候,虚拟机栈都会创建一个栈帧,用来存储局部变量、操作数栈、动态链接、方法出口等信息每个方法被调用的过程就对应一个栈帧入栈和出栈的过程。
2、栈帧包含的信息:局部变量、操作数栈、动态链接、方法出口等信息。
3、java虚拟机栈可能出现两种类型的异常

1、线程请求栈的深度大于虚拟机栈允许的深度,会抛出StackOverflowError异常,通常就是我们所主的内存溢出
2、虚拟机栈的空间可以动态的扩展,当动态扩展的空间无法申请到足够的空间,会抛出OutOfMemory异常

如图:
在这里插入图片描述

本地方法栈

本地方法栈和虚拟机栈类似,区别在于虚拟机栈调用的是java方法的服务,和本地方法栈调用的是native方法的服务。在本地方法栈被执行的时候,它也会创建一个栈帧,用于存放局部变量、操作数栈、动态链接、方法出口等信息。方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError 和 OutOfMemoryError 两种异常。

1、堆是Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存
2、Java堆是垃圾收集器管理的主要区域,常被称作GC堆。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代:其中新生代又分为:Eden空间、From Survivor、To Survivor空间。进一步划分的目的是更好地回收内存,或者更快地分配内存。“分代回收”是基于这样一个事实:对象的生命周期不同,所以针对不同生命周期的对象可以采取不同的回收方式,以便提高回收效率。
在这里插入图片描述
如图所示,JVM内存主要由新生代、老年代、永久代构成。

① 新生代(Young Generation):大多数对象在新生代中被创建,其中很多对象的生命周期很短。每次新生代的垃圾回收(又称Minor GC)后只有少量对象存活,所以选用复制算法,只需要少量的复制成本就可以完成回收。

新生代内又分三个区:一个Eden区,两个Survivor区(一般而言),大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到两个Survivor区(中的一个)。当这个Survivor区满时,此区的存活且不满足“晋升”条件的对象将被复制到另外一个Survivor区。对象每经历一次Minor GC,年龄加1,达到“晋升年龄阈值”后,被放到老年代,这个过程也称为“晋升”。显然,“晋升年龄阈值”的大小直接影响着对象在新生代中的停留时间,在Serial和ParNew GC两种回收器中,“晋升年龄阈值”通过参数MaxTenuringThreshold设定,默认值为15。

② 老年代(Old Generation):在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代,该区域中对象存活率高。老年代的垃圾回收(又称Major GC)通常使用“标记-清理”或“标记-整理”算法。整堆包括新生代和老年代的垃圾回收称为Full GC(HotSpot VM里,除了CMS之外,其它能收集老年代的GC都会同时收集整个GC堆,包括新生代)。

③ 永久代(Perm Generation):主要存放元数据,例如Class、Method的元信息,与垃圾回收要回收的Java对象关系不大。相对于新生代和年老代来说,该区域的划分对垃圾回收影响比较小。

在 JDK 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域(永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制)。
 gc垃圾回收器详解

方法区

方法区和堆一样,都是是所有线程共享的。方法区的作用是用来存储已经被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码数据,因此有时候也被常称作非堆。JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。

小总结

在这里插入图片描述
参考1
参考2
参考3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值