Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java 9 ÖÐµÄ GC µ÷ÓÅ»ù´¡
 
À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ 2017-11-17
  2426  次浏览      27
 

ÔÚ¾­¹ýÁ˼¸´ÎÌøÆ±Ö®ºó£¬Java 9ÖÕÓÚÔÚÔ­¼Æ»®ÈÕÆÚµÄÕûÕûÒ»ÄêÖ®ºó·¢²¼ÁËÕýʽ°æ¡£Java 9ÒýÈëÁ˺ܶàеÄÌØÐÔ£¬³ýÁËÉÁϹÑÛµÄModule SystemºÍREPL£¬×îÖØÒªµÄ±ä»¯ÎÒÈÏΪÊÇĬÈÏGC£¨Garbage Collector£©ÐÞ¸ÄΪÐÂÒ»´ú¸ü¸´ÔÓ¡¢¸üÈ«Ãæ¡¢ÐÔÄܸüºÃµÄG1£¨Garbage-First£©¡£JDKµÄά»¤ÕßÔÚGCÑ¡ÔñÉÏÒ»Ö±ÊDZȽϱ£Êصģ¬G1´ÓJDK 1.6ʱ´ú¾Í¿ªÊ¼½øÈ뿪·¢ÕßµÄÊÓÒ°£¬Ö±µ½½ñÌìÕýʽ³ÉΪHotspotµÄĬÈÏGC£¬Ò²ÊÇ×ßÁ˺ܳ¤µÄ·¡£

±¾ÎĽ«Ö÷Òª½²½âGCµ÷ÓÅÐèÒªÖªµÀµÄһЩ»ù´¡ÖªÊ¶£¬»áÉæ¼°µ½Ò»Ð©GCµÄʵÏÖϸ½Ú£¬µ«²»»á¶ÔʵÏÖϸ½Ú×öºÜÈ«ÃæµÄ²ûÊö£¬Èç¹ûÄã¿´Íê±¾ÎÄÖ®ºó£¬ÄܶÔGCÓÐÒ»¸ö´óÖµÄÈÏʶ£¬ÄDZ¾ÎĵÄд×÷Ä¿µÄÒ²¾Í´ïµ½ÁË¡£ÓÉÓÚÔÚÕâ´Îд×÷¹ý³ÌÖУ¬Ç¡·êJava 9Õýʽ°æ·¢²¼£¬Ö®Ç°¶¼ÊÇÒÀÀµJava 8µÄÎĵµÐ´µÄ£¬Èç¹ûÓв»ÕýÈ·µÄµØ·½»¹ÍûÖ¸Õý¡£±¾ÎĽ«°üº¬ÒÔÏÂÄÚÈÝ£º

1.GCµÄ×÷Ó÷¶Î§

2.GC¸ºÔðµÄÊÂÇé

3.JVMÖеÄ4ÖÖGC

4.G1µÄһЩϸ½Ú

5.ʹÓÃJava 9Õýʽ°æ¶ÔG1½øÐвâÊÔ

6.һЩ¼òµ¥µÄGCµ÷ÓÅ·½·¨

Ò»¡¢GCµÄ×÷Ó÷¶Î§

Ҫ̸GCµÄ×÷Ó÷¶Î§£¬Ê×ÏÈҪ̸JVMµÄÄÚ´æ½á¹¹£¬JVMÄÚ´æÖÐÖ÷ÒªÓÐÒÔϼ¸¸öÇøÓò£º¶Ñ¡¢·½·¨Çø£¨JVM¹æ·¶ÖеĽз¨£¬Hotspot´óÖ¶ÔÓ¦µÄÊÇMetaspace£©¡¢Õ»¡¢±¾µØ·½·¨Õ»¡¢PCµÈ£¬ÆäÖÐGCÖ÷Òª×÷ÓÃÔÚ¶ÑÉÏ£¬ÈçÏÂͼËùʾ£º

JVMÄÚ´æ½á¹¹

ÆäÖжѺͷ½·¨ÇøÊÇËùÓÐÏ̹߳²ÏíµÄ£¬ÆäËûÔòΪÏ̶߳ÀÓУ¬HotSpot JVMʹÓûùÓÚ·Ö´úµÄÀ¬»ø»ØÊÕ»úÖÆ£¬ËùÒÔÔÚ¶ÑÉÏÓÖ·ÖΪ¼¸¸ö²»Í¬µÄÇøÓò£¨ÔÚG1ÖУ¬¸÷ÄêÁä´ú²»ÔÙÊÇÁ¬ÐøµÄÒ»ÕûƬÄڴ棬ΪÁËÃèÊö·½±ã£¬ÕâÀﻹʹÓô«Í³µÄ±íʾ·½·¨£©£¬¾ßÌåÈçÏÂͼËùʾ£º

JVM¶ÑÖеķÖÇø

¶þ¡¢GC¸ºÔðµÄÊÂÇé

GCµÄ·¢Õ¹ÊÇËæ×ÅJDK£¨Standard Edition£©µÄ·¢Õ¹Ò»²½²½·¢Õ¹ÆðÀ´µÄ£¬À¬»ø»ØÊÕ£¨Garbage Collection£©¿ÉÒÔ˵ÊÇJDKÀï×îÓ°ÏìÐÔÄܵÄÐÐΪÁË¡£GC×öµÄÊÂÇ飬˵°×Á˾ÍÊÇ¡¸Í¨¹ý¶ÔÄÚ´æ½øÐйÜÀí£¬ÒÔ±£ÕÏÔÚÄÚ´æ×ã¹»µÄʱºò£¬³ÌÐò¿ÉÒÔÕý³£µÄʹÓÃÄڴ桹¡£¾ßÌå¶øÑÔ£¬GCͨ³£×öµÄÊÂÇéÓÐÒÔÏÂ3¸ö£º

1. ·ÖÅä¶ÔÏóºÍ¶ÔÏóµÄÄêÁä¹ÜÀí

ͨ³£¶øÑÔ£¬GCÐèÒª¹ÜÀí¡¸ÔÚÉÏͼÖеÄÄêÇá´ú£¨Young£©·ÖÅä¶ÔÏó£¬È»ºóͨ¹ýһϵÁеÄÄêÁä¹ÜÀí£¬½«Ö®Ïú»Ù»ò½úÉýµ½ÀÏÄê´ú£¨Tenured£©ÖÐÈ¥¡¹µÄ¹ý³Ì¡£Õâ¸ö¹ý³Ì»á°éËæ×ÅÈô¸É´ÎµÄMinor GC¡£

¶ÔÓÚÆÕͨµÄ¶ÔÏó¶øÑÔ£¬·ÖÅäÄÚ´æÊÇÒ»¼þºÜ¼òµ¥¶øÇÒ¿ìËÙµÄÊÂÇé¡£ÔÚ¶ÔÏó»¹Î´´´½¨Ê±£¬ÆäËùÕ¼ÄÚ´æ´óСͨ¹ýÀàµÄÔªÊý¾Ý¾Í¿ÉÒÔÈ·¶¨£¬¶øEdenÇøÓòµÄÄÚ´æ¿ÉÒÔÈÏΪÊÇÁ¬ÐøµÄ£¬ËùÒÔ¸ø¶ÔÏó·ÖÅäÄÚ´æÒª×öµÄÖ»ÊÇÔÚÉÏͼÖÐEdenÇøÓòÖаÑÖ¸ÕëÒÆ¶¯ÏàÓ¦µÄ³¤¶È£¬²¢½«µØÖ··µ»Ø¸ø¶ÔÏóµÄÒýÓü´¿É¡£µ±È»Êµ¼ÊµÄ¹ý³Ì±ÈÕâ¸ö¸´ÔÓ£¬ÔÚÏÂÎÄÖлáÌáµ½¡£

²»¹ý£¬ÓÐʱºòÒ»¸ö¶ÔÏó»áÖ±½ÓÔÚÀÏÄê´úÖд´½¨£¬Õâ¸öµãÒ²»áÔÚºó±ßÌáµ½¡£

2. ÔÚÀÏÄê´úÖнøÐбê¼Ç

ÀÏÄê´úµÄGCËã·¨¿ÉÒÔ´óÖÂÊÇÈÏΪÊÇÒ»¸ö±ê¼Ç-ÕûÀí£¨Mark-Compact£¬ÆäʵÊÇ»ìºÏÁ˱ê¼Ç-ÇåÀí£¬±ê¼Ç-¸´Öƺͱê¼Ç-ÕûÀí£©Ëã·¨£¬ËùÒÔÀÏÄê´úµÄÀ¬»øÇåÀíÊ×ÏÈÒª×öµÄ¾ÍÊÇÔÚÀÏÄê´ú¶Ô´æ»îµÄ¶ÔÏ󣨿ɴïÐÔ·ÖÎö£¬¹ØÓÚ²»Í¬µÄ¿É´ïÐÔ¿ÉÒԲο¼JDK½â¹¹ ¨C JavaÖеÄÒýÓúͶ¯Ì¬´úÀíµÄʵÏÖ£©½øÐбê¼Ç£¬¶ÔÓÚѰÇó´óÍÌÍÂÁ¿µÄ·þÎñÆ÷Ó¦ÓÃÀ´Ëµ£¬Õâ¸ö¹ý³ÌÍùÍùÐèÒªÊDz¢·¢µÄ¡£

±ê¼ÇµÄ¹ý³Ì·¢ÉúÔÚMajor GC±»´¥·¢Ö®ºó£¬²»Í¬µÄGC¶ÔÓÚMajorGCµÄ´¥·¢Ìõ¼þºÍ±ê¼Ç¹ý³ÌµÄʵÏÖÒ²²»¾¡Ïàͬ¡£

3. ÔÚÀÏÄê´úÖнøÐÐѹËõ

ÔÚÉÏÒ»ÌõµÄ»ù´¡ÉÏ£¬½«»¹´æ»îµÄ¶ÔÏó½øÐÐѹËõ£¨CMSºÍG1µÄÐÐΪÓë´ËÓÐЩ²»Í¬Ö®´¦£©£¬Ñ¹ËõµÄ¹ý³Ì¾ÍÊǽ«´æ»îµÄ¶ÔÏó´ÓÀÏÄê´úµÄÆðµã½øÐа¤¸ö¸´ÖÆ£¬Ê¹µÃÀÏÄê´úά³ÖÔÚһƬÁ¬ÐøµÄÄÚ´æÖУ¬Ïû³ýÄÚ´æË鯬£¬¶ÔÓÚÄÚ´æ·ÖÅäËٶȵÄÌáÉý»áÓкܴóµÄ°ïÖú¡£

Èý¡¢GCµÄÖÖÀà

Hotspot»á¸ù¾ÝËÞÖ÷»úµÄÓ²¼þÌØÐԺͲÙ×÷ϵͳÀàÐÍ£¬½«Ö®·ÖΪ¿Í»§¶ËÐÍ£¨client-class£©»òÕß·þÎñÆ÷ÐÍ£¨server-class£©£¬Èç¹ûÊÇ·þÎñÆ÷ÐÍÖ÷»ú£¬Java 9֮ǰĬÈÏʹÓÃParallel GC£¬Java 9ÖÐĬÈÏʹÓÃG1¡£¶ÔÓÚ·þÎñÆ÷ÐÍÖ÷»úµÄÑ¡Ôñ±ê×¼ÊÇ¡¸CPUºËÐÄÊý´óÓÚ1£¬ÄÚ´æ´óÓÚ2GB¡¹£¬ËùÒÔÏÖÔڴ󲿷ֵÄÖ÷»ú¶¼¿ÉÒÔÈÏΪÊÇ·þÎñÆ÷ÐÍÖ÷»ú¡£

ÕâÀïÌÖÂÛµÄËùÓÐGC¶¼ÊÇ»ùÓÚ·Ö´úÀ¬»ø»ØÊÕËã·¨µÄ¡£

1. Serail

SerailÊÇ×îÔçµÄÒ»¿îGC£¬ËüֻʹÓÃÒ»¸öÏß³ÌÀ´×öËùÓеÄMinorºÍMajorÀ¬»ø»ØÊÕ¡£ËüÔÚÔËÐÐʱ£¬ÆäËûËùÓеÄÊÂÇé¶¼»áÔÝÍ£¡£Æä¹¤×÷·½Ê½Ê®·Ö¼òµ¥£¬ÔÚÐèÒªGCµÄ°²È«µã£¬Ëü»áÍ£Ö¹ËùÓÐÆäËûỊ̈߳¨Stop-The-World£©£¬¶ÔÄêÇá´ú½øÐбê¼Ç-¸´ÖÆ£¬»ò¶ÔÀÏÄê´ú½øÐбê¼Ç-ÕûÀí¡£

¿ÉÒÔʹÓÃJVM²ÎÊý-XX:+UseSerialGCÀ´¿ªÆô´ËGC£¬µ±Ê¹Óô˲ÎÊýʱ£¬ÄêÇá´úºÍÀÏÄê´ú½«¶¼ÊÇÓÃSerialÀ´×öÀ¬»ø»ØÊÕ¡£ÔÚÄêÇá´úʹÓñê¼Ç-¸´ÖÆËã·¨£¬½«EdenÖдæ»îµÄ¶ÔÏóºÍ·Ç¿ÕµÄSuvivorÇø£¨From£©Öдæ»îµÄ¶ÔÏó¸´ÖƵ½¿ÕµÄSuvivorÇø£¨To£©ÖÐÈ¥£¬Í¬Ê±½«Ò»²¿·ÖSuvivorÖеĶÔÏó½úÉýµ½ÀÏÄê´úÈ¥¡£ÔÚÀÏÄê´úÔòʹÓñê¼Ç-ÕûÀíËã·¨¡£

¿´ÆðÀ´Serial¹ÅÀ϶ø¼òª£¬µ«ÔÚËÞÖ÷»ú×ÊÔ´½ôÕÅ»òÕßJVM¶ÑºÜСµÄÇé¿öÏ£¨±ÈÈç¶ÑÄÚ´æ´óСֻÓв»µ½100M£©£¬Serial·´¶ø¿ÉÒÔ´ïµ½¸üºÃµÄЧ¹û£¬ÒòΪÆäËû²¢·¢»ò²¢ÐÐGC¶¼ÊÇ»ùÓÚ¶àÏ̵߳ģ¬»á´øÀ´¶îÍâµÄÏß³ÌÇл»ºÍÏ̼߳äͨÐŵĿªÏú¡£

2. Parallel/Throughput

ParallelÔÚJava 9֮ǰÊÇ·þÎñÆ÷ÐÍËÞÖ÷»úÖÐJVMµÄĬÈÏGC£¬ÆäÀ¬»ø»ØÊÕµÄËã·¨ºÍSerial»ù±¾Ïàͬ£¬²»Í¬Ö®´¦ÔÚÓëËüʹÓöàÏß³ÌÀ´Ö´ÐС£ÓÉÓÚʹÓÃÁ˶àỊ̈߳¬¿ÉÒÔÏíÊܶàºËCPU´øÀ´µÄÓÅÊÆ£¬¿ÉÒÔͨ¹ý²ÎÊý-XX:+UseParallelGC -XX:+UseParallelOldGCÏÔʾָ¶¨¡£

3. CMS

CMSºÍG1¶¼ÊôÓÚ¡¸Mostly Concurrent Mark and Sweep Garbage Collector¡¹£¬¿ÉÒÔʹÓÃ-XX:+UseConcMarkSweepGC²ÎÊý´ò¿ª¡£CMSµÄÄêÇá´úÀ¬»ø»ØÊÕʹÓõÄÊÇParallel NewÀ´×ö£¬ÆäÐÐΪºÍParallelÖеIJ¶àÏàͬ£¬ËûÃǵÄʵÏÖÉÏÓÐһЩ²»Í¬µÄµØ·½£¬±ÈÈçParallel¿ÉÒÔ×Ô¶¯µ÷½ÚÄêÇá´úÖи÷ÇøµÄ´óС£¬ÓõÄÊǹã¶ÈÓÅÏÈËÑË÷µÈ¡£

ÀÏÄê´úʹÓÃCMS£¬CMSµÄ»ØÊÕºÍParallelÒ²»ù±¾ÀàËÆ£¬²»Í¬µãÔÚÓ룬CMSʹÓõĸü¸´ÔӵĿɴïÐÔ·ÖÎö²½Ö裬²¢ÇÒ²»ÊÇÿ´Î¶¼×öѹËõµÄ¶¯×÷£¬ÕâÑù´ïµ½µÄЧ¹û¾ÍÊÇ£¬Stop-The-WorldµÄʱ³¤»á½µµÍ£¬JVMÔËÐÐÖжϵÄʱ¼ä¼õÉÙ£¬ÊʺÏÔÚ¶ÔÑÓ³ÙÃô¸ÐµÄ³¡¾°ÏÂʹÓá£

CMSÔÚJava 9ÖÐÒѾ­±»·ÏÆú£¬µ«Á˽âCMSµÄÐÐΪ¶ÔÀí½âG1»áÓÐһЩ°ïÖú£¬ËùÒÔÕâÀﻹÊÇ»á¼òµ¥µÄÐðÊöһϡ£CMSµÄ²½Öè´óÖÂÈçÏ£º

µÚÒ»´Î±ê¼Ç

´ÓGC Roots¿ªÊ¼£¬ÕÒµ½ËüÃÇÔÚÀÏÄê´úÖеÚÒ»¸ö¿É´ïµÄ¶ÔÏó£¬ÕâЩ¶ÔÏó»òÕßÊÇÖ±½Ó±»GC RootsÒýÓ㬻òÕßͨ¹ýÄêÇá´úÖеĶÔÏó±»GC RootsÒýÓá£ÕâÒ»²½»áStop-The-World¡£

²¢·¢±ê¼Ç

ÔÚµÚÒ»´Î±ê¼ÇµÄ»ù´¡ÉÏ£¬½øÒ»²½½øÐпɴïÐÔ·ÖÎö£¬´Ó¶ø±ê¼Ç´æ»îµÄ¶ÔÏó¡£ÕâÒ»²½½Ð¡¸²¢·¢¡¹±ê¼Ç£¬ÊÇÒòΪ×ö±ê¼ÇµÄÏß³ÌÊǺÍÓ¦ÓõŤ×÷Ï̲߳¢·¢Ö´Ðеģ¬Ò²¾ÍÊÇ˵£¬ÕâÒ»²½²»»áStop-The-World¡£

µÚ¶þ´Î±ê¼Ç

ÔÚ²¢·¢±ê¼ÇµÄ¹ý³ÌÖУ¬ÓÉÓÚ³ÌÐòÈÔÔÚÖ´ÐУ¬»áµ¼ÖÂÔÚ²¢·¢±ê¼ÇÍê³Éºó£¬ÓÐһЩ¶ÔÏóµÄ¿É´ïÐԻᷢÉú±ä»¯£¬ËùÒÔÐèÒªÔٴζÔËûÃǽøÐбê¼Ç¡£ÕâÒ»²½»áStop-The-World¡£

ÇåÀí

»ØÊÕ²»Ê¹ÓõĶÔÏó£¬Áô×÷ÒÔºóʹÓá£

CMSµÄÉè¼Æ±È½Ï¸´ÔÓ£¬ËùÒÔÒ²´øÀ´ÁËһЩÎÊÌ⣬±ÈÈ縡¶¯À¬»ø£¨Floating Garbage£¬Ö¸µÄÊÇÔÚµÚÒ»²½±ê¼Ç¿É´ï£¬µ«ÔÚµÚ¶þ²½Ö´ÐеÄͬʱÒѾ­²»¿É´ïµÄ¶ÔÏ󣩣¬ÓÉÓÚ²»×öÀÏÄê´úѹËõ£¬µ¼ÖÂÀÏÄê´ú»á³öÏֽ϶àµÄÄÚ´æË鯬¡£

4. G1

ÓÉÓÚ¡¸ÒýÈëÁ˲¢·¢±ê¼Ç¡¹ºÍ¡¸²»×öÀÏÄê´úѹËõ¡¹£¬CMS¿ÉÒÔ´øÀ´¸üºÃµÄÏìӦʱÑÓ±íÏÖ£¬µ«Í¬Ê±Ò²´øÀ´ÁËһЩÎÊÌâ¡£G1±¾Éí¾ÍÊÇ×÷ΪCMSµÄÌæ´úÆ·³öÏֵģ¬ÔÚËüµÄʹÓó¡¾°À¶Ñ²»ÔÙÊÇÁ¬ÐøµÄ±»·ÖΪÉÏÎÄËù˵µÄ¸÷ÖÖ´ú£¬Õû¸ö¶Ñ»á±»·ÖΪһ¸ö¸öÇøÓò£¨Region£©£¬Ã¿¸öÇøÓò¿ÉÒÔÊÇÈκδú¡£ÈçÏÂͼËùʾ£º

ʹÓÃG1µÄJVMijʱ¿ÌµÄ¶ÑÄÚ´æ

ÆäÖÐÓкìÉ«·½¿òµÄΪÄêÇá´ú£¨±êSµÄΪSurvivorÇøÓò£¬ÆäËûΪEden£©£¬ÆäËûÀ¶É«µ×µÄÇøÓòΪÀÏÄê´ú£¨±êHµÄΪ´ó¶ÔÏóÇøÓò£¬ÓÃÒÔ´æ´¢´ó¶ÔÏ󣩡£

ËÄ¡¢G1µÄһЩϸ½Ú

G1ÓëÒÔÉÏ3ÖÖGCÏàͬ£¬Ò²ÊÇ»ùÓÚ·Ö´úµÄÀ¬»ø»ØÊÕÆ÷¡£ËüµÄÀ¬»ø»ØÊÕ²½Öè¿ÉÒÔ·ÖΪÄêÇá´ú»ØÊÕ£¨Young-only phase£¬ÀàËÆÓÚMinor GC£©ºÍ»ìºÏÀ¬»ø»ØÊս׶Σ¨Space-reclamation phase£©¡£ÏÂͼÊÇOracleÎĵµÖжÔÓÚ´ËÁ½¸ö½×¶ÎµÄʾÒâͼ£º

G1Éè¼ÆÄ¿±êºÍÊÊÓöÔÏó

G1µÄÉè¼ÆÄ¿±êÊÇÈôóÐ͵ÄJVM¿ÉÒÔ¶¯Ì¬µÄ¿ØÖÆGCµÄÐÐΪÒÔÂú×ãÓû§ÅäÖõÄÐÔÄÜÄ¿±ê¡£G1»áÔÚÆ½ºâÍÌͺÍÏìӦʱÑӵĻù´¡ÉÏ£¬¾¡¿ÉÄܵÄÂú×ãÓû§µÄÐèÇó¡£ËüÊÊÓõÄJVMÍùÍùÓÐÒÔÏÂÌØÕ÷£º

¶ÑµÄ´óС¿ÉÄÜ´ïµ½ÊýÊ®G£¨»òÕ߸ü´ó£©£¬Í¬Ê±´æ»îµÄ¶ÔÏóÊýÁ¿Ò²ºÜ¶à¡£

¶ÔÏóµÄ·ÖÅäºÍÄêÁäÔö³¤µÄÐÐÎªËæ×ųÌÐòµÄÔËÐв»¶ÏµÄ±ä»¯

¶ÑÉϺÜÈÝÒ×ÐγÉË鯬

ÒªÇó½ÏÉÙµÄStop-The-WorldÔÝͣʱ¼ä£¬Í¨³£Ð¡ÓÚÊý°ÙºÁÃë

¶ÔG1µÄÐÐΪ½øÐвâÊÔ

Èç¹ûÏëÒª¿´À¬»ø»ØÊյľßÌåÖ´Ðйý³Ì£¬¿ÉÒÔʹÓÃÐéÄâ»ú²ÎÊý-Xlog:gc*=debug»òÕß-Xlog:gc*=info£¬Ç°Ò»¸ö»á´òÓ¡¸ü¶àµÄϸ½Ú¡£×¢Ò⴫ͳµÄVM²ÎÊý-XX:+PrintGCDetailsÔÚJava9ÖÐÒѾ­·ÏÆú£¬»áÓÐWarningÐÅÏ¢¡£¿ÉÒÔʹÓÃÒÔÏ´úÂëÖеijÌÐòÈ¥²âÊÔ£º

static int TOTAL_SIZE = 1024 * 5;
static Object[] floatingObjs= new Object[TOTAL_SIZE];
static LinkedList<Object> immortalObjs = new LinkedList<Object>();
//ÊͷŸ¡¶¯À¬»ø
synchronized static void renewFloatingObjs() {
System.err.println("´æ»î¶ÔÏóÂú========================================");
if (floatingSize + 5 >= TOTAL_SIZE) {
floatingObjs= new Object[TOTAL_SIZE];
floatingSize = 0;
}
}
//Ìí¼Ó¸¡¶¯À¬»ø
synchronized static void addObjToFloating(Object obj) {
if (floatingSize++ < TOTAL_SIZE) {
floatingObjs[floatingSize] = obj;
if (immortalSize++ < TOTAL_SIZE) {
immortalObjs.add(obj);
} else {
immortalObjs.remove(new Random().nextInt(TOTAL_SIZE));
immortalObjs.add(obj);
}
}
}

public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
while (true) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
Byte[] garbage = new Byte[1024 * (1 + new Random().nextInt(20))];
if (new Random().nextInt(20) < 2) {
if (floatingSize + 5 >= TOTAL_SIZE) {
renewFloatingObjs();
}
addObjToFloating(garbage);
}
}
}).start();
}
}

ÔÚÕâ¶Î´úÂëÖУ¬Ä£ÄâÁ˳£¹æ³ÌÐòµÄʹÓÃÇé¿ö¡£²»¶ÏµÄÉú³ÉеĴóС²»µÈµÄ¶ÔÏó£¬ÕâЩ¶ÔÏóÖлáÓдóÔ¼10%µÄ»ú»á½øÈ븡¶¯À¬»øfloatingObjs£¬¸¡¶¯À¬»ø»á±»¶¨ÆÚÇå³ý¡£Í¬Ê±»áÓÐÒ»²¿·ÖµÄ¶ÔÏó½øÈëimmortalObjs£¬ÕâЩ¶ÔÏó±»ÊͷŵĻú»á¸üÉÙ£¬ËüÃÇ´ó¸ÅÂʽ«³ÉΪÀÏÄê´úµÄ³£×¡Óû§¡£

´ÓÉϱߵIJâÊÔ¿ÉÒԵõ½ÈçÏÂGCÈÕÖ¾1£¬ÕâÊÇÒ»´ÎÍêÕûµÄÄêÇá´úGC£¬´ÓÖпÉÒÔ¿´µ½£¬Ä¬ÈϵÄÇøÓò´óСΪ1M£¬Í¬Ê±½«¿ªÊ¼Ò»´ÎFull GC£¬Æä¸ñʽ´óÖÂΪ[<ÐéÄâ»úÔËÐеÄʱ³¤>][<ÈÕÖ¾¼¶±ð>][<±êÇ©>] GC(<GCµÄ±êʶ>) <ÆäËûÐÅÏ¢>

//ÈÕÖ¾1
[0.014s][info][gc,heap] Heap region size: 1M
//Ò»´ÎÍêÕûµÄÄêÇá´úÀ¬»ø»ØÊÕ£¬°éËæ×ÅÒ»´ÎÔÝÍ£
[12.059s][info ][gc,start ] GC(18) Pause Young (G1 Evacuation Pause)
[12.059s][info ][gc,task ] GC(18) Using 8 workers of 8 for evacuation
[12.078s][info ][gc,phases ] GC(18) Pre Evacuate Collection Set: 0.0ms
[12.078s][info ][gc,phases ] GC(18) Evacuate Collection Set: 18.6ms
[12.079s][info ][gc,phases ] GC(18) Post Evacuate Collection Set: 0.3ms
[12.079s][info ][gc,phases ] GC(18) Other: 0.3ms
[12.079s][info ][gc,heap ] GC(18) Eden regions: 342->0(315)
[12.079s][info ][gc,heap ] GC(18) Survivor regions: 38->35(48)
[12.079s][info ][gc,heap ] GC(18) Old regions: 425->463
[12.079s][info ][gc,heap ] GC(18) Humongous regions: 0->0
[12.078s][debug][gc,ergo,ihop ] GC(18) Request concurrent cycle initiation (occupancy higher than threshold) occupancy: 485490688B allocation request: 0B threshold: 472331059B (45.00) source: end of GC
[12.078s][debug][gc,ihop ] GC(18) Basic information (value update), threshold: 472331059B (45.00), target occupancy: 1049624576B, current occupancy: 521069456B, recent allocation size: 20640B, recent allocation duration: 817.38ms, recent old gen allocation rate: 25251.50B/s, recent marking phase length: 0.00ms
[12.078s][debug][gc,ihop ] GC(18) Adaptive IHOP information (value update), threshold: 472331059B (47.37), internal target occupancy: 997143347B, occupancy: 521069456B, additional buffer size: 367001600B, predicted old gen allocation rate: 318128.08B/s, predicted marking phase length: 0.00ms, prediction active: false
[12.078s][debug][gc,ergo,refine ] GC(18) Updated Refinement Zones: green: 15, yellow: 45, red: 75
[12.079s][info ][gc,heap ] GC(18) Eden regions: 342->0(315)
[12.079s][info ][gc,heap ] GC(18) Survivor regions: 38->35(48)
[12.079s][info ][gc,heap ] GC(18) Old regions: 425->463
[12.079s][info ][gc,heap ] GC(18) Humongous regions: 0->0
[12.079s][info ][gc,metaspace ] GC(18) Metaspace: 5172K->5172K(1056768K)
[12.079s][debug][gc,heap ] GC(18) Heap after GC invocations=19 (full 0):
[12.079s][info ][gc ] GC(18) Pause Young (G1 Evacuation Pause) 803M->496M(1001M) 19.391ms
[12.079s][info ][gc,cpu ] GC(18) User=0.05s Sys=0.00s Real=0.02s

ÄêÇá´ú»ØÊÕ£¨Young-only£©

¶ÔÓÚ´¿´âµÄÄêÇá´ú»ØÊÕ£¬ÆäËã·¨ºÜ¼òµ¥£¬ÓëParallelºÍCMSµÄÄêÇá´úÊ®·ÖÀàËÆ£¬ÕâÊÇÒ»¸ö¶àÏ̲߳¢ÐÐÖ´ÐеĹý³Ì£¬Í¬ÑùÐèÒªStop-The-World£¨¶ÔÓ¦ÉϱßÈÕÖ¾ÖеÄPause Young£©£¬Í£ÏÂÀ´ËùÓеŤ×÷Ị̈߳¬È»ºó½«EdenÉÏ´æ»îµÄ¶ÔÏó¿½±´µ½SuvivorÇøÓò£¬ÕâÀï»á½«ºÜ¶à¸ö¶ÔÏó´Ó¶à¸ö²»Í¬µÄÇøÓò¿½±´µ½ÉÙÊýµÄ¼¸¸öÇøÓòÄÚ£¬ËùÒÔÕâÒ»²½ÔÚG1ÖнÐ×öÊèÉ¢£¨Evacuation£©£¬Í¬Ê±°ÑSuvivorÉÏ´¥¼°ÄêÁäãÐÖµµÄ¶ÔÏó½úÉýµ½ÀÏÄê´úÇøÓò¡£

ÀÏÄê´ú»ØÊÕ£¨concurrent cycle£©

1.G1µÄÀÏÄê´ú»ØÊÕÊÇÔÚÀÏÄê´ú¿Õ¼ä´¥¼°Ò»¸öãÐÖµ£¨Initiating Heap Occupancy Percent£©Ö®ºó£¬Õâ¸ö»ØÊÕ°éËæ×ÅÄêÇá´úµÄ»ØÊÕ¹¤×÷£¬µ«ÓëÉϱßËù˵µÄ»ØÊÕÓÐЩ²»Í¬¡£

ÄêÇá´ú»ØÊÕ£º°éËæ×ÅÄêÇá´úµÄ»ØÊÕ¹¤×÷£¬Í¬Ê±»áÖ´Ðв¢·¢±ê¼ÇºÍÒ»²¿·ÖÇåÀíµÄ¹¤×÷£¬ÕâÑù¿ÉÒÔ¹²ÓÃÄêÇá´úÀ¬»ø»ØÊÕµÄStop-The-World¡£

µÚÒ»´Î±ê¼Ç£º¶ÔÓ¦Ò»´ÎPause Initial Mark

ºÍCMSµÄ²½ÖèÀàËÆ£¬Ê×ÏȽøÐеÚÒ»´Î±ê¼Ç¡£µ«ÊµÏÖ·½·¨ÉÏÓкܴóµÄÇø±ð£¬G1Ê×ÏȶԵ±Ç°¶ÑÉϵĶÔÏóÇé¿ö½øÐÐÒ»¸öÐéÄâ¿ìÕÕ£¨Snapshot-At-The-Beginning£©£¬È»ºó¸ù¾ÝÕâ¸ö¿ìÕÕ¶ÔÀÏÄê´úµÄ¶ÔÏóºÍÇøÓò½øÐбê¼Ç£¬²¢Ö´ÐÐÖ®ºóµÄÀ¬»ø»ØÊÕ¡£Ö®ºóÏñCMSÒ»Ñù»áÓв¢·¢±ê¼ÇµÄ¹ý³Ì¡£

ÕâÑù»á²úÉúÒ»¸öÎÊÌ⣬ÔÚÕâ´Î»ØÊÕ½áÊøÖ®ºó£¬»áÓÐЩ¶ÔÏóÔÚ²¢·¢±ê¼ÇµÄ¹ý³ÌÖУ¬ËüµÄ¿É´ïÐÔÒѾ­±ä»¯£¬µ¼ÖÂÒѾ­²»¿É´ïµÄ¶ÔÏóÈÔȻûÓб»»ØÊÕ¡£µ«ÊÇÕâÑùÄÜ´øÀ´¸üºÃµÄÏìӦʱ¼ä¡£

ÖØÐ±ê¼Ç£º¶ÔÓ¦Ò»´ÎPause Remark

ÔÚÕâ¸ö½×¶Î£¬G1Ê×ÏÈÍê³ÉÉÏÒ»²½¿ªÊ¼µÄ±ê¼Ç¹¤×÷£¬Ö®ºó»á¶ÔÌØÊâÒýÓõĶÔÏó½øÐд¦Àí£¨¾ßÌå¿ÉÒԲο¼JDK½â¹¹ ¨C JavaÖеÄÒýÓúͶ¯Ì¬´úÀíµÄʵÏÖ£©£¬»¹ÓжÔMetaspaceÇøÓò½øÐÐÀ¬»ø»ØÊÕ¡£ÕâÒ»²½»á½øÐÐStop-The-World¡£

ÇåÀí£º¶ÔÓ¦Ò»´ÎPause Cleanup

ÕâÒ»²½Ö÷Òª×öµÄÊÇÊÕ¼¯µ±Ç°¶ÑÖеÄÄÚ´æÇøÓòÐÅÏ¢£¬¶Ô¿ÕµÄÇøÓò½øÐлØÊÕ£¬Îª½ÓÏÂÀ´µÄ¿Õ¼ä»ØÊÕ×öһЩ׼±¸¹¤×÷£¬ÇåÀí½áÊøÖ®ºó£¬Í¨³£»á°éËæ×ÅÒ»´ÎÄêÇá´ú»ØÊÕ£¬Èç¹ûÅжϲ»ÐèÒª½øÐÐ¿Õ¼ä»ØÊÕ£¬Ôò»á½øÈëÏÂÒ»¸öÄêÇá´ú»ØÊյŤ×÷¡£ÕâÒ»²½»á½øÐÐStop-The-World¡£

2.»ìºÏÀ¬»ø»ØÊÕ£º¶ÔÓ¦Ò»´Î»ò¶à´ÎPause Mixed

Ö÷Òª×öµÄÊǶÔÀÏÄê´úµÄÇøÓòÄÚ´æ½øÐÐÊèÉ¢£¨Evacuation£©£¬Ò²°üº¬¶ÔÄêÇá´úµÄÇøÓò»ØÊÕ¹¤×÷¡£Í¬Ê±ÕâÒ»²½Ò²»á¶¯Ì¬µØµ÷ÕûIHOP

´Ó¶ÔG1µÄGCÈÕÖ¾µÄ·ÖÎö£¬¿ÉÒÔ¿´µ½G1µÄÀ¬»ø»ØÊÕÐÐΪÊÇ»ùÓÚÒ»¸ö¿ÉÔ¤²âµÄÄ£ÐÍ£ºGC»á²»¶ÏµÄÖ÷¶¯´¥·¢À¬»ø»ØÊÕ£¬ÔÚÕâ¸ö¹ý³ÌÖв»¶ÏµØ½øÐÐÐÅϢͳ¼ÆºÍϵͳGC²ÎÊýµÄÉèÖã¬È»ºó½«ÉϱßÕâЩ²½Öè°²ÅÅÔÚÕâЩÀ¬»ø»ØÊÕ¹ý³ÌÖС£

´ó¶ÔÏóµÄ·ÖÅä

Õý³£Çé¿öÏ£¬Ò»¸ö¶ÔÏó»áÔÚÄêÇá´úµÄEdenÖд´½¨£¬È»ºóͨ¹ýÀ¬»ø»ØÊÕºÍÄêÁä¹ÜÀíÖ®ºó£¬½úÉýµ½ÀÏÄê´ú¡£µ«¶ÔÓÚijЩ±È½Ï´óµÄ¶ÔÏ󣬿ÉÄÜ»áÖ±½Ó·ÖÅäµ½ÀÏÄê´úÈ¥¡£

¶ÔÓÚG1£¬¶ÔÏó´ó¶àÊýÇé¿ö¶¼»áÔÚEdenÉÏ·ÖÅ䣬Èç¹ûJVMÅжÏÒ»¸ö¶ÔÏóΪ´ó¶ÔÏ󣍯äãÐÖµ¿ÉÒÔͨ¹ý-XX:G1HeapRegionSizeÀ´ÉèÖã©£¬Ôò»áÖ±½Ó·ÖÅäÈçÀÏÄê´úµÄ´ó¶ÔÏóÇøÓòÖС£

¶ÔÓÚÆäËûµÄÄÚ´æÇøÓòÁ¬ÐøµÄGC£¬ÏÂÃæÊÇ´ÓStackOverflowÉϰáÔ˹ýÀ´µÄ¶ÔÏóÔÚ¶ÑÉϵķÖÅä¹ý³Ì£º

1.ʹÓà thread local allocation buffer (TLAB), Èç¹û¿Õ¼ä×ã¹»£¬Ôò·ÖÅä³É¹¦¡£

2.´ÓÃû³Æ±ã¿ÉÖª£¬TLABÊÇÏ̶߳ÀÕ¼µÄ£¬ËùÒÔḬ̈߳²È«£¬ÇÒËٶȷdz£¿ì¡£Èç¹ûÒ»¸öTLABÂúÁË£¬Ï̻߳ᱻ·ÖÅäÒ»¸öеÄTLAB¡£

3.Èç¹ûTLAB ¿Õ¼ä²»¹»Õâ´Î·ÖÅä¶ÔÏ󣬵«ÆäÖл¹Óкܶà¿Õ¼ä¿ÉÓã¬Ôò²»Ê¹ÓÃTLAB£¬Ö±½ÓÔÚEdenÖзÖÅä¶ÔÏó¡£

4.Ö±½ÓÔÚEdenÉÏ·ÖÅä¶ÔÏóҪȥÇÀÕ¼EdenÖеÄÖ¸Õë²Ù×÷£¬Æä´ú¼Û½ÏʹÓÃTLABÒª´óһЩ¡£

Èç¹ûEdenµÄ¶ÔÏó·ÖÅäʧ°Ü£¬³ö·¢Minor GC¡£

Èç¹ûMinor GCÍê³Éºó»¹²»¹»£¬ÔòÖ±½Ó·ÖÅäµ½ÀÏÄê´ú¡£

һЩ¼òµ¥µÄGCµ÷ÓÅ·½·¨

1. ʹÓò»Í¬µÄË÷Òý¶ÔÏó

ÒýÓõÄÀàÐÍ»áÖ±½ÓÓ°ÏìÆäËùÒýÓöÔÏóµÄGCÐÐΪ£¬µ±Òª×öһЩÄÚ´æÃô¸ÐµÄÓ¦ÓÃʱ£¬¿ÉÒԲο¼Ê¹ÓúÏÊʵÄÒýÓÃÀàÐÍ¡£¾ßÌå¿ÉÒԲο¼JDK½â¹¹ ¨C JavaÖеÄÒýÓúͶ¯Ì¬´úÀíµÄʵÏÖ¡£

2. ʹÓÃParallel

´ÓÉÏÎÄÖпÉÖª£¬Java 8ĬÈϵÄGCÊÇParallel£¬ËüÒ²½ÐThroughput£¬ËùÒÔËüµÄÄ¿µÄÊǾ¡¿ÉÄܵÄÔö¼ÓϵͳµÄÍÌÍÂÁ¿¡£ÔÚParallelÀ¿ÉÒÔͨ¹ý²ÎÊýµ÷½Ú×î´óֹͣʱ¼ä£¨-XX:MaxGCPauseMillis£¬Ä¬ÈÏÎÞÉèÖ㩺ÍÍÌÍÂÁ¿£¨-XX:GCTimeRatio£¬Ä¬ÈÏÖµÊÇ99£¬¼´×î´óʹÓÃ1%µÄʱ¼äÀ´×öÀ¬»ø»ØÊÕ£©À´µ÷ÓÅGCµÄÐÐΪ¡£ÆäÖÐÉèÖÃ×î´óֹͣʱ¼ä¿ÉÄܻᵼÖÂGCµ÷½Ú¸÷ÄêÁä´ú·ÖÇøµÄ³ß´ç£¨Í¨¹ýÔöÁ¿À´ÊµÏÖ£©¡£

3. ʹÓÃG1

´ÓJava 9¿ªÊ¼G1±ä³ÉÁËĬÈϵÄGC£¬G1ÖÐÓÐһЩϸ½ÚµÄ¸ÅÄîÔÚÉÏÎÄÖÐûÓÐÐðÊö£¬ÕâÀïÏȽéÉÜһϣº

1.Remembered Sets£¨Rsets£©£º¶ÔÓÚÿ¸öÇøÓò£¬¶¼ÓÐÒ»¸ö¼¯ºÏ¼Ç¼Õâ¸öÇøÓòÖÐËùÓеÄÒýÓá£

2.G1 refinement£ºG1ÖÐÐèÒªÓÐһϵÁеÄÏ̲߳»¶ÏµØÎ¬»¤Rsets¡£

3.Collection Sets£¨Csets£©£ºÔÚÀ¬»ø»ØÊÕÖÐÐèÒª±»»ØÊÕµÄÇøÓò£¬ÕâÐ©ÇøÓòÖеĿɴï¶ÔÏ󣨻î×ŵĶÔÏ󣩻ᱻÊèÉ¢¡£ÕâÐ©ÇøÓò¿ÉÄÜÊÇÈκÎÄêÁä´ú¡£

4.дÆÁÕÏ£¨Write Barriers£©£º¶ÔÓÚÿһ´Î¸³Öµ²Ù×÷£¬G1¶¼»áÓÐÁ½¸öдÆÁÕÏ£¬Ð´Ö®Ç°£¨Pre-Write£©Ò»¸ö£¬Ð´Ö®ºó£¨Post-Write£©Ò»¸ö¡£Pre-writeÖ÷ÒªÓëSATBÏà¹Ø£¬Post-writeÖ÷ÒªÓëRsetsÏà¹Ø

5.Dirty Card Queue£ºÐ´ÆÁÕϻὫдµÄ¼Ç¼·ÅÈëÕâ¸ö¶ÓÁУ¬»áÓÐÏ߳̽«ÕâÀïµÄ¶ÔÏ󲻶ϵÄË¢ÈëRsets¡£

6.Green/Yellow/Red Zone£ºÈý¸ö»áÓ°Ïì´¦ÀíDirty Card QueueÏß³ÌÊýµÄãÐÖµ¡£¸ù¾ÝDirty Card QueueÖÐÔªËØµÄ¸öÊý£¬¿ÉÒÔÀ´ÉèÖÃһЩGCÐÐΪ£¨¿ÉÒÔÈÏΪÊÇÂß¼­ÉϽ«Dirty Card Queue·Ö¸ô³É¶à¸öÇøÓò£©¡£Green±íʾ³¬¹ý´ËãÐÖµÔò¿ªÊ¼Ð½¨Ïß³ÌÀ´´¦ÀíÕâ¸ö¶ÓÁУ¬Yellow±íʾ³¬¹ý´ËãÐÖµ£¬Ç¿ÖÆÆô¶¯ÕâЩỊ̈߳¬Red±íʾ³¬¹ý´ËãÐÖµÔò»áÈÃд²Ù×÷µÄÏß³Ì×Ô¼ºÀ´Ö´ÐÐG1 refinement¡£

G1ÌṩÁ˷ḻµÄ»ùÓÚ²»Í¬Ä¿µÄµÄ¿Éµ÷ÓŵIJÎÊý£¬ÁбíÈçÏ£º

 

   
2426 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö