JVM的内存区及其GC算法

JVM把内存进行了划分,分别为:

(1)方法区
方法区存放了要加载的类的信息(如类名、修饰符等)、静态变量、构造函数、final定义的常量、类中的字段和方法等信息。方法区是全局共享的,方法区中很少执行GC,因为在方法区中执GC的条件很苛刻。所以方法区又被称为持久代。
方法区执行GC的条件:
1. Java堆中不存在该类的任何实例对象;
2. 加载该类的类加载器已经被回收;
3. 该类对象的java.lang.Class对象不在任何地方被引用,且无法在任何地方通过反射访问该类的方法
满足以上条件的时候,类才可以被回收,但是并不是一定会被回收。

(2)堆区
堆区主要用于存放对象实例及数组,成员变量,String常量池,所有new出来的对象都存储在该区域。堆区是GC最频繁的,堆区由所有线程共享,在虚拟机启动时创建。
堆区分为:年轻代,老年代,永久代
1.对象优先在 年轻代 分配
2.大对象直接进入老年代
3.长期存活的对象将进入老年代
JVM 把年轻代又分为了Eden区和两个Survivor区(from和to)。
一般情况下,新创建的对象都会分配到Eden区(大对象进入老年代),这些对象在经过第一次Minor GC后,如果任然存活,将被移动到Survivor区,对象在Survivor区中每熬过一次Minor GC后年龄增加1岁,当他增加到一定程度时(默认15),就会被移动到老年代。
一次GC结束后,Eden区和其中一个Survivor(from)区会被清空,存活下来的对象但没有达到年龄阈值的留在另一个Survivor(to)区中,下次GC开始时,to区和from区的角色调换。
GC触发条件:
1.调用System.gc()方法。此方法建议执行Full GC,一般情况下会触发Full GC,不推荐使用。
2.老年代空间不足。
3.永久代空间不足。
4.Minor GC后进入老年代的数据大于老年代可用空间。
5.由Eden区、From Survivor区向To Survivor区复制时,对象大于To Survivor区的可用空间,该对象转存如老年代,且老年代可用空间不足。

Minor GC、Major GC、Full GC的区别
从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。
Major GC 是清理永久代。
Full GC 是清理整个堆空间—包括年轻代和永久代。

(3)虚拟机栈(不需要GC,因为生命周期和线程同步)
虚拟机栈占用的是操作系统的内存。每个线程对应一个虚拟机栈。方法被调用时,产生一个栈帧,栈帧如栈。帧用于存储局部变量表、动态链接、操作数和方法出口等信息。局部变量表中存储这方法相关的局部变量,包裹各种基本数类型及对象的引用地址等。当方法调用结束时,栈帧出栈。
(4)本地方法栈(不需要GC,因为生命周期和线程同步)
用于支持native(本地)方法的执行。
(5)程序计数器(不需要GC,因为生命周期和线程同步)
是一个很小的内存区域,直接划分在了CPU上,程序员无法操作他。唯一不会抛出OutOfMemoryError(内存不足)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值