JVM内存分配

Garbage Collection ,GC 垃圾回收

jvm使用根搜索算法(GC ROOTS)判定对象是否已死/或者应该被回收

GC ROOTS

java 语言可作为gc root是搜索

1、虚拟机栈(栈帧中的本地变量表)中的引用对象

2、方法区中的类静态属性引用的对象

3、方法区中的常量引用的对象

4、本地方法栈中JNI(即Native方法)中的引用对象


回收方法区

永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类

假如当前废弃常量没有其他地方引用,如果发生内存回收,而且有必要的话会被请出常量池。常量池中的其他类,接口,方法,字段的符号引用也与此类似。

判定无用的类

1、该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

2、加载该类的ClassLoader已经被回收。

3、该类对应的java.lang.Class对象没有在任何地方被应用,无法在任何地方通过反射方法访问该类的方法。

虚拟机可以对满足上述的3个条件的无用类进行回收,这里说的仅仅是可以,而不是和对象一样,不使用了就必然回收。是否对类进行回收,JVM提供-Xnoclassgc参数进行控制.

在大量使用反射,动态代理,CGlib等bytecode框架的场景,以及动态生成JSP和OSGi这等频繁自定义ClassLoader的场景都需要虚拟机具备卸载的功能,以保证永久代不会溢出。


垃圾收集算法

复制算法(新生代算法)

将可用内存按容量划分为大小相等的两块,每次只使用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后在把自己已经使用过的内存空间一次清理掉。这样使的每次都是对其中的一块进行内存回收,内存分配是也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

IBM的专门研究表明,新生代中的对象98%是朝生夕死的,所以并不需要安装1:1的比例来划分内存空间,而是将内存划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor,当回收时,将Eden和Servivor中还存活的对象一次性的拷贝到另外一个Servivor上,最后清理掉Eden和刚才用的Survivor的空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),如果每次复制回收Survivor的空间不够用用时,需要依赖老年代,进行分配担保


标记-整理算法(老年代算法)

复制收集算法在对象存活率较高是就要执行较多的复制操作效率将会变低,更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般能直接使用标记整理算法。


垃圾收集器

Serial收集器

此收集器是最基本、历史悠久的收集器,是单线程垃圾收集器(暂不考虑使用)

ParNew收集器

此收集器是Serial收集器的多线程版本,与Serial相比并无太多的创新之处,但是确实运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的原因是,目前只要他能与CMS收集器配合工作。

ParNew收集器使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:+UseParNewGC选项来强制指定它。

Parallel Scavenge收集器

与ParNew重要的区别就是GC自适应调节策略。(暂不考虑使用)


Serial Old收集器

是Serial收集器老年代版本(暂时不考虑使用)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值