ÔÚ¾¹ýÁ˼¸´ÎÌøÆ±Ö®ºó£¬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ÎÊý£¬ÁбíÈçÏ£º

|