JVM内存管理

来源:互联网 发布:施工组织设计制作软件 编辑:程序博客网 时间:2024/05/12 11:33

刚学java时,经常听到讲师提到的java的GC(垃圾回收器),有了他程序员就不需要关注内存的释放以及可以将更多的精力放到业务逻辑的开发设计上。经过几年的开发工作后发现jvm内存管理和配置在产品上线一段时间后随着访问量的增加有着举足轻重的作用。JVM能帮我们GC和管理内存固然是好,但如果我们不去深入了解,等到问题真正出现了内存泄露以及相关的问题就会觉得无从下手。

 

本文简要概述一下JVM的内存管理及垃圾回收。

 

 

  • 收集器

GC通过收集器来查找程序中无用的对象。收集器分为两种:

  1.  
    1. 引用计数收集器(消耗内存,而且对于循环引用的对象不起左右,JVM不采用这种方式)
    2. 跟踪收集器:从跟集合扫描对象的引用关系,会造成应用的暂停。分别采用三种算法来实现:复制,标记清除,标记压缩。

为了提高GC效率能够减少应用暂停的时间JVM将heap分为三代及新生代,旧生代,持久代。

  1. 新生代:程序new出来的对象都会放到新生代里
  2. 旧生代:新生代GC若干次后仍然不能回收的对象会存放到旧生代以及new出来的对象所占的空间大于新生代的空闲空间也会存放到旧生代里。
  3. 持久代:存放类得信息,静态变量

GC的种类:

  • 串行GC

采用单线程的方式进行回收

新生代的下的串行GC:

先扫面Eden下的对象并将不能回收的对象放到survivor space。如果survivor space的空间不够用则会将此区的对象移到旧生代里。

 

 旧生代的下的串行GC:
采用标记压缩的算法对旧生代的对象进行回收
  • 并行回收GC

采用多线程的方式进行GC

新生代下的并行回收GC在原理上和串行GC一样,只不过采用多线程的方式,能够缩短应用暂停的时间。

旧生代下的并行回收和串行GC原理一样,只不过也是采用多线程的方式。

 

  • 并行压缩GC

新生代下的此类GC和并行回收GC原理一样,所不一样的是旧生代的此类GC会把旧生代分成若干个regions,回收时分为三个phase;

marking phase:用多线程的方式并行的标记压缩各个regions。

summary phase:根据上一阶段的压缩扫描各个regions,找到分界点,分界点左边的regions中的对象是紧凑的。

compacting phase:根据上一阶段找到的分界点并压缩其右边的regions因为左边的是很紧凑的不值得进行压缩。

  • 并发GC(CMS)

新生代下此GC和并行回收GC原理一样。

重点是旧生代下的此GC的原理:

同样也会分为几个phases,

initial mark(初始标记):此阶段会造成短暂的应用暂停;并对相应的对象进行着色。

concurrent mark(并发标记):此阶段和应用同时进行并对上一阶段着色的标记进行轮询以避免上一阶段遗漏的对象未着色。

remark:此阶段会暂停整个运用;对上一阶段应用运行时改变的对象引用关系进行重新mark。

concurrent sweeping(并发回收):此阶段应用继续运行并回收为标记的对象。

 

 

总结:不同的GC有着不同的特点,程序员可以根据应用的吞吐量和GC所占用的时间做一个平衡来选择GC。通常情况下我们只需要配置相关的吞吐量参数哦和GC时间的参数,来上JVM来选择最优的GC方式。

原创粉丝点击