ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>
$sudo ln -s uming.ttc uming.ttf 阅读全文
2.Override the clone method
2.1 Make the clone method to public method
2.2 Call super.clone() to produce the new object
2.3 Clone members 阅读全文
  http://www.matrix.org.cn/resource/article/43/43769_JVM_GC_PDM.html
1.JVM�/span>gc概述
  gcå›_žƒåœ¾æ”¶é›†æœºåˆ¶æ˜¯æŒ?/span>jvm用于释放那些ä¸å†ä½¿ç”¨çš„对象所å 用的内å˜ã€?/span>javaè¯è¨€òq¶ä¸è¦æ±‚jvmæœ?/span>gcåQŒä¹Ÿæ²¡æœ‰è§„定gc如何工作。丘q‡å¸¸ç”¨çš„jvm都有gcåQŒè€Œä¸”大多æ•?/span>gc都ä‹É用类似的½Ž—法½Ž¡ç†å†…å˜å’Œæ‰§è¡Œæ”¶é›†æ“作ã€?/span>
  在充分ç†è§£äº†åžƒåœ¾æ”‰™›†½Ž—法和执行过½E‹åŽåQŒæ‰èƒ½æœ‰æ•ˆçš„优化它的性能。有些垃圾收集专用于ç‰ÒŽ®Šçš„应用程åºã€‚比如,实时应用½E‹åºä¸»è¦æ˜¯äؓ了é¿å…åžƒåœ¾æ”¶é›†ä¸æ–,而大多数OLTP应用½E‹åºåˆ™æ³¨é‡æ•´ä½“效率。ç†è§£äº†åº”用½E‹åºçš„工作负è·å’Œjvm支æŒçš„垃圾收集算法,便å¯ä»¥è¿›è¡Œä¼˜åŒ–é…¾|®åžƒåœ¾æ”¶é›†å™¨ã€?/span>
  垃圾攉™›†çš„目的在于清除ä¸å†ä‹É用的对象ã€?/span>gc通过¼‹®å®šå¯¹è±¡æ˜¯å¦è¢«æ´»åŠ¨å¯¹è±¡å¼•ç”¨æ¥¼‹®å®šæ˜¯å¦æ”‰™›†è¯¥å¯¹è±¡ã€?/span>gc首先è¦åˆ¤æ–è¯¥å¯¹è±¡æ˜¯å¦æ˜¯æ—¶å€™å¯ä»¥æ”¶é›†ã€‚两¿U常用的æ–ÒŽ³•是引用计数和对象引用é历ã€?/span>
1.1.引用计数
  引用计数å˜å‚¨å¯¹ç‰¹å®šå¯¹è±¡çš„æ‰€æœ‰å¼•用数åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œå½“应用程åºåˆ›å»ºå¼•用以åŠå¼•ç”¨è¶…å‡ø™Œƒå›´æ—¶åQ?/span>jvm必须适当增å‡å¼•用数。当æŸå¯¹è±¡çš„引用æ•îCØ“0æ—Óž¼Œä¾¿å¯ä»¥è¿›è¡Œåžƒåœ¾æ”¶é›†ã€?/span>
1.2.对象引用é历
  早期çš?/span>jvm使用引用计数åQŒçŽ°åœ¨å¤§å¤šæ•°jvm采用对象引用é历。对象引用é历从一¾l„å¯¹è±¡å¼€å§‹ï¼Œæ²¿ç€æ•´ä¸ªå¯¹è±¡å›¾ä¸Šçš„æ¯æ¡é“¾æŽ¥ï¼Œé€’å½’¼‹®å®šå¯åˆ°è¾¾ï¼ˆreachableåQ‰çš„对象。如果æŸå¯¹è±¡ä¸èƒ½ä»Žè¿™äº›æ ¹å¯¹è±¡çš„一个(臛_°‘一个)到达åQŒåˆ™ž®†å®ƒä½œäؓ垃圾攉™›†ã€‚在对象é历阶段åQ?/span>gcå¿…é¡»è®îC½å“ªäº›å¯¹è±¡å¯ä»¥åˆ°è¾¾åQŒä»¥ä¾¿åˆ 除ä¸å¯åˆ°è¾„¡š„对象åQŒè¿™¿UîCØ“æ ‡è®°åQ?/span>markingåQ‰å¯¹è±¡ã€?/span>
  下一æ¥ï¼Œgcè¦åˆ 除ä¸å¯åˆ°è¾„¡š„å¯¹è±¡ã€‚åˆ é™¤æ—¶åQŒæœ‰äº?/span>gcåªæ˜¯½Ž€å•的扫æå †æ ˆåQŒåˆ é™¤æœªæ ‡è®°çš„å¯¹è±¡ï¼Œòq‰™‡Šæ”‘Ö®ƒä»¬çš„内å˜ä»¥ç”Ÿæˆæ–°çš„对象,˜q™å«åšæ¸…é™¤ï¼ˆsweepingåQ‰ã€‚è¿™¿U方法的问题在于内å˜ä¼šåˆ†æˆå¥½å¤šå°ŒDµï¼Œè€Œå®ƒä»¬ä¸‘³ä»¥ç”¨äºŽæ–°çš„对象åQŒä½†æ˜¯ç»„åˆè“væ¥å´å¾ˆå¤§ã€‚å› æ¤ï¼Œè®¸å¤šgcå¯ä»¥é‡æ–°¾l„织内å˜ä¸çš„对象åQŒåƈ˜q›è¡ŒåŽ‹ç¾ƒåQ?/span>compactåQ‰ï¼Œå½¢æˆå¯åˆ©ç”¨çš„½Iºé—´ã€?/span>
  为æ¤åQ?/span>gc需è¦åœæ¢å…¶ä»–çš„‹zÕdŠ¨ã€‚è¿™¿U方法æ„å‘³ç€æ‰€æœ‰ä¸Žåº”用½E‹åºç›¸å…³çš„å·¥ä½œåœæ¢ï¼Œåªæœ‰gc˜q行。结果,在å“应期间增å‡äº†è®¸å¤šæ·äh‚è¯äh±‚。å¦å¤–ï¼Œæ›´å¤æ‚çš„gc䏿–å¢žåŠ æˆ–åŒæ—¶è¿è¡Œä»¥å‡å°‘或者清除应用程åºçš„䏿–。有çš?/span>gc使用å•线½E‹å®Œæˆè¿™™å¹å·¥ä½œï¼Œæœ‰çš„则采用多¾U¿ç¨‹ä»¥å¢žåŠ æ•ˆçŽ‡ã€?/span>
2.å‡ ç§åžƒåœ¾å›žæ”¶æœºåˆ¶
2.1.æ ‡è®°åQ清除收集器
  ˜q™ç§æ”‰™›†å™¨é¦–å…ˆé历对象图òq¶æ ‡è®°å¯åˆ°è¾¾çš„å¯¹è±¡ï¼Œç„¶åŽæ‰«æå †æ ˆä»¥å¯»æ‰¾æœªæ ‡è®°å¯¹è±¡òq‰™‡Šæ”‘Ö®ƒä»¬çš„内å˜ã€‚è¿™¿U收集器一般ä‹É用啾U¿ç¨‹å·¥ä½œòq¶åœæ¢å…¶ä»–æ“作ã€?/span>
2.2.æ ‡è®°åQ压¾~©æ”¶é›†å™¨
ã€€ã€€æœ‰æ—¶ä¹Ÿå«æ ‡è®°åQ清除ï¼åŽ‹ç¾ƒæ”‰™›†å™¨ï¼Œä¸Žæ ‡è®ŽÍ¼æ¸…除攉™›†å™¨æœ‰ç›¸åŒçš„æ ‡è®°é˜¶ŒDüc€‚在½W¬äºŒé˜¶æ®µåQŒåˆ™æŠŠæ ‡è®°å¯¹è±¡å¤åˆ¶åˆ°å †æ ˆçš„æ–°åŸŸä¸ä»¥ä¾¿åŽ‹ç¾ƒå †æ ˆã€‚è¿™¿Uæ”¶é›†å™¨ä¹Ÿåœæ¢å…¶ä»–æ“作ã€?/span>
2.3.å¤åˆ¶æ”‰™›†å™?/span>
  ˜q™ç§æ”‰™›†å™¨å°†å †æ ˆåˆ†äؓ两个域,常称为劽Iºé—´ã€‚毋ơ仅使用一åŠçš„½Iºé—´åQ?/span>jvm生æˆçš„æ–°å¯¹è±¡åˆ™æ”¾åœ¨å¦ä¸€åŠç©ºé—´ä¸ã€?/span>gc˜q行æ—Óž¼Œå®ƒæŠŠå¯åˆ°è¾‘Ö¯¹è±¡å¤åˆ¶åˆ°å¦ä¸€åŠç©ºé—ß_¼Œä»Žè€ŒåŽ‹¾~©äº†å †æ ˆã€‚è¿™¿U方法适用于çŸç”Ÿå˜æœŸçš„对象åQŒæŒ¾lå¤åˆ‰™•¿ç”Ÿå˜æœŸçš„对象则导致效率é™ä½Žã€?/span>
2.4.å¢žé‡æ”‰™›†å™?/strong>
ã€€ã€€å¢žé‡æ”‰™›†å™¨æŠŠå †æ ˆåˆ†äØ“å¤šä¸ªåŸŸï¼Œæ¯æ¬¡ä»…从一个域攉™›†åžƒåœ¾ã€‚è¿™ä¼šé€ æˆè¾ƒå°çš„应用程åºä¸æ–ã€?/span>
2.5.分代攉™›†å™?/strong>
  ˜q™ç§æ”‰™›†å™¨æŠŠå †æ ˆåˆ†äؓ两个或多个域åQŒç”¨ä»¥å˜æ”¾ä¸åŒå¯¿å‘½çš„对象ã€?/span>jvm生æˆçš„æ–°å¯¹è±¡ä¸€èˆ¬æ”¾åœ¨å…¶ä¸çš„æŸä¸ªåŸŸä¸ã€‚过一ŒD‰|—¶é—ß_¼Œ¾l§ç®‹å˜åœ¨çš„å¯¹è±¡å°†èŽ·å¾—ä½¿ç”¨æœŸåÆˆè½¬å…¥æ›´é•¿å¯¿å‘½çš„åŸŸä¸ã€‚分代收集器对ä¸åŒçš„域ä‹É用ä¸åŒçš„½Ž—法以优化性能ã€?/span>
2.6.òq¶å‘攉™›†å™?/strong>
  òq¶å‘攉™›†å™¨ä¸Žåº”用½E‹åºåŒæ—¶˜q行。这些收集器在æŸç‚¹ä¸ŠåQˆæ¯”如压¾~©æ—¶åQ‰ä¸€èˆ¬éƒ½ä¸å¾—ä¸åœæ¢å…¶ä»–æ“作以完æˆç‰¹å®šçš„ä“QåŠ¡ï¼Œä½†æ˜¯å› äØ“å…¶ä»–åº”ç”¨½E‹åºå¯è¿›è¡Œå…¶ä»–çš„åŽå°æ“作åQŒæ‰€ä»¥ä¸æ–其他处ç†çš„实际旉™—´å¤§å¤§é™ä½Žã€?/span>
2.7.òq¶è¡Œæ”‰™›†å™?/strong>
  òq¶è¡Œæ”‰™›†å™¨ä‹É用柿Uä¼ ¾lŸçš„½Ž—法òq¶ä‹É用多¾U¿ç¨‹òq¶è¡Œçš„æ‰§è¡Œå®ƒä»¬çš„工作。在å¤?/span>cpu机器上ä‹É用多¾U¿ç¨‹æŠ€æœ¯å¯ä»¥æ˜¾è‘—çš„æé«˜java应用½E‹åºçš„坿‰©å±•性ã€?/span>
3.Sun HotSpot 1.4.1 JVMå †å¤§ž®çš„调整
  Sun HotSpot 1.4.1使用分代攉™›†å™¨ï¼Œå®ƒæŠŠå †åˆ†ä¸ÞZ¸‰ä¸ªä¸»è¦çš„åŸŸï¼šæ–°åŸŸã€æ—§åŸŸä»¥åŠæ°¸ä¹…域ã€?/span>Jvm生æˆçš„æ‰€æœ‰æ–°å¯¹è±¡æ”‘Öœ¨æ–°åŸŸä¸ã€‚一旦对象ç»åŽ†äº†ä¸€å®šæ•°é‡çš„垃圾攉™›†å¾ªçޝåŽï¼Œä¾¿èŽ·å¾—ä‹É用期òq¶è¿›å…¥æ—§åŸŸã€‚åœ¨æ°æ€¹…域ä¸jvm则å˜å‚?/span>classå’?/span>method对象。就é…置而言åQŒæ°¸ä¹…域是一个独立域òq¶ä¸”ä¸è®¤ä¸ºæ˜¯å †çš„一部分ã€?/span>
  下é¢ä»‹ç»å¦‚何控制˜q™äº›åŸŸçš„大å°ã€‚å¯ä½¿ç”¨-Xmså’?/span>-Xmx æŽ§åˆ¶æ•´ä¸ªå †çš„åŽŸå§‹å¤§å°æˆ–最大倹{€?/span>
下é¢çš„命令是把åˆå§‹å¤§ž®è®¾¾|®äØ“128MåQ?/span>
  java –Xms128m
  –Xmx256m为控制新域的大å°åQŒå¯ä½¿ç”¨-XX:NewRatio讄¡½®æ–°åŸŸåœ¨å †ä¸æ‰€å 的比例ã€?/span>
  下é¢çš„å‘½ä»¤æŠŠæ•´ä¸ªå †è®¾¾|®æˆ128måQŒæ–°åŸŸæ¯”率设¾|®æˆ3åQŒå³æ–°åŸŸä¸Žæ—§åŸŸæ¯”例䨓1åQ?/span>3åQŒæ–°åŸŸäØ“å †çš„1/4æˆ?/span>32MåQ?/span>
  java –Xms128m –Xmx128m
  –XX:NewRatio =3å¯ä‹Éç”?/span>-XX:NewSizeå’?/span>-XX:MaxNewsize讄¡½®æ–°åŸŸçš„åˆå§‹å€¼å’Œæœ€å¤§å€¹{€?/span>
  下é¢çš„命令把新域的åˆå§‹å€¼å’Œæœ€å¤§å€ÆD®¾¾|®æˆ64m:
  java –Xms256m –Xmx256m –Xmn64m
ã€€ã€€æ°æ€¹…域默认大ž®äØ“4m。è¿è¡Œç¨‹åºæ—¶åQ?/span>jvm会调整永久域的大ž®ä»¥æ»¡èƒö需è¦ã€‚毋ơ调整时åQ?/span>jvmä¼šå¯¹å †è¿›è¡Œä¸€‹Æ¡å®Œå…¨çš„垃圾攉™›†ã€?/span>
  使用-XX:MaxPerSizeæ ‡å¿—æ¥å¢žåŠ æ°¸ä¹…åŸŸæå¤§ž®ã€‚在WebLogic Server应用½E‹åºåŠ è²è¾ƒå¤š¾cÀL—¶åQŒç»å¸”Rœ€è¦å¢žåŠ æ°¸ä¹…åŸŸçš„æœ€å¤§å€¹{€‚当jvmåŠ è²¾cÀL—¶åQŒæ°¸ä¹…域ä¸çš„å¯¹è±¡æ€¥å‰§å¢žåŠ åQŒä»Žè€Œä‹Éjvm䏿–è°ƒæ•´æ°æ€¹…域大ž®ã€‚äØ“äº†é¿å…è°ƒæ•ß_¼Œå¯ä‹Éç”?/span>-XX:PerSizeæ ‡å¿—è®„¡½®åˆå§‹å€¹{€?/span>
ä¸‹é¢æŠŠæ°¸ä¹…åŸŸåˆå§‹å€ÆD®¾¾|®æˆ32måQŒæœ€å¤§å€ÆD®¾¾|®æˆ64mã€?/span>
  java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m
  默认状æ€ä¸‹åQ?/span>HotSpot在新域ä¸ä½¿ç”¨å¤åˆ¶æ”‰™›†å™¨ã€‚该域一般分ä¸ÞZ¸‰ä¸ªéƒ¨åˆ†ã€‚第一部分ä¸?/span>EdenåQŒç”¨äºŽç”Ÿæˆæ–°çš„对象。å¦ä¸¤éƒ¨åˆ†ç§°ä¸ºæ•‘助空é—ß_¼Œå½?/span>Eden充满æ—Óž¼Œæ”‰™›†å™¨åœæ¢åº”用程åºï¼ŒæŠŠæ‰€æœ‰å¯åˆ°è¾¾å¯¹è±¡å¤åˆ¶åˆ°å½“å‰çš„from救助½Iºé—´åQŒä¸€æ—¦å½“å‰çš„from救助½Iºé—´å……满åQŒæ”¶é›†å™¨åˆ™æŠŠå¯åˆ°è¾‘Ö¯¹è±¡å¤åˆ¶åˆ°å½“å‰çš?/span>to救助½Iºé—´ã€?/span>Fromå’?/span>to救助½Iºé—´äº’æ¢è§’è‰²ã€‚ç»´æŒæ´»åŠ¨çš„å¯¹è±¡ž®†åœ¨æ•‘助½Iºé—´ä¸æ–å¤åˆ¶åQŒç›´åˆ°å®ƒä»¬èŽ·å¾—ä‹É用期òq¶è{入旧域。ä‹Éç”?/span>-XX:SurvivorRatioå¯æŽ§åˆ¶æ–°åŸŸå½Iºé—´çš„大ž®ã€?/span>
  å?/span>NewRationä¸€æ øP¼ŒSurvivorRationè§„å®šæŸæ•‘助域ä¸?/span>Eden½Iºé—´çš„æ¯”倹{€‚比如,以下命ä×o把新域设¾|®æˆ64måQ?/span>Edenå?/span>32måQŒæ¯ä¸ªæ•‘助域å„å 16måQ?/span>
  java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2
如剿‰€˜qŽÍ¼Œé»˜è®¤çжæ€ä¸‹HotSpotå¯ÒŽ–°åŸŸä‹É用å¤åˆ¶æ”¶é›†å™¨åQŒå¯¹æ—§åŸŸä½¿ç”¨æ ‡è®°åQ清除ï¼åŽ‹ç¾ƒæ”‰™›†å™¨ã€‚在新域ä¸ä‹É用å¤åˆ¶æ”¶é›†å™¨æœ‰å¾ˆå¤šæ„ä¹‰ï¼Œå› äØ“åº”ç”¨½E‹åºç”Ÿæˆçš„大部分对象是çŸå¯¿å‘½çš„ã€‚ç†æƒ³çжæ€ä¸‹åQŒæ‰€æœ‰è¿‡æ¸¡å¯¹è±¡åœ¨¿UÕd‡ºEden½Iºé—´æ—¶å°†è¢«æ”¶é›†ã€‚如果能够这æ ïLš„è¯ï¼Œòq¶ä¸”¿UÕd‡ºEden½Iºé—´çš„对象是长寿命的åQŒé‚£ä¹ˆç†è®ÞZ¸Šå¯ä»¥ç«‹å³æŠŠå®ƒä»¬ç§»˜q›æ—§åŸŸï¼Œé¿å…在救助空间åå¤å¤åˆ¶ã€‚但是,应用½E‹åºä¸èƒ½é€‚刘q™ç§ç†æƒ³çжæ€ï¼Œå› äØ“å®ƒä»¬æœ‰ä¸€ž®éƒ¨åˆ†ä¸é•¿å¯¿å‘½çš„å¯¹è±¡ã€‚æœ€å¥½æ˜¯ä¿æŒ˜q™äº›ä¸é•¿å¯¿å‘½çš„å¯¹è±¡åÆˆæ”‘Öœ¨æ–°åŸŸä¸ï¼Œå› 䨓å¤åˆ¶ž®éƒ¨åˆ†çš„对象æ€ÀL¯”压羃旧域廉ähã€‚äØ“æŽ§åˆ¶æ–°åŸŸä¸å¯¹è±¡çš„å¤åˆ¶åQŒå¯ç”?/span>-XX:TargetSurvivorRatio控制救助½Iºé—´çš„æ¯”例(该值是讄¡½®æ•‘助½Iºé—´çš„ä‹É用比例。如救助½Iºé—´ä½?/span>1MåQŒè¯¥å€?/span>50表示å¯ç”¨500KåQ‰ã€‚该值是一个百分比åQŒé»˜è®¤å€¼æ˜¯50ã€‚å½“è¾ƒå¤§çš„å †æ ˆä‹É用较低的sruvivorratioæ—Óž¼Œåº”å¢žåŠ è¯¥å€¼åˆ°80è‡?/span>90åQŒä»¥æ›´å¥½åˆ©ç”¨æ•‘助½Iºé—´ã€‚用-XX:maxtenuring thresholdå¯æŽ§åˆ¶ä¸Šé™ã€?/span>
  为放¾|®æ‰€æœ‰çš„å¤åˆ¶å…¨éƒ¨å‘生以åŠå¸Œæœ›å¯¹è±¡ä»?/span>eden扩展到旧域,å¯ä»¥æŠ?/span>MaxTenuring Threshold讄¡½®æˆ?/span>0。设¾|®å®ŒæˆåŽåQŒå®žé™…上ž®×ƒ¸å†ä‹É用救助空间了åQŒå› æ¤åº”æŠ?/span>SurvivorRatioè®¾æˆæœ€å¤§å€ég»¥æœ€å¤§åŒ–Eden½Iºé—´åQŒè®¾¾|®å¦‚下:
  java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatioåQ?/span>50000 …
4.BEA JRockit JVMçš„ä‹Éç”?/strong>
  Bea WebLogic 8.1使用的新çš?/span>JVM用于Intelòq›_°ã€‚在Bea安装完毕的目录下å¯ä»¥çœ‹åˆ°æœ‰ä¸€ä¸ªç±»ä¼égºŽjrockit81sp1_141_03的文件夹。这ž®±æ˜¯Beaæ–?/span>JVM所在目录。ä¸åŒäºŽHotSpotæŠ?/span>Javaå—节ç ç¼–è¯‘æˆæœ¬åœ°ç ,它预先编译戾c…R€?/span>JRockit˜q˜æä¾›äº†æ›´ç»†è‡´çš„功能用以观察JVMçš„è¿è¡Œçжæ€ï¼Œä¸»è¦æ˜¯ç‹¬ç«‹çš„GUI控制åŽÍ¼ˆåªèƒ½é€‚用于ä‹Éç”?/span>Jrockitæ‰èƒ½ä½¿ç”¨jrockit81sp1_141_03自带çš?/span>console监控一äº?/span>cpuå?/span>memory傿•°åQ‰æˆ–è€?/span>WebLogic Server控制å°ã€?/span>
  Bea JRockit JVM支æŒ4¿U垃圾收集器åQ?/span>
  4.1.1.分代å¤åˆ¶æ”‰™›†å™?/span>
  它与默认的分代收集器工作½{–ç•¥¾cÖM¼¼ã€‚对象在新域ä¸åˆ†é…,å?/span>JRockit文档ä¸çš„nursery。这¿U收集器最适åˆå?/span>cpuæœÞZ¸Šž®åž‹å †æ“作ã€?/span>
  4.1.2.å•ç©ºé—´åÆˆå‘æ”¶é›†å™¨
ã€€ã€€è¯¥æ”¶é›†å™¨ä½¿ç”¨å®Œæ•´å †ï¼Œòq¶ä¸ŽèƒŒæ™¯¾U¿ç¨‹å…±åŒå·¥ä½œã€‚å°½½Ž¡è¿™¿U收集器å¯ä»¥æ¶ˆé™¤ä¸æ–åQŒä½†æ˜¯æ”¶é›†å™¨éœ€èŠÞp´¹è¾ƒé•¿çš„æ—¶é—´å¯»æ‰¾æ»å¯¹è±¡åQŒè€Œä¸”处ç†åº”用½E‹åºæ—¶æ”¶é›†å™¨¾l常˜q行。如果处ç†å™¨ä¸èƒ½åº”付应用½E‹åºäº§ç”Ÿçš„åžƒåœ¾ï¼Œå®ƒä¼šä¸æ–应用½E‹åºòq¶å…³é—收集ã€?/span>
  分代òq¶å‘攉™›†å™?/span>
˜q™ç§æ”‰™›†å™¨åœ¨æŠ¤ç†åŸŸä‹É用排它å¤åˆ¶æ”¶é›†å™¨åQŒåœ¨æ—§åŸŸä¸åˆ™ä½¿ç”¨òq¶å‘攉™›†å™¨ã€‚由于它比啽Iºé—´å…±åŒå‘生攉™›†å™¨ä¸æ–频¾Jï¼Œå› æ¤å®ƒéœ€è¦è¾ƒž®‘的内å˜åQŒåº”用程åºçš„˜q行效率也较高,注æ„åQŒè¿‡ž®çš„æŠ¤ç†åŸŸå¯ä»¥å¯¼è‡´å¤§é‡çš„临时对象被扩展到旧域ä¸ã€‚è¿™ä¼šé€ æˆæ”‰™›†å™¨è¶…è´Ÿè·˜q作åQŒç”šè‡³é‡‡ç”¨æŽ’它性工作方å¼å®Œæˆæ”¶é›†ã€?/span>
  4.1.3.òq¶è¡Œæ”‰™›†å™?/span>
ã€€ã€€è¯¥æ”¶é›†å™¨ä¹Ÿåœæ¢å…¶ä»–è¿›½E‹çš„工作åQŒä½†ä½¿ç”¨å¤šçº¿½E‹ä»¥åŠ é€Ÿæ”¶é›†è¿›½E‹ã€‚å°½½Ž¡å®ƒæ¯”其他的攉™›†å™¨æ˜“于引起长旉™—´çš„䏿–,但一般能更好的利用内å˜ï¼Œ½E‹åºæ•ˆçŽ‡ä¹Ÿè¾ƒé«˜ã€?/span>
  默认状æ€ä¸‹åQ?/span>JRockit使用分代òq¶å‘攉™›†å™¨ã€‚è¦æ”¹å˜æ”‰™›†å™¨ï¼Œå¯ä‹Éç”?/span>-Xgc:åQŒå¯¹åº”四个收集器分别ä¸?/span>gencopyåQ?/span>singleconåQ?/span>gencon以åŠparallel。å¯ä½¿ç”¨-Xmså’?/span>-Xmx讄¡½®å †çš„åˆå§‹å¤§å°å’Œæœ€å¤§å€¹{€‚è¦è®„¡½®æŠ¤ç†åŸŸï¼Œåˆ™ä‹Éç”?/span>-Xns:java –jrockit –Xms512m –Xmx512m –Xgc:gencon –Xns128m…ž®½ç®¡JRockit支æŒ-verbose:gc开养I¼Œä½†å®ƒè¾“出的信æ¯ä¼šå› 收集器的ä¸åŒè€Œå¼‚ã€?/span>JRockit˜q˜æ”¯æŒ?/span>memoryã€?/span>loadå’?/span>codegen的输出ã€?/span>
  注æ„
åQšå¦‚æž?/span>
使用JRockit JVM的诘q˜å¯ä»¥ä‹Éç”?/span>WLS自带çš?/span>consoleåQ?/span>C:\bea\jrockit81sp1_141_03\bin下)æ¥ç›‘控一些数æ®ï¼Œå¦?/span>cpuåQ?/span>memery½{‰ã€‚è¦æƒŒ™ƒ½æž„监控必™åÕdœ¨å¯åЍæœåŠ¡æ—?/span>startWeblogic.cmdä¸åŠ å…¥ï¼Xmanagement傿•°ã€?/span>
5.如何ä»?/span>JVMä¸èŽ·å–ä¿¡æ¯æ¥˜q›è¡Œè°ƒæ•´
  -verbose.gc开兛_¯æ˜„¡¤ºgcçš„æ“作内å®V€‚打开它,å¯ä»¥æ˜„¡¤ºæœ€å¿™å’Œæœ€½Iºé—²æ”‰™›†è¡ŒäØ“å‘ç”Ÿçš„æ—¶é—´ã€æ”¶é›†å‰åŽçš„内å˜å¤§å°ã€æ”¶é›†éœ€è¦çš„æ—‰™—´½{‰ã€‚打开-xx:+ printgcdetails开养I¼Œå¯ä»¥è¯¦ç»†äº†è§£gcä¸çš„å˜åŒ–。打开-XX: + PrintGCTimeStamps开养I¼Œå¯ä»¥äº†è§£˜q™äº›åžƒåœ¾æ”‰™›†å‘生的时é—ß_¼Œè‡?/span>jvmå¯åЍ以åŽä»¥ç§’计é‡ã€‚最åŽï¼Œé€šè¿‡-xx: + PrintHeapAtGCå¼€å…³äº†è§£å †çš„æ›´è¯¦ç»†çš„ä¿¡æ¯ã€‚äØ“äº†äº†è§£æ–°åŸŸçš„æƒ…å†µåQŒå¯ä»¥é€šè¿‡-XX:=PrintTenuringDistribution开关了解获得ä‹É用期的对象æƒã€?/span>
6.Pdm¾pÈ»ŸJVM调整
  6.1.æœåŠ¡å™¨ï¼šå‰æå†…å˜1G å?/span>CPU
  å¯é€šè¿‡å¦‚䏋傿•°˜q›è¡Œè°ƒæ•´åQšï¼server å¯ç”¨æœåŠ¡å™¨æ¨¡å¼ï¼ˆå¦‚æžœCPU多,æœåŠ¡å™¨æœºå»ø™®®ä½¿ç”¨æ¤é¡¹åQ?/span>
  åQ?/span>Xms,åQ?/span>Xmxä¸€èˆ¬è®¾ä¸ºåŒæ ·å¤§ž®ã€?/span> 800m
  åQ?/span>Xmn 是将NewSizeä¸?/span>MaxNewSizeè®¾äØ“ä¸€è‡´ã€?/span>320m
  åQ?/span>XX:PerSize 64m
  åQ?/span>XX:NewSize 320m æ¤å€ÆD®¾å¤§å¯è°ƒå¤§æ–°å¯¹è±¡åŒºåQŒå‡ž®?/span>Full GC‹Æ¡æ•°
  åQ?/span>XX:MaxNewSize 320m
  åQ?/span>XX:NewRato NewSize设了å¯ä¸è®¾ã€?/span>4
  åQ?/span>XX: SurvivorRatio 4
  åQ?/span>XX:userParNewGC å¯ç”¨æ¥è®¾¾|®åƈ行收é›?/span>
  åQ?/span>XX:ParallelGCThreads å¯ç”¨æ¥å¢žåŠ åÆˆè¡Œåº¦ 4
  åQ?/span>XXUseParallelGC 讄¡½®åŽå¯ä»¥ä‹Éç”¨åÆˆè¡Œæ¸…é™¤æ”¶é›†å™¨
  åQ?/span>XXåQ?/span>UseAdaptiveSizePolicy 与上é¢ä¸€ä¸ªè”åˆä‹É用效果更好,利用它å¯ä»¥è‡ªåŠ¨ä¼˜åŒ–æ–°åŸŸå¤§ž®ä»¥åŠæ•‘助空间比å€?/span>
  6.2.客户机:通过åœ?/span>JNLPæ–‡äšgä¸è®¾¾|®å‚æ•°æ¥è°ƒæ•´å®¢æˆ·ç«?/span>JVM
  JNLPä¸å‚敎ͼšinitial-heap-sizeå’?/span>max-heap-size
  ˜q™å¯ä»¥åœ¨frameworkçš?/span>RequestManagerä¸ç”Ÿæˆ?/span>JNLPæ–‡äšgæ—¶åŠ å…¥ä¸Š˜q°å‚敎ͼŒä½†æ˜¯˜q™äº›å€¼æ˜¯è¦æ±‚æ ÒŽ®å®¢æˆ·æœºçš„¼‹¬äšg状æ€å˜åŒ–çš„åQˆå¦‚客户机的内å˜å¤§å°½{‰ï¼‰ã€‚å¾è®®è¿™ä¸¤ä¸ªå‚æ•°å€ÆD®¾ä¸ºå®¢æˆähœºå¯ç”¨å†…å˜çš?/span>60åQ…(有待‹¹‹è¯•åQ‰ã€‚äØ“äº†åœ¨åŠ¨æ€ç”Ÿæˆ?/span>JNLPæ—¶ä»¥ä¸Šä¸¤ä¸ªå‚æ•°å€ÆDƒ½å¤Ÿéšå®¢æˆ·æœÞZ¸åŒè€Œä¸åŒï¼Œå¯é 虑获得客æˆähœº¾pÈ»Ÿä¿¡æ¯òq¶å°†˜q™äº›åµŒåˆ°é¦–页index.jspä¸ä½œä¸ø™¿žæŽ¥è¯·æ±‚çš„å‚æ•°ã€?/span>
  在设¾|®äº†ä¸Šè¿°å‚æ•°åŽå¯ä»¥é€šè¿‡Visualgc æ¥è§‚察垃圑֛žæ”¶çš„ä¸€äº›å‚æ•°çжæ€ï¼Œå†åšç›¸åº”çš„è°ƒæ•´æ¥æ”¹å–„æ€§èƒ½ã€‚ä¸€èˆ¬çš„æ ‡å‡†æ˜¯å‡ž®?/span>fullgc的次敎ͼŒæœ€å¥½ç¡¬ä»¶æ”¯æŒä‹Éç”¨åÆˆè¡Œåžƒåœ‘Ö›žæ”Óž¼ˆè¦æ±‚å¤?/span>CPUåQ‰ã€?/span>
InvalidClassException
. A serializable class can declare its own serialVersionUID explicitly by declaring a field named "serialVersionUID"
that must be static, final, and of type long
:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassException
s during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private
modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members.
åºåˆ—化è¿è¡Œæ—¶ä½¿ç”¨ä¸€ä¸ªç§°ä¸?serialVersionUID 的版本å·ä¸Žæ¯ä¸ªå¯åºåˆ—化类相关è”,该åºåˆ—å·åœ¨ååºåˆ—化过½E‹ä¸ç”¨äºŽéªŒè¯åºåˆ—化对象的å‘é€è€…和接收者是å¦äØ“è¯¥å¯¹è±¡åŠ è½½äº†ä¸Žåºåˆ—åŒ–å…¼å®¹çš„ç±»ã€‚å¦‚æžœæŽ¥æ”¶è€…åŠ è½½çš„è¯¥å¯¹è±¡çš„¾cÈš„ serialVersionUID 与对应的å‘é€è€…çš„¾cÈš„版本å·ä¸åŒï¼Œåˆ™ååºåˆ—化将会导è‡?
如果å¯åºåˆ—化¾cÀLœªæ˜‘ּ声明 serialVersionUIDåQŒåˆ™åºåˆ—化è¿è¡Œæ—¶ž®†åŸºäºŽè¯¥¾cÈš„å„个斚w¢è®¡ç®—该类的默è®?serialVersionUID å€û|¼Œå¦?#8220;Java(TM) 对象åºåˆ—化规èŒ?#8221;䏿‰€˜q°ã€‚丘q‡ï¼Œå¼ºçƒˆå»ø™®® 所有å¯åºåˆ—化类都显å¼å£°æ˜?serialVersionUID å€û|¼ŒåŽŸå› æ˜¯è®¡½Ž—默认的 serialVersionUID 对类的详¾l†ä¿¡æ¯å…·æœ‰è¾ƒé«˜çš„æ•æ„Ÿæ€§ï¼Œæ ÒŽ®¾~–译器实现的ä¸åŒå¯èƒ½åƒå·®ä¸‡åˆ«åQŒè¿™æ ·åœ¨ååºåˆ—化˜q‡ç¨‹ä¸å¯èƒ½ä¼šå¯ÆD‡´æ„外çš?InvalidClassException
。å¯åºåˆ—化类å¯ä»¥é€šè¿‡å£°æ˜Žå䨓 "serialVersionUID"
的嗌Dµï¼ˆè¯¥å—ŒDµå¿…™åÀL˜¯é™æ€?(static)ã€æœ€¾l?(final) çš?
型嗌Dµï¼‰æ˜‘ּ声明其自å·Þqš„ serialVersionUIDåQ?
long
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
InvalidClassException
ã€‚å› æ¤ï¼Œä¸ÞZ¿è¯?serialVersionUID 倯D·¨ä¸åŒ java ¾~–译器实现的一致性,åºåˆ—化类必须声明一个明¼‹®çš„ serialVersionUID 倹{€‚è¿˜å¼ºçƒˆå»ø™®®ä½¿ç”¨ private
修饰½W¦æ˜¾½Cºå£°æ˜?serialVersionUIDåQˆå¦‚æžœå¯èƒ½ï¼‰åQŒåŽŸå› æ˜¯˜q™ç§å£°æ˜Žä»…应用于直接声明¾c?-- serialVersionUID å—æ®µä½œäØ“¾l§æ‰¿æˆå‘˜æ²¡æœ‰ç”¨å¤„。数¾l„ç±»ä¸èƒ½å£°æ˜Žä¸€ä¸ªæ˜Ž¼‹®çš„ serialVersionUIDåQŒå› æ¤å®ƒä»¬æ€ÀL˜¯å…ähœ‰é»˜è®¤çš„计½Ž—å€û|¼Œä½†æ˜¯æ•°ç»„¾cÀL²¡æœ‰åŒ¹é…?serialVersionUID å€¼çš„è¦æ±‚ã€?