java运行时数据区

概述:
        jdk1.8之前,java运行时数据区总共分为5个区域,分别是堆、方法区、虚拟机栈、本地方法栈、程序计数器;1.8之后去掉了方法区,取代方法区的是元空间,但元空间不属于运行时数据区,直接内存区域中的一块区域。其中堆和方法区是线程共享的;虚拟机栈、本地方法栈、程序计数器是线程私有的。
图片来源:https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/jvm/Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F.md
在这里插入图片描述
在这里插入图片描述


  1.       堆在虚拟机启动时创建,是java虚拟机所管理的内存中最大的一块区域。主要用于存放对象实例,几乎所有的对象实例及数组都在这里分配内存空间。
           java堆是垃圾回收器管理的主要区域,所以也称为“GC堆”。从垃圾回收的角度来说,现在垃圾回收器主要采用分代垃圾收集算法。所以堆还可以进一步细化为:新生代(Eden、from survivor、to survivor三个区域)、老年代、永久代(方法区的实现类,jdk1.8之后就没有永久代了,元空间代替)。
           大部分情况,对象会优先在新生代 Eden 区中进行分配,当 Eden 区空间不足时,虚拟机会使用复制算法发起一次 Minor GC(Young GC),清除掉垃圾对象。之后,Eden 区中绝大部分对象会被回收,而那些无需回收的存活对象,将会进到 Survivor 的 From 区(From 区内存不足时,直接进入 Old 区)。Survivor 区相当于是 Eden 区和 Old 区的一个缓冲区。如果没有Survivor 区域,Old区将很快被填满,就会触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。Survivor 的存在意义就是减少被送到老年代的对象,进而减少 Major GC 的发生。Survivor 又分为2个区,一个是 From 区,一个是 To 区。每次执行 Minor GC,会将 Eden 区和 From 存活的对象放到 Survivor 的 To 区(To 区内存不足时,直接进入 Old 区)。为什么要将Survivor区分成From和To两个区?为了解决内存碎片化的问题。Minor GC 执行后,Eden 区会清空,存活的对象放到了 Survivor 区,而之前 Survivor 区中的对象,可能也有一些是需要被清除的。这时候JVM要使用标记清除算法去清除垃圾对象,而标记清除算法最大的问题就是内存碎片,由于在Eden区中有很多对象是“朝生夕死”的,所以必然会让内存产生严重的碎片化。Survivor 有2个区域,每次 Minor GC时,会将之前 Eden 区和 From 区中的存活对象复制到 To 区域。第二次 Minor GC 时,再将 Eden 区和 To 区中的存活对象再复制到 From 区域,以此反复。这样一来,总有一个Survivor区域是空闲的。这样就解决了内存碎片的问题。(本段参考:https://blog.csdn.net/qq_29635485/article/details/100837841

  2. 方法区
          方法区主要用于存放虚拟机加载的类信息、常量、静态变量和即时编译器编译后的代码等数据。jdk1.8采用元空间取代方法区,元空间采用的是直接内存存储数据,受本机可用内存限制。

  3. 虚拟机栈
           虚拟机栈是线程私有的,虚拟机栈的单位是栈帧,每一个栈帧对应着线程执行过程中所调用的每一个方法。每个栈帧中都拥有局部变量表、操作数栈、动态链接、方法出口信息。局部变量表主要存放编译器可知的各种数据类型、对象引用。线程执行过程中每一个方法的调用对应着一个栈帧入栈,方法的结束对应着出栈。方法结束的两种方式为:1.return;2.抛出异常。两种方式都对应着弹出栈帧。它随着线程的创建而创建、随着线程的结束而死亡。

  4. 本地方法栈
           与虚拟机栈类似,只不过本地方法栈用于执行java中的native方法。本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。

  5. 程序计数器
           可以看做是当前线程所执行的字节码的行号指示器,字节码致使其通过程序计数器的值获取下一条要执行的字节码指令。它随着线程的创建而创建、随着线程的结束而死亡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值