关于GC的一些算法

0-----------------------------------
-Xms4m -Xmx4m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump  为虚拟机设置初始化堆的大小(-Xms4m )
设置最大堆大小( -Xmx4m) -XX:+HeapDumpOnOutOfMemoryError堆溢出虚拟机参数
-Xss 10m 为虚拟机 设置栈调用的深度
----------------------------------------------------
方法区:和堆一样,方法区是一块所有线程共享的内存区域,他用于保存系统的类信息。方法区可以保存多少信息可以对其进行配置。在默认的情况下,-XX:PerSize=64M,如果系统运行时产生大量的类,就需要设置一个相对合适的方法区,以免出现永久区内存溢出的问题。
-XX:PermSize=64M -XX:MaxPermSize=64M
-------------------------------------------------------
垃圾回收的概念和其算法(GC Garbage Coolection)
         GC中的垃圾,特指存于内存中、不再被使用对象,而回收就相当于把垃圾倒掉:如引用计数法、标记压缩法、复制算法、分代、分区的思想。
引用计数法:无法处理循环引用,及迭代,api级别的调用。
标记清除法:回收被标记的内存,不可能完全清除内存空间,可能存在空间碎片,内存使用率低。
*******************
复制算法:其核心思想就是把内存空间分为两块,每次只是用其中一块,在垃圾回收时,将正在使用的内存中存留的对象复制到未使用的内存中去,之后去清除之前正在使用的内存中的所有对象,反复去交替两个内存的角色。完成垃圾收集(java中新生代的from和to空间就是使用这个算法);
*******************
标记压缩法:在标记清除法基础之上作了优化,把存活的对象压缩到内存的另一端,而后进行垃圾清除,把标记的对象全部清除,就不会产生空间碎片的问题。(java中老年代使用的就是标记压缩法)
************************
考虑一个问题:为什么新生代和老年代使用不同的垃圾回收算法?
答:新生代的对象回收频率高,但是每次回收耗时都很短。而老年代的对象存活概率要高,采用标记压缩法是为了给jvm节约内存。提高jvm性能。
------------------------------------------------------------------
分代算法:就是根据对象的特点把内存分为N块,而后根据每个内存的特点使用不同的算法。
分区算法:将内存分为N个小的独立的空间。每个小空间都可以独立使用。这样细粒度的控制一次回收多少个小空间和那些个小空间,而不是对整个空间进行GC,从而提升性能,并减少GC的停顿时间
---------------------------------------------------------------------
对象如何进入老年代?
一般而言对象首次创建会被放置在eden区,如果没有GC的介入,对象会一直停留在eden区。一般而言,只要对象达到一定年龄之后就会进入老年代,对象的年龄是由经历过GC的次数。java虚拟机提供一个一个参数来控制新生代对象的最大年龄,当超过这个年龄之后对象就会由新生代晋升为老年代。
-XX:MaxTenuringThreshold 默认情况下为15

原文地址:https://www.cnblogs.com/133261c/p/9610747.html