Java-JVM编译与垃圾收集

1. 编译

JIT(Just in Time)编译,即时编译。

Java字节码并不会运行时全部、马上被编译成机器码,而是根据编译级别、代码调用次数,决定某段代码是否编译成机器码。

编译级别分为:client编译、server编译、分层编译

采用client编译的通常是一些客户端程序,为了启动响应时间而做的编译优化。

采用server编译的通常是一些服务器端程序,为了长期运行优化。

分层编译,先采用client编译,后采用server编译。

2. GC

JVM垃圾收集算法有四种:标记-清除算法、复制算法、标记-整理算法以及分代收集算法

标记-清除算法:该算法分为两个阶段:“标记”和“清除”。首先标记处所有需要回收的对象,然后统一清除被标记的对象。该算法,标记和清除两个阶段的效率不高。此外,回收后会产生大量的不连续的内存碎片,进一步会导致垃圾回收次数的增加。

复制算法:将可用的内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存用完了,将还存活的对象复制到另外一块内存上去,然后把刚使用过的内存空间一次清理掉,避免了内存碎片的情况,缺点是只使用了一半内存,内存利用率不高。

标记-整理算法:集成了标记清除和复制算法优点。分为两个阶段,第一阶段打标记,第二阶段移动存活的对象,将它们移动到一端,然后将边界的内存清理掉。

堆被通常分三个区域:新生代空间、老年代空间、永久代空间(元空间)

新生代空间:存储的是新建的内存对象,新生代又分为三个区域:Eden空间、Suvivor 1空间、Suvivor 2空间。

JVM为每个对象定义了一个对象年龄计数器,如果对象在Eden出生并且经过第一次新生代GC(Minor GC)后仍然存活并且能被Survivor容纳,则该对象将被移动到另一块Survivor空间,并将对象年龄计数器加1。对象在Survivor区中每经历过一次Minor GC,年龄计数器就加1,当它的年龄达到设定的阈值(默认是15)时,则被移动到老年代中。

老年代空间存储的是长期存在于应用程序中,没有被垃圾回收的对象

永久代存储的是加载类的信息对象

GC编译器分三种:

Serial收集器、CMS收集器、G1收集器

Serial收集器采用单线程回收内存,当Full GC 回收时,通常会造成应用线程停顿

CMS后台采用多线程回收内存,默认当堆空间占用达到百分之七十时开始进行垃圾回收

G1收集器采用多线程回收内存,其堆空间被分为多个分区,每次回收前G1收集器将垃圾最多的分区打上标记,然后对这些标记的分区进行回收。标记的标准是达到某个阈值:分区内垃圾达到该分区空间的百分之50(默认,可调)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值