ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>蜜芽tv福利在线视频,亚洲伊人成综合成人网,阿v免费在线观看http://www.aygfsteel.com/wangkx/articles/158518.html柯西柯西Tue, 06 Nov 2007 05:46:00 GMThttp://www.aygfsteel.com/wangkx/articles/158518.htmlhttp://www.aygfsteel.com/wangkx/comments/158518.htmlhttp://www.aygfsteel.com/wangkx/articles/158518.html#Feedback0http://www.aygfsteel.com/wangkx/comments/commentRss/158518.htmlhttp://www.aygfsteel.com/wangkx/services/trackbacks/158518.htmlJVM在运行时会äñ”生三个ClassLoaderåQŒBootstrap ClassLoader、Extension ClassLoaderå’ŒAppClassLoader.其中åQŒBootstrap是用C++¾~–写的,我们在Java中看不到它,是null。它用来加蝲核心¾cÕdº“åQŒåœ¨JVM源代码中˜q™æ ·å†™é“åQ?br /> static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
知道ä¸ÞZ»€ä¹ˆä¸éœ€è¦åœ¨classpath中加载这些类了吧åQŸäh家在JVM启动的时候就自动加蝲了,òq¶ä¸”在运行过½E‹ä¸­æ ÒŽœ¬ä¸èƒ½ä¿®æ”¹Bootstrap加蝲路径ã€?br /> Extension ClassLoader用来加蝲扩展¾c»ï¼Œå?lib/ext中的¾c…R€?br /> 最后AppClassLoader才是加蝲Classpathçš„ã€?br /> ClassLoader加蝲¾cȝ”¨çš„æ˜¯å§”托模型。即先让Parent¾c?而不是SuperåQŒä¸æ˜¯ç‘ô承关¾p?å¯ÀL‰¾åQŒParent找不到才自己找。看来ClassLoader˜q˜æ˜¯è›®å­™åºçš„。三者的关系ä¸?AppClassLoaderçš„Parent是ExtClassLoaderåQŒè€ŒExtClassLoaderçš„Parent为Bootstrap ClassLoader。加载一个类æ—Óž¼Œé¦–å…ˆBootStrap先进行寻找,找不到再由ExtClassLoaderå¯ÀL‰¾åQŒæœ€åŽæ‰æ˜¯AppClassLoaderã€?br /> ä¸ÞZ»€ä¹ˆè¦è®¾è®¡çš„这么复杂呢åQŸå…¶ä¸­ä¸€ä¸ªé‡è¦åŽŸå› å°±æ˜¯å®‰å…¨æ€§ã€‚æ¯”å¦‚åœ¨Applet中,如果¾~–写了一个java.lang.String¾cÕdƈå…ähœ‰ç ´åæ€§ã€‚假如不采用˜q™ç§å§”托机制åQŒå°±ä¼šå°†˜q™ä¸ªå…ähœ‰ç ´åæ€§çš„String加蝲åˆîCº†ç”¨æˆ·æœºå™¨ä¸Šï¼Œå¯ÆD‡´ç ´åç”¨æˆ·å®‰å…¨ã€‚但采用˜q™ç§å§”托机制则不会出现这¿Uæƒ…å†üc€‚因䏸™¦åŠ è²java.lang.String¾cÀL—¶åQŒç³»¾lŸæœ€¾lˆä¼šç”±Bootstrap˜q›è¡ŒåŠ è²åQŒè¿™ä¸ªå…·æœ‰ç ´åæ€§çš„String永远没有æœÞZ¼šåŠ è²ã€?br /> 我们来看˜q™æ®µä»£ç åQ?br /> //A.java
public class A{
public static void main(String[] args){
A a=new A();
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(a.getClass().getClassLoader());
B b=new B();
b.print();
}
}
//B.java
public class B{
public void print(){
System.out.println(this.getClass().getClassLoader());
}
}
1、我们将它放在Classpath中,则打印出
sun.misc.Launcher$AppClassLoader@92e78c
sun.misc.Launcher$AppClassLoader@92e78c
可见都是由AppClassLoader来加载的ã€?br /> 2、我们将其放åœ?jre%/lib/ext/classes(即ExtClassLoader的加载目录。其加蝲/lib/ext中的jaræ–‡äšg或者子目录classes中的classæ–‡äšg)中。则会打印出åQ?br /> sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$ExtClassLoader
3、我们将A.class攑ֈ°%jre%/lib/ext/classes中,而将B.class攑ֈ°classpaht中又会怎么样呢åQŸç»“果是åQ?br /> sun.misc.Launcher$ExtClassLoader
Exception in thread "main" java.lang.NoClassDefFoundError:B
at A.main(A.java:6)
怎么会这样呢åQŸè¿™å…¶ä¸­æœ‰ä¸€ä¸ªé‡è¦çš„问题åQšA¾cÕd½“然是由ExtClassLoader来加载的åQŒB¾c»è¦ç”±å“ªä¸ªåŠ è½½å‘¢åQŸB¾c»è¦ç”Þp°ƒç”¨å®ƒè‡ªå·±çš„类的类加蝲å™?真拗å?。也ž®±æ˜¯è¯ß_¼ŒA调用了BåQŒæ‰€ä»¥Bç”±A的类加蝲器ExtClassLoader来加载。ExtClassLoaderæ ÒŽ®å§”托机制åQŒå…ˆæ‹œæ‰˜Bootstrap加蝲åQŒBootstrap没有扑ֈ°ã€‚然后它再自己寻找B¾c»ï¼Œ˜q˜æ˜¯æ²¡æ‰¾åˆŽÍ¼Œæ‰€ä»¥æŠ›å‡ºå¼‚常。ExtClassLoader不会è¯äh±‚AppClassLoader来加è½?你可能会惻I¼š˜q™ç®—什么问题,我把两个¾cÀL”¾åˆîC¸€èµ·ä¸ž®Þp¡Œäº†ï¼Ÿ
呵呵åQŒæ²¡˜q™ä¹ˆ½Ž€å•。比如JDBC是核心类库,而各个数据库的JDBC驱动则是扩展¾cÕdº“或在classpath中定义的。所以JDBCç”±Bootstrap ClassLoader加蝲åQŒè€Œé©±åŠ¨è¦ç”±AppClassLoader加蝲。等½{‰ï¼Œé—®é¢˜æ¥äº†åQŒBootstrap不会è¯äh±‚AppClassLoader加蝲¾cÕd•Šã€‚那么,他们怎么实现的呢åQŸæˆ‘ž®±æ¶‰åŠåˆ°ä¸€ä¸ªContext ClassLoader的问题,调用Thread.getContextClassLoaderã€?/p>

柯西 2007-11-06 13:46 发表评论
]]>
JDK5.0垃圾攉™›†ä¼˜åŒ–http://www.aygfsteel.com/wangkx/articles/158358.html柯西柯西Mon, 05 Nov 2007 13:22:00 GMThttp://www.aygfsteel.com/wangkx/articles/158358.htmlhttp://www.aygfsteel.com/wangkx/comments/158358.htmlhttp://www.aygfsteel.com/wangkx/articles/158358.html#Feedback0http://www.aygfsteel.com/wangkx/comments/commentRss/158358.htmlhttp://www.aygfsteel.com/wangkx/services/trackbacks/158358.html江南白è¡£åQŒæœ€æ–°ç‰ˆé“¾æŽ¥åQ?a >http://blog.csdn.net/calvinxiu/archive/2007/05/18/1614473.aspxåQŒç‰ˆæƒæ‰€æœ‰ï¼Œè½¬è²è¯·ä¿ç•™åŽŸæ–‡é“¾æŽ¥ã€?

      原本æƒÏxŠŠé¢˜ç›®æ›´ç®€å•çš„å®šäØ“--《不要停》的åQŒä½†˜q˜æ˜¯è‡ªå·±YY一下就½Ž—了ã€?br />       Java开发Server最大的障碍åQŒå°±æ˜¯JDK1.4版之前的的串行垃圾收集机制会引è“v长时间的服务暂停åQŒæ˜Žç™½åŽŸç†åŽåQŒæƒ³æƒ³é‚£äº›ç”¨JDK1.3写Server的先辈,不得不后怕ã€?br />      å¥½åœ¨JDK1.4已开始支持多¾U¿ç¨‹òq¶è¡Œçš„后台垃圾收集算法,JDK5.0则优化了默认值的讄¡½®ã€?

一、参考资料:

  1. Tuning Garbage Collection with the 5.0 Java Virtual Machine å®˜æ–¹æŒ‡å—ã€?
  2. Hotspot memory management whitepaper å®˜æ–¹ç™½çš®ä¹¦ã€?
  3. Java Tuning White Paper 官方文æ¡£ã€?
  4. FAQ about Garbage Collection in the Hotspot  官方FAQåQŒJVM1.4.2ã€?
  5. Java HotSpot 虚拟æœÞZ¸­çš„垃圾收é›?/font> JavaOne2004上的中文ppt
  6. A Collection of JVM Options JVM选项的超完整攉™›†ã€?

二、基本概�/strong>

1、堆(Heap)

JVM½Ž¡ç†çš„内存叫堆。在32Bit操作¾pȝ»Ÿä¸Šæœ‰1.5G-2G的限åˆÓž¼Œè€?4Bit的就没有ã€?

JVM初始分配的内存由-Xms指定åQŒé»˜è®¤æ˜¯ç‰©ç†å†…å­˜çš?/64但小äº?Gã€?

JVM最大分配的内存ç”?Xmx指定åQŒé»˜è®¤æ˜¯ç‰©ç†å†…å­˜çš?/4但小äº?Gã€?

默认½IÞZ½™å †å†…存小äº?0%æ—Óž¼ŒJVMž®×ƒ¼šå¢žå¤§å †ç›´åˆ?Xmx的最大限åˆÓž¼Œå¯ä»¥ç”?XX:MinHeapFreeRatio=指定ã€?
默认½IÞZ½™å †å†…存大äº?0%æ—Óž¼ŒJVM会减ž®‘堆直到-Xms的最ž®é™åˆÓž¼Œå¯ä»¥ç”?XX:MaxHeapFreeRatio=指定ã€?

服务器一般设¾|?Xmsã€?Xmx相等以避免在每次GC 后调整堆的大ž®ï¼Œæ‰€ä»¥ä¸Šé¢çš„两个参数没啥用ã€?nbsp;

2.基本攉™›†½Ž—法

  1. 复制åQšå°†å †å†…分成两个相同½Iºé—´åQŒä»Žæ ?ThreadLocal的对象,静态对象)开始访问每一个关联的‹z»è·ƒå¯¹è±¡åQŒå°†½Iºé—´A的活跃对象全部复制到½Iºé—´BåQŒç„¶åŽä¸€‹Æ¡æ€§å›žæ”¶æ•´ä¸ªç©ºé—´Aã€?br /> å› äØ“åªè®¿é—®æ´»è·ƒå¯¹è±¡ï¼Œž®†æ‰€æœ‰æ´»åŠ¨å¯¹è±¡å¤åˆ¶èµ°ä¹‹åŽž®±æ¸…½Iºæ•´ä¸ªç©ºé—ß_¼Œä¸ç”¨åŽ»è®¿é—®æ­»å¯¹è±¡åQŒæ‰€ä»¥éåŽ†ç©ºé—´çš„æˆæœ¬è¾ƒå°åQŒä½†éœ€è¦å·¨å¤§çš„复制成本和较多的内存ã€?
  2. 标记清除(mark-sweep)åQ?/strong>攉™›†å™¨å…ˆä»Žæ ¹å¼€å§‹è®¿é—®æ‰€æœ‰æ´»è·ƒå¯¹è±¡ï¼Œæ ‡è®°ä¸ºæ´»è·ƒå¯¹è±¡ã€‚然后再遍历一‹Æ¡æ•´ä¸ªå†…存区域,把所有没有标记活跃的对象˜q›è¡Œå›žæ”¶å¤„理。该½Ž—法遍历整个½Iºé—´çš„æˆæœ¬è¾ƒå¤§æš‚停时间随½Iºé—´å¤§å°¾U¿æ€§å¢žå¤§ï¼Œè€Œä¸”整理后堆里的¼„Žç‰‡å¾ˆå¤šã€?
  3. 标记整理(mark-sweep-compact)åQ?/strong>¾l¼åˆäº†ä¸Š˜qîC¸¤è€…的做法和优点,先标记活跃对象,然后ž®†å…¶åˆåƈ成较大的内存块ã€?

    可见åQŒæ²¡æœ‰å…è´¹çš„午餐åQŒæ— è®ºé‡‡ç”¨å¤åˆ¶è¿˜æ˜¯æ ‡è®°æ¸…除算法,自动的东襉Kƒ½è¦ä»˜å‡ºå¾ˆå¤§çš„æ€§èƒ½ä»£ä­hã€?

3.分代

    分代是Java垃圾攉™›†çš„一大亮点,æ ÒŽ®å¯¹è±¡çš„ç”Ÿå‘½å‘¨æœŸé•¿çŸ­ï¼ŒæŠŠå †åˆ†äØ“3个代åQšYoungåQŒOldå’ŒPermanentåQŒæ ¹æ®ä¸åŒä»£çš„特炚w‡‡ç”¨ä¸åŒçš„æ”‰™›†½Ž—法åQŒæ‰¬é•‰K¿çŸ­ä¹Ÿã€?

Young(Nursery)åQŒå¹´è½ÖM»£ã€‚ç ”½I¶è¡¨æ˜Žå¤§éƒ¨åˆ†å¯¹è±¡éƒ½æ˜¯æœç”Ÿæš®æ­»åQŒéšç”Ÿéšç­çš„ã€‚å› æ­¤æ‰€æœ‰æ”¶é›†å™¨éƒ½äØ“òq´è½»ä»£é€‰æ‹©äº†å¤åˆ¶ç®—法ã€?br />     复制½Ž—法优点是只讉K—®‹z»è·ƒå¯¹è±¡åQŒç¼ºç‚ÒŽ˜¯å¤åˆ¶æˆæœ¬é«˜ã€‚因为年è½ÖM»£åªæœ‰ž®‘量的对象能熬到垃圾攉™›†åQŒå› æ­¤åªéœ€ž®‘量的复制成本。而且复制攉™›†å™¨åªè®‰K—®‹z»è·ƒå¯¹è±¡åQŒå¯¹é‚£äº›å äº†æœ€å¤§æ¯”率的æ­Õd¯¹è±¡è§†è€Œä¸è§ï¼Œå……分发挥了它遍历½Iºé—´æˆæœ¬ä½Žçš„优点ã€?

    Young的默认å€égØ“4MåQŒéšå †å†…存增大,¾U¦äØ“1/15åQŒJVM会根据情况动态管理其大小变化ã€?br />     -XX:NewRatio= 参数可以讄¡½®Young与Old的大ž®æ¯”例,-serveræ—‰™»˜è®¤äØ“1:2åQŒä½†å®žé™…上young启动时远低于˜q™ä¸ªæ¯”率åQŸå¦‚果信不过JVMåQŒä¹Ÿå¯ä»¥ç”?Xmn¼‹¬æ€§è§„定其大小åQŒæœ‰æ–‡æ¡£æŽ¨èè®¾äØ“Heapæ€Õd¤§ž®çš„1/4ã€?

    Young的大ž®éžå¸”Ržå¸”R‡è¦ï¼Œè§?#8220;后面暂停旉™—´ä¼˜å…ˆæ”‰™›†å™?#8221;的论˜q°ã€?

    Young里面又分ä¸?个区域,一个EdenåQŒæ‰€æœ‰æ–°å»ºå¯¹è±¡éƒ½ä¼šå­˜åœ¨äºŽè¯¥åŒºåQŒä¸¤ä¸ªSurvivor区,用来实施复制½Ž—法。每‹Æ¡å¤åˆ¶å°±æ˜¯å°†Eden和第一块Survior的活对象复制到第2块,然后清空Eden与第一块Survior。Eden与Survivor的比例由-XX:SurvivorRatio=讄¡½®åQŒé»˜è®¤äØ“32。Survivio大了会浪费,ž®äº†çš„话åQŒä¼šä½¿ä¸€äº›å¹´è½Õd¯¹è±¡æ½œé€ƒåˆ°è€äh区,引è“v老äh区的不安åQŒä½†˜q™ä¸ªå‚æ•°å¯ÒŽ€§èƒ½òq¶ä¸é‡è¦ã€?nbsp;

Old(Tenured)åQŒå¹´è€ä»£ã€‚å¹´è½ÖM»£çš„对象如果能够挺˜q‡æ•°‹Æ¡æ”¶é›†ï¼Œž®×ƒ¼š˜q›å…¥è€äh区。老ähåŒÞZ‹Éç”¨æ ‡è®°æ•´ç†ç®—æ³•ã€‚å› ä¸ø™€äh区的对象都没那么å®ÒŽ˜“æ­Èš„åQŒé‡‡ç”¨å¤åˆ¶ç®—法就要反复的复制对象åQŒå¾ˆä¸åˆ½Ž—,只好采用标记清理½Ž—法åQŒä½†æ ‡è®°æ¸…理½Ž—法其实也不è½ÀL¾åQŒæ¯‹Æ¡éƒ½è¦éåŽ†åŒºåŸŸå†…æ‰€æœ‰å¯¹è±¡ï¼Œæ‰€ä»¥è¿˜æ˜¯æ²¡æœ‰å…è´¹çš„åˆé¤å•Šã€?

-XX:MaxTenuringThreshold=讄¡½®ç†¬è¿‡òq´è½»ä»£å¤šž®‘次攉™›†åŽç§»å…¥è€äh区,CMSä¸­é»˜è®¤äØ“0åQŒç†¬˜q‡ç¬¬ä¸€‹Æ¡GCž®Þp{入,可以ç”?XX:+PrintTenuringDistribution查看ã€?

PermanentåQŒæŒä¹…代ã€?/strong>装蝲Class信息½{‰åŸº¼‹€æ•°æ®åQŒé»˜è®?4MåQŒå¦‚果是¾cÕd¾ˆå¤šå¾ˆå¤šçš„æœåŠ¡½E‹åºåQŒéœ€è¦åŠ å¤§å…¶è®„¡½®-XX:MaxPermSize=åQŒå¦åˆ™å®ƒæ»¡äº†ä¹‹åŽä¼šå¼•èµ·fullgc()或Out of Memoryã€?注意SpringåQŒHibernate˜q™ç±»å–œæ¬¢AOP动态生成类的框枉™œ€è¦æ›´å¤šçš„æŒä¹…代内存ã€?

4.minor/major collection

    每个代满了之后都会促发collectionåQŒï¼ˆå¦å¤–Concurrent Low Pause Collector默认在老ähåŒ?8%的时候促å?。GC用较高的频率对young˜q›è¡Œæ‰«æå’Œå›žæ”Óž¼Œ˜q™ç§å«åšminor collectionã€?br /> 而因为成本关¾pÕd¯¹Old的检查回攉™¢‘率要低很多,同时对Youngå’ŒOld的收集称为major collectionã€?br />     System.gc()会引发major collectionåQŒä‹Éç”?XX:+DisableExplicitGC¼›æ­¢å®ƒï¼Œæˆ–设为CMSòq¶å‘-XX:+ExplicitGCInvokesConcurrentã€?

5.ž®ç»“

Young -- minor collection -- 复制½Ž—法

Old(Tenured) -- major colletion -- 标记清除/标记整理½Ž—法

三、收集器

1.古老的串行攉™›†å™?Serial Collector)

    使用 -XX:+UseSerialGCåQŒç­–ç•¥äØ“òq´è½»ä»£ä¸²è¡Œå¤åˆÓž¼Œòq´è€ä»£ä¸²è¡Œæ ‡è®°æ•´ç†ã€?

2.吞吐量优先的òq¶è¡Œæ”‰™›†å™?Throughput Collector)

    使用 -XX:+UseParallelGC åQŒä¹Ÿæ˜¯JDK5 -server的默认倹{€‚ç­–ç•¥äØ“åQ?br />     1.òq´è½»ä»£æš‚停应用程序,多个垃圾攉™›†¾U¿ç¨‹òq¶è¡Œçš„复制收集,¾U¿ç¨‹æ•°é»˜è®¤äØ“CPU个数åQŒCPU很多æ—Óž¼Œå¯ç”¨–XX:ParallelGCThreads=减少¾U¿ç¨‹æ•°ã€?br />     2.òq´è€ä»£æš‚停应用½E‹åºåQŒä¸Žä¸²è¡Œæ”‰™›†å™¨ä¸€æ øP¼Œå•垃圾收集线½E‹æ ‡è®°æ•´ç†ã€?

    所以需è¦?+çš„CPU时才会优于串行收集器åQŒé€‚用于后台处理,¿U‘学计算ã€?

    可以使用-XX:MaxGCPauseMillis= å’?-XX:GCTimeRatio 来调整GC的时间ã€?

3.暂停旉™—´ä¼˜å…ˆçš„åÆˆå‘æ”¶é›†å™¨(Concurrent Low Pause Collector-CMS)

    前面说了˜q™ä¹ˆå¤šï¼Œéƒ½æ˜¯ä¸ÞZº†˜q™èŠ‚åšé“ºåž?.....

    使用-XX:+UseConcMarkSweepGCåQŒç­–ç•¥äØ“åQ?br />     1.òq´è½»ä»£åŒæ äh˜¯æš‚停应用½E‹åºåQŒå¤šä¸ªåžƒåœ¾æ”¶é›†çº¿½E‹åƈ行的复制攉™›†ã€?br />     2.òq´è€ä»£åˆ™åªæœ‰ä¸¤‹Æ¡çŸ­æš‚停åQŒå…¶ä»–时间应用程序与攉™›†¾U¿ç¨‹òq¶å‘的清除ã€?

3.1 òq´è€ä»£è¯¦è¿°

    òq¶è¡Œ(Parallel)ä¸ŽåÆˆå?Concurrent)仅一字之差,òq¶è¡ŒæŒ‡å¤šæ¡åžƒåœ¾æ”¶é›†çº¿½E‹åƈ行,òq¶å‘指用æˆïLº¿½E‹ä¸Žåžƒåœ¾æ”‰™›†¾U¿ç¨‹òq¶å‘åQŒç¨‹åºåœ¨¾l§ç®‹˜qè¡ŒåQŒè€Œåžƒåœ¾æ”¶é›†ç¨‹åºè¿è¡ŒäºŽå¦ä¸€ä¸ªä¸ªCPU上ã€?

    òq¶å‘攉™›†ä¸€å¼€å§‹ä¼šå¾ˆçŸ­æš‚的停止一‹Æ¡æ‰€æœ‰çº¿½E‹æ¥å¼€å§‹åˆå§‹æ ‡è®°æ ¹å¯¹è±¡åQŒç„¶åŽæ ‡è®°çº¿½E‹ä¸Žåº”用¾U¿ç¨‹ä¸€èµ·åƈ发运行,最后又很短的暂停一‹Æ¡ï¼Œå¤šçº¿½E?strong>òq¶è¡Œçš„重新标è®îC¹‹å‰å¯èƒ½å› ä¸ºåƈ发而漏掉的对象åQŒç„¶åŽå°±å¼€å§‹ä¸Žåº”用½E‹åºòq¶å‘的清除过½E‹ã€‚可见,最长的两个遍历˜q‡ç¨‹éƒ½æ˜¯ä¸Žåº”ç”¨ç¨‹åºåÆˆå‘æ‰§è¡Œçš„åQŒæ¯”以前的串行算法改˜q›å¤ªå¤šå¤ªå¤šäº†åQï¼åQ?

    串行标记清除是等òq´è€ä»£æ»¡äº†å†å¼€å§‹æ”¶é›†çš„åQŒè€ŒåÆˆå‘æ”¶é›†å› ä¸ø™¦ä¸Žåº”用程序一赯‚¿è¡Œï¼Œå¦‚果满了才收集,应用½E‹åºž®±æ— å†…存可用åQŒæ‰€ä»¥ç³»¾lŸé»˜è®?8%满的时候就开始收集。内存已讑־—较大åQŒåƒå†…存又没有这么快的时候,可以ç”?XX:CMSInitiatingOccupancyFraction=恰当增大该比率ã€?

3.2 òq´è½»ä»£è¯¦˜q?/strong>

   å¯æƒœå¯¹å¹´è½ÖM»£çš„复制收集,依然必须停止所有应用程序线½E‹ï¼ŒåŽŸç†å¦‚æ­¤åQŒåªèƒ½é å¤šCPUåQŒå¤šæ”‰™›†¾U¿ç¨‹òq¶å‘来提高收集速度åQŒä½†é™¤éžä½ çš„Server独占整台服务器,否则如果服务器上本èín˜q˜æœ‰å¾ˆå¤šå…¶ä»–¾U¿ç¨‹æ—Óž¼Œåˆ‡æ¢èµäh¥é€Ÿåº¦ž®?.... 所以,搞到最后,暂停旉™—´çš„瓶颈就落在了年è½ÖM»£çš„复制算法上ã€?

    å› æ­¤Young的大ž®è®¾¾|®æŒºé‡è¦çš„,大点ž®×ƒ¸ç”¨é¢‘¾JGCåQŒè€Œä¸”增大GC的间隔后åQŒå¯ä»¥è®©å¤šç‚¹å¯¹è±¡è‡ªå·±æ­ÀLŽ‰è€Œä¸ç”¨å¤åˆ¶äº†ã€‚ä½†Young增大æ—Óž¼ŒGC造成的停™å¿æ—¶é—´æ”€å‡å¾—非常恐怖,比如在我的机器上åQŒé»˜è®?Mçš„YoungåQŒåªéœ€è¦å‡ æ¯«ç§’的时é—ß_¼Œ64Mž®±å‡åˆ?0毫秒åQŒè€Œå‡åˆ?56Mæ—Óž¼Œž®Þp¦åˆ?00æ¯«ç§’äº†ï¼Œå³°å€ÆD¿˜ä¼šæ”€åˆ°ææ€–çš„800ms。谁叫复制算法,要等Young满了才开始收集,开始收集就要停止所有线½E‹å‘¢ã€?

3.3 持久�/strong>

可设¾|?XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabledåQŒä‹ÉCMS攉™›†æŒä¹…代的¾c»ï¼Œè€Œä¸æ˜¯fullgcåQŒnetbeans5.5 performance文档的推荐ã€?/code>

4.增量(train½Ž—法)攉™›†å™?Incremental Collector)

已停止维护,–Xincgcé€‰é¡¹é»˜è®¤è½¬äØ“òq¶å‘攉™›†å™¨ã€?

四、暂停时间显½C?/strong>

 åŠ å…¥ä¸‹åˆ—å‚æ•° (请将PrintGCå’ŒDetails中间的空格去掉,CSDNå¾ˆæ€ªçš„è®¤äØ“æ˜¯ç¦æ­¢å­—å¥ï¼‰ 

-verbose:gc -XX:+PrintGC Details  -XX:+PrintGCTimeStamps

会程序运行过½E‹ä¸­ž®†æ˜¾½Cºå¦‚下输å‡?

 9.211: [GC 9.211: [ParNew: 7994K->0K(8128K), 0.0123935 secs] 427172K->419977K(524224K), 0.0125728 secs]

 æ˜„¡¤ºåœ¨ç¨‹åºè¿è¡Œçš„9.211¿U’发生了Minor的垃圾收集,前一ŒD‰|•°æ®é’ˆå¯ÒŽ–°ç”ŸåŒºåQŒä»Ž7994k整理ä¸?kåQŒæ–°ç”ŸåŒºæ€Õd¤§ž®äØ“8128kåQŒç¨‹åºæš‚停了12msåQŒè€ŒåŽä¸€ŒD‰|•°æ®é’ˆå¯ÒŽ•´ä¸ªå †ã€?

对于òq´è€ä»£çš„æ”¶é›†ï¼Œæš‚停发生在下面两个阶ŒDµï¼ŒCMS-remark的中断是17毫秒åQ?

[GC [1 CMS-initial-mark: 80168K(196608K)] 81144K(261184K), 0.0059036 secs] 

[1 CMS-remark: 80168K(196608K)] 82493K(261184K),0.0168943 secs]

再加两个参数 -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTimeå¯ÒŽš‚停时间看得更清晰ã€?

五、真正不停的BEA JRockit 与Sun RTS2.0

   Beaçš?a >JRockit 5.0 R27 的特色之一是动态决定的垃圾攉™›†½{–ç•¥åQŒç”¨æˆ·å¯ä»¥å†³å®šè‡ªå·±å…³å¿ƒçš„æ˜¯åžåé‡åQŒæš‚停时间还是确定的暂停旉™—´åQŒå†ç”±JVM在运行时动态决定、改变改变垃圾收集策略ã€?br />    
   它的Deterministic GC的选项æ˜?Xgcprio: deterministicåQŒå·¿U°å¯ä»¥æŠŠæš‚停可以控制åœ?0-30毫秒åQŒéžå¸¸çš„牛,一句Deterministic道尽了RealTime的真谛ã€?不过¾l†çœ‹ä¸€ä¸‹æ–‡æ¡£ï¼Œ30ms的测试环境是1 GB heap å’?òq›_‡  30% 的活跃对è±?也就æ˜?00M)‹zÕdŠ¨å¯¹è±¡åQ? ä¸?Xeon 3.6 GHz  4G内存 åQŒæˆ–者是4 个Xeon 2.0 GHzåQ?G内存ã€?

  最可惜JRocktçš„license很奇怪,虽然òqÏx—¶ä½¿ç”¨å…è´¹åQŒä½†˜q™ä¸ª30ms的选项ž®±éœ€è¦è´­ä¹°æ•´ä¸ªWeblogic Real Time Serverçš„licenseã€?nbsp;

  å…¶ä»–免费选项åQŒæœ‰åQ?/p>

  • -Xgcprio:pausetime -Xpausetarget=210ms 
      å› äؓ免费åQŒæ‰€ä»¥æœ€ä½Žåªèƒ½è®¾¾|®åˆ°200ms pause targetã€?nbsp;200ms是Sunè®¤äØ“Real-Time的分界线ã€?
  • -Xgc:gencon
    普通的òq¶å‘做法åQŒæ•ˆçŽ‡ä¹Ÿä¸é”™ã€?

  JavaOne2007上有Sunçš?Java Real-Time System 2.0 的介¾lï¼ŒRTS2.0åŸÞZºŽJDK1.5åQŒåœ¨Real-Time  Garbage Collctor上又有改˜q›ï¼Œä½†è¿˜åœ¨beta版状态,只供¾l™OEMåQŒæ›´æ€ªã€?

六、JDK 6.0的改˜q?/strong>

因䨓JDK5.0在Young较大时的表现˜q˜æ˜¯ä¸å¤Ÿè®©äh满意åQŒåˆ¾l§ç®‹çœ‹JDK6.0的改˜q›ï¼Œ¾l“æžœ½Eç¨å¤±æœ›åQŒä¸æ¶‰åŠæˆ‘最头痛的年è½ÖM»£å¤åˆ¶æ”‰™›†æ”¹è‰¯ã€?

1.òq´è€ä»£çš„æ ‡è¯?清除攉™›†åQŒåƈ行执行标è¯?/strong>
  JDK5.0只开了一条收集进½E‹ä¸Žåº”用¾U¿ç¨‹òq¶å‘标识åQŒè€?.0可以开多条攉™›†¾U¿ç¨‹æ¥åšæ ‡è¯†åQŒç¾ƒçŸ­æ ‡è¯†è€äh区所有活动对象的旉™—´ã€?

2.加大了Young区的默认大小
默认大小ä»?M加到16MåQŒä»Žå †å†…存的1/15增加åˆ?/7

3.System.gc()å¯ä»¥ä¸Žåº”ç”¨ç¨‹åºåÆˆå‘æ‰§è¡?/strong>
使用-XX:+ExplicitGCInvokesConcurrent 讄¡½®

七、小¾l?/strong>

1. JDK5.0/6.0

对于服务器应用,我们使用Concurrent Low Pause CollectoråQŒå¯¹òq´è½»ä»£ï¼Œæš‚停时多¾U¿ç¨‹òq¶è¡Œå¤åˆ¶æ”‰™›†åQ›å¯¹òq´è€ä»£åQŒæ”¶é›†å™¨ä¸Žåº”ç”¨ç¨‹åºåÆˆè¡Œæ ‡è®?-整理攉™›†åQŒä»¥è¾‘Öˆ°ž®½é‡çŸ­çš„垃圾攉™›†æ—‰™—´ã€?

本着没有深刻‹¹‹è¯•前不要胡ä¹×ƒ¼˜åŒ–的宗旨åQŒå‘½ä»¤è¡Œå±žæ€§åªéœ€½Ž€å•写为:

-server -Xms<heapsize>M -Xmx<heapsize>M -XX:+UseConcMarkSweepGC  -XX:+PrintGC Details  -XX:+PrintGCTimeStamps

然后要根据应用的情况åQŒåœ¨‹¹‹è¯•软äšg辅助可以下看看有没有JVM的默认值和自动½Ž¡ç†åšçš„不够的地方可以调æ•ß_¼Œå¦?xmn 设Young的大ž®ï¼Œ-XX:MaxPermSize设持久代大小½{‰ã€?

2. JRockit 6.0 R27.2

但因为JDK5的测试结果实在不能满意,后来又尝试了JRockitåQŒæ€ÖM½“效果要好些ã€?br />  JRockit的特ç‚ÒŽ˜¯åŠ¨æ€åžƒåœ¾æ”¶é›†å™¨æ˜¯æ ¹æ®ç”¨æˆ·å…³å¿ƒçš„ç‰¹å¾åŠ¨æ€å†³å®šæ”¶é›†ç®—æ³•çš„åQŒå‚数如ä¸?/p>

 -Xms<heapsize>M -Xmx<heapsize>M -Xgcprio:pausetime -Xpausetarget=200ms -XgcReport -XgcPause -Xverbose:memory


]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º Îâ½­ÊÐ| ÓÀÐËÏØ| ¸·³ÇÏØ| ÖÛÇúÏØ| ×ÓÖÞÏØ| ÓÀÖÝÊÐ| Ñ·¿ËÏØ| Ä«ÍÑÏØ| ÌØ¿ËË¹ÏØ| ÄÏÕÙÏØ| ººÔ´ÏØ| µ¤·ïÏØ| »ÆÁúÏØ| ÓàÇìÏØ| ±£¿µÏØ| ÁijÇÊÐ| ÖÜÄþÏØ| ÆÁÄÏÏØ| °×³ÇÊÐ| ¸·ÐÂÊÐ| µü²¿ÏØ| ÎÞé¦ÏØ| ÐÐÌÆÏØ| ÎÚÇ¡ÏØ| ¶«Ã÷ÏØ| ·áÏØ| Ò˾ýÏØ| Ì¨Ç°ÏØ| ³¤º£ÏØ| ÃÖ¶ÉÏØ| аͶû»¢ÓÒÆì| Í­ÁêÊÐ| Îâ´¨ÊÐ| Í¼Ä¾Êæ¿ËÊÐ| ÇɼÒÏØ| ¿ªÔ¶ÊÐ| ¹ãºÓÏØ| н®| ÊæÀ¼ÊÐ| Ò˶¼ÊÐ| ºâÉ½ÏØ|