1、堆(Heap)
JVM管理的内存叫堆。在32Bit操作系统上有1.5G-2G的限制,而64Bit的就没有。
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1G。
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4但小于1G。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。??
默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio=指定。
服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。???
?
简单的来说,java内存分为堆和盏。堆和盏的数据结构,请百度一下,堆像座古巴比伦空中花园的金字塔。而盏就是一个后进先出的一个队列。
?
其中,堆里面存放所有java的对象,而盏里面存放所有的变量和指针。
?
2、分代?
??? 分代是Java垃圾收集的一大亮点,根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent,根据不同代的特点采用不同的收集算法,扬长避短也。?
Young(Nursery),年轻代。研究表明大部分对象都是朝生暮死,随生随灭的。因此所有收集器都为年轻代选择了复制算法。
??? 复制算法优点是只访问活跃对象,缺点是复制成本高。因为年轻代只有少量的对象能熬到垃圾收集,因此只需少量的复制成本。而且复制收集器只访问活跃对象,对那些占了最大比率的死对象视而不见,充分发挥了它遍历空间成本低的优点。
?
gc分为full gc 跟 minor gc,当每一块区满的时候都会引发gc。
也就是说,一般情况下,jvm不会主动地进行GC操作的。
?
3、关于垃圾收集器
Serial收集器:单线程收集器,必须暂停其他所有的工作线程,默认client模式下新生代的收集器 ? ParNew收集器:Serial的多线程版本,一般在Servr模式下的新生代首选收集器,除Serial外,目前只有它能与CMS收集器配合工作,ParNew收集器在单cpu的情况下不会有比Serial收集器更好的效果,甚至由于存在线程交互的开销,该收集器在通过超线程技术实现的两个cpu的环境中都一定能超越 Serial收集器。 ? Parallel Scavenge收集器:新生代收集器,使用复制算法,是并行的多线程收集器,跟其他收集器不一样,CMS等收集器是关注尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量是cpu用于运行用户代码的时间与cpu总消耗时间的比值。 ? Serial Old收集器:单线程收集器,是Serial收集器老年代版本,使用“标记-整理”算法,主要用在client模式下, ? Parallel Old收集器:Parallel Scavenge收集器的老年代版本,在注重吞吐量及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge收集器家Parallel Old收集器。 ? CMS收集器:使用“标记-清除”算法,以获取最短回收停顿时间为目标,对于重视服务的相应速度,希望系统停顿时间最短的B/S系统的服务器端尤其有用。CMS收集器分4个步骤:1,初始标记 2,并发标记 3,重新标记 4,并发清除 耗时最长的并发标记和并发清除都可以与用户线程一起工作了。 还有三个缺点:1,对cpu资源敏感,默认启动的回收线程数是(cpu数量+3)/4,当cpu数较少的时候,会分掉大部分的cpu去执行收集器线程,影响用户,降低吞吐量。 2,无法处理浮动垃圾,浮动垃圾即在并发清除阶段因为是并发执行,还会产生垃圾,这一部分垃圾即为浮动垃圾,要等下次收集。3,因为使用的是“标记-清除”算法,会产生碎片。 ? G1收集器(Garbage First):基于“标记-整理”算法,之前的垃圾收集器都是整个新生代或者老生代,而G1将整个java堆(包括新生代和老生代)划分为多个大小固定的独立区域,并跟踪这些区域的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域(也是Garbage First的由来)。3.2、基本收集算法?
?? 1. 复制:将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。
????? 因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。
?? 2. 标记清除(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。
?? 3. 标记整理(mark-sweep-compact):综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块
?
refer to:http://blog.csdn.net/haitao111313/article/details/7951664
http://guoliangqi.iteye.com/blog/630692
?
?