【JVM】01 内存模型(运行时数据区)

JVM(java virtual machine),一种可以运行 java 字节码的虚拟机。java 语言一次编译,到处运行,间接的说明了,只要编译的文件和 jvm 对加载编译的文件格式一致,任何语言都可以由 JVM 运行。

JVM 由三个主要的子系统构成

  • 类加载子系统
  • 运行时数据区(内存结构)
  • 执行引擎
    在这里插入图片描述

今天我们主要学习 JVM 的内存模型 — 运行时数据区。

Java 的内存模型(运行时数据区)在这里插入图片描述
1 方法区(Method Area)

所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,虽然JVM 规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是为了和Java的堆区分开。

2 堆(Heap)

jvm 启动时自动分配创建堆内存,存放对象的实例,凡是 new 出来对象(包括常量池)都在堆上分配内存,当对象申请不到内存将抛出OutOfMemoryError异常,堆是垃圾收集器管理的主要区域。堆是类出生到消亡的地方。方法区和堆存放的是可共享信息,存在线程安全问题。

在这里插入图片描述

2.1 新生代(Young Generation)

新生代分为两部分:伊甸区(Eden space)和幸存者区(Survivor space),所有的类都是在伊甸区被new出来的。
幸存区又分为From和To区。程序创建对象,且Eden区的空间不足时,触发垃圾回收机制,将Eden区中不再使用的对象进行会后,将Eden区中剩余的对象移到FromSurvivor区,若From Survivor区也满了,再对该区进行垃圾回收,然后移动到To Survivor区。

2.2 老年代(Old Generation)

新生代经过多次GC仍然有一些旧对象,这些对象将被放入老年代,老年代也满了,此时触发Major GC(也可以叫Full GC),进行老年区的内存清理。若老年区执行了Full GC之后发现依然无法进行对象的保存,就会抛出OOM(OutOfMemoryError)异常

2.3 元空间(Meta Space)

JDK1.8之后,元空间替代永久代,它是对JVM规范中方法区的实现,区别在于元数据区不在虚拟机当中,而是用的本地内存,永久代在虚拟机当中,永久代逻辑结构上也属于堆,但是物理上不属于。

3 栈(Statck)

Java线程执行方法的内存模型,一个线程对应一个栈(两者同生共死),每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,线程运行完成,栈随之消失(栈的生命周期与线程相同)所以不需要进行垃圾回收。

一个栈帧就是一个方法,当一个 Java 方法被调用时,会创建一个栈帧,并入栈。一旦完成相应的调用,则出栈。所有的栈帧都出栈后,线程也就结束了,栈消失。

每个栈帧,都包含四个区域:

  • 局部变量表
  • 操作数栈
  • 动态连接
  • 完成出口
    0060215085235.png)

4 本地方法栈(Native Method Stack)

与栈作用相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行native方法服务。登记native方法,在Execution Engine执行时加载本地方法库。

5 程序计数器(Program Counter Register)

一个指针,存放java 线程的私有数据,指向方法区中的方法字节码,执行下一条指令的地址,由执行引擎读取下一条指令,内存空间小到可以忽略。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值