JVM垃圾回收

Java程序员在编写的时候不在考虑内存管理,因为有个垃圾回收机制(GC)不会存在泄露问题,有效的使用空闲的内存。(这也是Java被广泛使用与服务器端编程的额的一个重要原因);然而在实际开发中可能会存在无用但可达的对象,这些对象不能被GC回收,因此会导致内存泄露的发生。

内存泄漏:指该内存空间使用完毕后未收回,在不涉及复杂数据结构一般情况下,Java的内存泄露表现未一个内存对象的生命周期超出了程序需要它的时间长度。我们也将其称为“对象流离”;内存溢出。

GC是什么?为什么要有GC?

GC是垃圾收集的意思,内存处理事编程人员容易出现错误问题的地方,忘记或写错误的内存回收会导致程序或系统的不稳定甚至崩溃,如果这些对象只增加不减少,那么堆空间就会被耗尽,所以我们需要把一些没用的对象清理掉,Java提供的垃圾回收机制可以自动检测对是否超出作用域从而达到自动会回收的目的。可以调用下面的的方法之一:System.gc()或Runtime.getRuntime.gc(),但是JVM可以屏蔽掉显示的垃圾回收调用。

垃圾回收可以有效的防止内存泄露,有效的使用有效的内存。

垃圾回收的算法:

Java语言规范没有明确的说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做两件事基本事件:(1)发现无用的信息对象;(2)回收将无用对象占用的内存空间。是该空间可能被程序再次使用。

1.引用计算法(Reference Counting Collector)

2.tracing算法(Tracing Collector)

3.标记-清楚算法(mark and sweep)

4.copying算法(Compatacting Collector)

5.generation算法(Generational Collectior)分代

年轻代(Young Generation)

(1)所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些什么周期短的对象。

(2)新生成内存按照8:1:1的比例分为一个eden区的两个survivor(survivor0,survivor1)区。一个Eden区,两个Survivor(一般而言)。大部分在Edent区生成。回收时先将eden区存货对象复制到一个survivor0区,然后清空edent区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个surcicor0区,此时survicor0区是空的,然后将survivor区和survivor1区交换,即保持survivor1区为空,如此往复。

(3)当survivor1区不足以存放eden和survivor0的存放对象时,就将存活对象直接存放到老年代。若老年代也满了就会出发一次Full GC,也就是新生代、老年代都进行回收。

(4)新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)

  老年代(OldGeneration)

1.在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

2.内存比较新生代也打很多(大概比例1:2),当老年代内存满是触发Major GC 即Full GC,FullGC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

持久(Permanent Generation)1.8以后是元空间。

用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或调用一些class,例如Hibernata等,在这种时候需要设置一个较大的持久空间来存放这些运行过程中新增的类。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值