ÎÄÕÂĿ¼
1. JavaÄÚ´æÇøÓòÓëÄÚ´æÒç³öÒì³£
1.1. ÔËÐÐʱÊý¾ÝÇøÓò
1.1.1. ³ÌÐò¼ÆÊýÆ÷
1.1.2. javaÐéÄâ»úÕ»
1.1.3. ±¾µØ·½·¨Õ»
1.1.4. Java¶Ñ(Java Heap)
1.1.5. ·½·¨Çø
1.1.6. ÔËÐÐʱ³£Á¿³Ø
1.1.7. Ö±½ÓÄÚ´æ
1.2. HotSpotÐéÄâ»ú
1.2.1. ¶ÔÏóµÄ´´½¨
1.2.2. ¶ÔÏóµÄ·ÃÎʶ¨Î»
1.3. OOMÒì³£µÄ½â¾ö˼·
1.4. ²Î¿¼

JavaÄÚ´æÇøÓòÓëÄÚ´æÒç³öÒì³£
ÔËÐÐʱÊý¾ÝÇøÓò

ÉîÈëÀí½âjvmÖ®ÄÚ´æÇøÓòÓëÄÚ´æÒç³ö
³ÌÐò¼ÆÊýÆ÷
µ±Ç°Ïß³ÌËùÖ´ÐеÄ×Ö½ÚÂëµÄÐкÅָʾÆ÷
µ±Ç°Ïß³Ì˽ÓÐ
²»»á³öÏÖOutOfMemoryErrorÇé¿ö
javaÐéÄâ»úÕ»
Ïß³Ì˽ÓУ¬ÉúÃüÖÜÆÚÓëÏß³ÌÏàͬ
java·½·¨Ö´ÐеÄÄÚ´æÄ£ÐÍ£¬Ã¿¸ö·½·¨Ö´ÐеÄͬʱ¶¼»á´´½¨Ò»¸öÕ»Ö¡£¬´æ´¢¾Ö²¿±äÁ¿±í(»ù±¾ÀàÐÍ¡¢¶ÔÏóÒýÓÃ)¡¢²Ù×÷ÊýÕ»¡¢¶¯Ì¬Á´½Ó¡¢·½·¨³ö¿ÚµÈÐÅÏ¢
StackOverflowErrorÒì³££ºµ±Ïß³ÌÇëÇóµÄÕ»Éî¶È´óÓÚÐéÄâ»úËùÔÊÐíµÄÉî¶È
OutOfMemoryErrorÒì³££ºÈç¹ûÕ»µÄÀ©Õ¹Ê±ÎÞ·¨ÉêÇëµ½×ã¹»µÄÄÚ´æ
±¾µØ·½·¨Õ»
ÓëÐéÄâ»úÕ»ÏàËÆ£¬Ö÷ҪΪÐéÄâ»úʹÓõ½µÄNative·½·¨·þÎñ£¬ÔÚHotSpotÐéÄâ»úÖÐÖ±½Ó°Ñ±¾µØ·½·¨Õ»ÓëÐéÄâ»úÕ»¶þºÏÒ»
Java¶Ñ(Java Heap)
java¶ÑÊDZ»ËùÓÐÏ̹߳²ÏíµÄÒ»¿éÄÚ´æÇøÓò£¬ÔÚ ÐéÄâ»úÆô¶¯Ê±´´½¨¡£´ËÇøÓòµÄΨһĿµÄ¾ÍÊÇ´æ´¢¶ÔÏóʵÀý¡£java¶ÑÊÇÀ¬»øÊÕ¼¯Æ÷¹ÜÀíµÄÖ÷񻂿Óò¡£java¶Ñ»¹¿ÉÒÔϸ·ÖΪ£ºÐÂÉú´úÓëÀÏÄê´ú¡£ÔÚϸһµãÓÐ
Eden¿Õ¼ä¡¢Form Survivor¿Õ¼ä¡¢To Survivor¿Õ¼äµÈ¡£
¿ÉÒÔͨ¹ý-XmxºÍ-Xms¿ØÖƶѵĴóС
OutOfMemoryErrorÒì³££ºµ±ÔÚ¶ÑÖÐûÓÐÄÚ´æÍê³ÉʵÀý·ÖÅ䣬ÇÒ¶ÑÒ²ÎÞ·¨ÔÙÀ©Õ¹Ê±¡£
·½·¨Çø
Ï̼߳乲Ïí
ÓÃÓÚ´æ´¢Òѱ»ÐéÄâ»ú¼ÓÔØµÄÀàÐÅÏ¢¡¢³£Á¿¡¢¾²Ì¬±äÁ¿¡¢¼´Ê±±àÒëÆ÷±àÒëºóµÄ´úÂëµÈÊý¾Ý
OutOfMemoryErrorÒì³££ºµ±·½·¨ÇøÎÞ·¨Âú×ãÄÚ´æµÄ·ÖÅäÐèÇóʱ
ÔËÐÐʱ³£Á¿³Ø
·½·¨ÇøµÄÒ»²¿·Ö
ÓÃÓÚ´æ·Å±àÒëÆÚÉú³ÉµÄ¸÷ÖÖ×ÖÃæÁ¿Óë·ûºÅÒýÓÃ
OutOfMemoryErrorÒì³££ºµ±³£Á¿³ØÎÞ·¨ÔÙÉêÇëµ½ÄÚ´æÊ±
Ö±½ÓÄÚ´æ
NIO¿ÉÒÔʹÓÃNativeº¯Êý¿âÖ±½Ó·ÖÅä¶ÑÍâÄڴ棬¶ÑÖеÄDirectByteBuffer¶ÔÏó×÷ΪÕâ¿éÄÚ´æµÄÒýÓýøÐвÙ×÷
´óС²»ÊÜJava¶Ñ´óСµÄÏÞÖÆ£¬Êܱ¾»ú(·þÎñÆ÷)ÄÚ´æÏÞÖÆ
OutOfMemoryErrorÒì³££ºÏµÍ³ÄÚ´æ²»×ãʱ
HotSpotÐéÄâ»ú
¶ÔÏóµÄ´´½¨
ÐéÄâ»úÓöµ½Ò»ÌõnewÖ¸Áîʱ£¬Ê×ÏȽ«È¥¼ì²éÕâ¸ö¶ÔÏóµÄ²ÎÊýÊÇ·ñÔÚ³£Á¿³ØÖж¨Î»µ½Ò»¸öÀàµÄ·ûºÅÒýÓ㬲¢ÇÒ¼ì²éÕâ¸ö·ûºÅÒýÓôú±íµÄÀàÊÇ·ñÒѱ»¼ÓÔØ¡¢½âÎöºÍ³õʼ»¯¹ý¡£Èç¹ûûÓУ¬±ØÐëÏÈÖ´ÐÐÀàµÄ¼ÓÔØ¹ý³Ì¡£
ÔÚÀà¼ÓÔØ¼ì²éͨ¹ýºó£¬ÐéÄâ»ú½«ÎªÐÂÉú¶ÔÏó·ÖÅäÄÚ´æ¡£¶ÔÏóËùÐèÄÚ´æ´óСÔÙÀà¼ÓÔØÍê³Éºó±ã¿ÉÈ·¶¨¡£ÄÚ´æ·ÖÅä¿ÉÒÔ²ÉÓá°Ö¸ÕëÅöײ¡±Óë¡°¿ÕÏÐÁÐ±í¡±µÄ·½Ê½¡£
¶ÔÏóµÄ·ÃÎʶ¨Î»
java³ÌÐòÐèҪͨ¹ýÕ»ÉϵÄreferenceÊý¾ÝÀ´²Ù×÷¶ÑÉϵľßÌå¶ÔÏó¡£·ÃÎÊ·½Ê½ÓÐʹÓþä±úºÍÖ±½ÓÖ¸ÕëÁ½ÖÖ¡£
¾ä±ú·ÃÎÊ java¶ÑÖн«»á»®·Ö³öÒ»¿éÄÚ´æÀ´×÷Ϊ¾ä±ú³Ø£¬referenceÖд洢µÄ¾ÍÊǶÔÏóµÄ¾ä±úµØÖ·£¬¶ø¾ä±úÖаüº¬Á˶ÔÏóʵÀýÊý¾ÝÓëÀàÐÍÊý¾Ý¸÷×ԵľßÌ嵨ַÐÅÏ¢
Ö±½ÓÖ¸Õë·ÃÎÊ java¶Ñ¶ÔÏóµÄ²¼¾ÖÖбØÐ뿼ÂÇÈçºÎ·ÅÖ÷ÃÎÊÀàÐÍÊý¾ÝµÄÏà¹ØÐÅÏ¢£¬referenceÖд洢µÄ¾ÍÊǶÔÏóµØÖ·
OOMÒì³£µÄ½â¾ö˼·
Éú³ÉDump¿ìÕÕÎļþ£º
ͨ¹ýjvm²ÎÊý¡ªXX:-HeapDumpOnOutOfMemoryError¿ÉÒÔÈÃJVMÔÚ³öÏÖÄÚ´æÒç³öÊÇDump³öµ±Ç°µÄÄÚ´æ×ª´¢¿ìÕÕ
ÓÃjmapÉú²údumpÎļþ£¬winͨ¹ýÈÎÎñ¹ÜÀíÆ÷²é¿´tomcatµÄ½ø³Ìpid£¬linuxÓÃpsÃüÁî²é¿´½ø³Ìpid,È»ºóÓÃjmapÃüÁî
ÏÈͨ¹ýÄÚ´æÓ³Ïñ·ÖÎö¹¤¾ß(ÈçEclipseµÄMemory Analyzer)½øÐзÖÎö£¬³£¼ûµÄÇé¿öÓУº
ÄÚ´æÐ¹Â¶£¬¶ÔÏóÒѾËÀÁË£¬ÎÞ·¨Í¨¹ýÀ¬»øÊÕ¼¯Æ÷½øÐÐ×Ô¶¯»ØÊÕ£¬Í¨¹ýÕÒ³öй¶µÄ´úÂëλÖúÍÔÒò£¬²ÅºÃÈ·¶¨½â¾ö·½°¸£»
ÄÚ´æÒç³ö£¬ÄÚ´æÖеĶÔÏó¶¼»¹±ØÐë´æ»î×Å£¬Õâ˵Ã÷Java¶Ñ·ÖÅä¿Õ¼ä²»×㣬¼ì²é¶ÑÉèÖôóС£¨-XmxÓë-Xms£©£¬¼ì²é´úÂëÊÇ·ñ´æÔÚ¶ÔÏóÉúÃüÖÜÆÚÌ«³¤¡¢³ÖÓÐ״̬ʱ¼ä¹ý³¤µÄÇé¿ö¡£
OOMÒ쳣ʾÀý£º
package oom;
import java.util.ArrayList; import java.util.List; /** * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * @ClassName: HeapOOM * */ public class HeapOOM { static class OOMObject{ } public static void main(String[] args) { List<OOMObject> list = new ArrayList<OOMObject>(); while(true){ list.add(new OOMObject()); } } } |
|