上海浦东设计网站建设,seo网络推广招聘,商贸公司注册需要多少钱,鞍山黄殿满JAVA GC 是JAVA虚拟机中的一个系统或者说是一个服务#xff0c;专门是用于内存回收#xff0c;交还给虚拟机的功能。 
JAVA语言相对其他语言除了跨平台性#xff0c;还有一个最重要的功能是JAVA语言封装了对内存的自动回收。俗称垃圾回收器。所以有时候我们不得不承认#…JAVA GC 是JAVA虚拟机中的一个系统或者说是一个服务专门是用于内存回收交还给虚拟机的功能。 
JAVA语言相对其他语言除了跨平台性还有一个最重要的功能是JAVA语言封装了对内存的自动回收。俗称垃圾回收器。所以有时候我们不得不承认我们写的每一行JAVA代码都是垃圾 
那么JAVA虚拟机中对应内存的回收常见的有哪些的呢。 我知道的有 
标记清除法、标记整理算法、复制清除、分代收集其中最常用的是分代收集。 标记清除法 
示意图 初始状态是一块空白未被使用的内存。java语言类中声明的对象运行在堆中使用内存块。红的和绿的部分。 
过了一段时间垃圾回收器工作检测哪些对象在使用哪些对象不使用了进行标记。绿色部分为存活对象红色部分为被标记。 
然后将红色可回收的对象清除释放内存。 
优点效率很高快速。 
缺点使内存碎片化不方便分配大内存。 
标记整理算法 
示意图 标记整理法比标记法多做一步工作就是标记清除后对碎片进行整理移动。空出更大的内存块。 
优点尽可能空闲出较大块的内存块。 
缺点垃圾回收器比较忙碌。在移动内存对象过程中消耗性能和效率。 
复制清除 
示意图 复制清除法可用内存一分为二每次只用一块当这一块内存不够用时便触发 GC将当前存活对象复制(Copy)到另一块上以此往复 Java 对象的存活时间极短。 Java 对象高达 98% 是朝生夕死的这也意味着每次 GC 可以回收大部分的内存需要复制的数据量也很小这样它的执行效率就会很高。 
优点效率高 
缺点只能使用50%的内存。 分代收集法 
示意图: 分代收集法 根据对象一般都是先在 Eden区创建 当Eden区满触发 Young GC此时将 Eden中还存活的对象复制到 S0中并清空 Eden区后继续为新的对象分配内存 当Eden区再次满后触发又一次的 Young GC此时会将 Eden和S0中存活的对象复制到 S1中然后清空Eden和S0后继续为新的对象分配内存 每经过一次 Young GC存活下来的对象都会将自己存活次数加1当达到一定次数后会随着一次 Young GC 晋升到 Old区 Old区也会在合适的时机进行自己的 GC。 
新生代Young generation 绝大多数新创建的对象都会被分配到这里这个区域触发的垃圾回收称之为Minor GC 。 
空间结构 默认情况下新生代Young generation、老年代Old generation所占空间比例为 1 : 2 。 它被分成三个空间 · 1个伊甸园空间Eden · 2个幸存者空间Fron Survivor、To Survivor 默认情况下新生代空间的分配Eden : Fron : To  8 : 1 : 1 为什么要这样的布局是因为新生代里的对象绝大多数是朝生夕死的非常适合使用标记-复制算法后面的回收算法章节会详细说。 
新生代GC收集的执行顺序如下 1、绝大多数新创建的对象会存放在伊甸园空间Eden。 2、在伊甸园空间执行第 1 次GCMinor GC之后存活的对象被移动到其中一个幸存者空间Survivor。 3、此后每次 Minor GC都会将 Eden 和 使用中的Survivor 区域中存活的对象一次性复制到另一块空闲中的Survivor区然后直接清理 Eden 和 使用过的那块Survivor 空间。 4、从以上空间分配我们知道Survivor区内存占比很小当空闲中的Survivor空间不够存放活下来的对象时这些对象会通过分配担保机制直接进入老年代。 5、在以上步骤中重复N次N  MaxTenuringThreshold年龄阀值设定默认15依然存活的对象就会被移动到老年代。 从上面的步骤可以发现两个幸存者空间必须有一个是保持空的。 我们需要重点记住的是新创建的对象是保存在伊甸园空间的Eden。那些经历多次GC依然存活的对象会经由幸存者空间Survivor转存到老年代空间Old generation。 也有例外出现对于一些大的对象指需要占用大量连续内存空间的对象则直接进入到老年代。 Java提供了 -XX:PretenureSizeThreshold 来指定对象大于这个值直接分配到老年代。 
老年代Old generation 对象在新生代周期中存活了下来的会被拷贝到这里。通常情况下这个区域分配的空间要比新生代多。正是由于对象经历的GC次数越多越难回收加上相对大的空间发生在老年代的GC次数要比新生代少得多。这个区域触发的垃圾回收称之为Major GC 或者 Full GC 老年代空间的构成其实很简单它不像新生代空间那样划分为几个区域它只有一个区域里面存储的对象并不像新生代空间里绝大部分都是朝闻道夕死矣。这里的对象几乎都是从Survivor 空间中熬过来的它们绝不会轻易狗带。因此Major GC 或 Full GC 发生的次数不会有 Minor GC 那么频繁。 2、老年代使用的是标记-整理算法清理完成内存后还得把存活的对象重新排序整理成连续的空间成本更高。 
优点低频率触发GC更好的触发内存回收。 下面才是重点知道了原理那怎么使用或者制定使用GC。java虚拟机中有很多种GC我们可以通过配置指定语法 
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:UseParallelGC -XX:ParallelGCThreans  20 -Xmx3800m:最大堆大小 -Xms3800m:初始堆大小,此值可以设置与-Xmx相同以避免每次垃圾回收完成后JVM重新分配内存。 -Xmn2g: 设置年轻代大小为2G。整个JVM内存大小年轻代大小  年老代大小  持久代大小。持久代一般固定大小为64m所以增大年轻代后将会减小年老代大小。此值对系统性能影响较大Sun官方推荐配置为整个堆的3/8。 -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的 不能无限生成经验值在3000~5000左右。 -XX:UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即该配置下年轻代使用并发收集而年老代仍旧使用串行收集。 -XX:ParallelGCThreans  20配置并行收集器的线程数即同时多少个线程一起进行垃圾回收。此值的配置最好与处理器数目相等。 
-------------------------------------------------------------------------------------------------------------------------- 常见配置汇总 -XX:CMSIncrementalMode:设置为增量模式。适用于单CPU情况 -XX:ParallelGCThreadsn:设置并发收集器年轻代收集方式为并行收集时使用的CPU数。并行收集线程数 -XX:ParallelGCThreadsn:设置并行收集器收集时使用的CPU数。并行收集线程数 -XX:MaxGCPauseMillisn:设置并行收集最大暂停时间 -XX:GCTimeRation:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1n) -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:filename -XX:UseSerialGC:设置串行收集器 -XX:UseParallelGC:设置并行收集器 -XX:UseParalledlOldGC:设置并行年老代收集器 -XX:UseConcMarkSweepGC:设置并发收集器 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSizen:设置年轻代大小 -XX:NewRation:设置年轻代和年老代的比值。如:为3表示年轻代与年老代比值为13年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRation:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如3表示EdenSurvivor32一个Survivor区占整个年轻代的1/5 -XX:MaxPermSizen:设置持久代大小 堆设置 收集器设置 垃圾回收统计信息 并行收集器设置 并发收集器设置 调优总结 -XX:UseCMSCompactAtFullCollection使用并发收集器时开启对年老代的压缩 -XX:CMSFullGCsBeforeCompaction0上面配置开启的情况下这里设置多少次Full GC后对年老代进行压缩 -XX:MaxHeapFreeRatio30 响应时间优先的应用年老代使用并发收集器所以其大小需要小心设置一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式如果堆大了则需要较长的收集时 间。最优化的方案一般需要参考以下数据获得减少年轻代和年老代花费的时间一般会提高应用的效率 吞吐量优先的应用一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是这样可以尽可能回收掉大部分短期对象减少中期的对象而年老代尽存放长期存活对象。 并发垃圾收集信息 持久代并发收集次数 传统GC信息 花在年轻代和年老代回收上的时间比例 响应时间优先的应用尽可能设大直到接近系统的最低响应时间限制根据实际情况选择。在此种情况下年轻代收集发生的频率也是最小的。同时减少到达年老代的对象。 吞吐量优先的应用尽可能的设置大可能到达Gbit的程度。因为对响应时间没有要求垃圾收集可以并行进行一般适合8CPU以上的应用。 年轻代大小选择 年老代大小选择 较小堆引起的碎片问题 因为年老代的并发收集器使用标记、清除算法所以不会对堆进行压缩。当收集器回收时他会把相邻的空间进行合并这样可以分配给较大的对象。但是当堆空间较小时运行一段时间以后就会出现“碎片”如果并发收集器找不到足够的空间那么并发收集器将会停止然后使用传统的标记、清除方式进行回收。如果出现“碎片”可能需要进行如下配置 -XX:UseCMSCompactAtFullCollection使用并发收集器时开启对年老代的压缩 -XX:CMSFullGCsBeforeCompaction0上面配置开启的情况下这里设置多少次Full GC后对年老代进行压缩 -XX:MaxHeapFreeRatio30