4.4 ÍøÂçIOÏûºÄ·ÖÎö
·Ö²¼Ê½ÏµÍ³£¬ÍøÂçIOµÄÏûºÄʱ·Ç³£ÖµµÃ¹Ø×¢µÄ£¬ÓÈÆäҪעÒâÍø¿¨ÖжÏÊDz»ÊǾùºâµØ·ÖÅäµ½¸÷CPUµÄ(¿Éͨ¹ý
cat /proc/interrupts ²é¿´µÄ)£¬¼ûͼ-25

ͼ-25
¶ÔÓÚÍøÂçÖжÏÖ»·ÖÅäµ½Ò»¸öCPUµÄÏÖÏó£¬google²ÉÓÃÐÞ¸ÄkernelµÄ·½·¨¶ÔÍøÂçÖжϷÖÅä²»¾ùµÄÎÊÌâ½øÐÐÐÞ¸´£¬¾ÝÆä²âÊÔÐÔÄÜ´ó¸ÅÄÜÌáÉý3x×óÓÒ£¬»òÊDzÉÓÃÖ§³ÖMSI-XµÄÍøÂçÀ´ÐÞ¸´¡£
ÓÉÓÚĬÈϵÄLinuxÄں˲ÎÊý¿¼ÂǵÄÊÇ×îͨÓõij¡¾°£¬ÕâÃ÷ÏÔ²»·ûºÏÓÃÓÚÖ§³Ö¸ß²¢·¢·ÃÎʵÄWeb·þÎñÆ÷µÄ¶¨Ò壬ËùÒÔÐèÒªÐÞ¸ÄLinux²ÎÊý£¬Ê¹µÃNginxµÈWeb·þÎñ¿ÉÒÔÓµÓиü¸ßµÄÐÔÄÜ£º
Ê×ÏÈ£¬ÐèÒªÐÞ¸Ä/etc/sysctl.confÀ´¸ü¸ÄÄں˲ÎÊý¡£ÈçÏÂ×î³£ÓõÄÅäÖÃ
fs.file-max = 999999 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_keepalive_time = 60 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.ip_local_port_range = 1024 61000 net.ipv4.tcp_rmem = 4096 32768 262142 net.ipv4.tcp_wmem = 4096 32768 262142 net.core.netdev_max_backlog = 8096 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 2097152 net.core.wmem_max = 2097152 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn.backlog = 1024 |
È»ºóÖ´ÐÐ sysctl -p ÃüÁʹÉÏÊöÐÞ¸ÄÉúЧ¡£
ÉÏÃæµÄ²ÎÊýÒâÒå½âÊÍÈçÏ£º
(1) file-max:Õâ¸ö²ÎÊý±íʾ½ø³Ì(±ÈÈçÒ»¸öwork½ø³Ì)¿ÉÒÔͬʱ´ò¿ªµÄ×î´ó¾ä±úÊý£¬Õâ¸ö²ÎÊýÖ±½ÓÏÞÖÆ×î´ó²¢·¢Á¬½ÓÊý£¬Ðè¸ù¾Ýʵ¼ÊÇé¿öÅäÖá£
(2) tcp_tw_reuse: Õâ¸ö²ÎÊýÉèÖÃΪ1£¬±íʾÔÊÐí½«TIME-WAIT״̬µÄsocketÖØÐÂÓÃÓÚеÄTCPÁ¬½Ó£¬Õâ¶ÔÓÚ·þÎñÆ÷À´ËµºÜÓÐÒâÒ壬ÒòΪ·þÎñÆ÷ÉÏ×Ü»áÓдóÁ¿TIME-WAIT״̬¡£
(3) tcp_keepalive_time: Õâ¸ö²ÎÊý±íʾµ±keepaliveÆôÓÃʱ£¬TCP·¢ËÍkeepaliveÏûÏ¢µÄƵÂÊ¡£Ä¬ÈÏÊÇ2Сʱ£¬Èô½«ÆäÉèÖõÄСһЩ£¬¿ÉÒÔ¸ü¿ìµÚÇåÀíÎÞЧµÄÁ¬½Ó¡£
(4) tcp_fin_timeout: Õâ¸ö²ÎÊý±íʾµ±·þÎñÆ÷Ö÷¶¯¹Ø±ÕÁ¬½Óʱ£¬socket±£³ÖÔÚFIN-WAIT-2״̬µÄ×î´óʱ¼ä¡£
(5) tcp_max_tw_buckets: Õâ¸ö²ÎÊý±íʾ²Ù×÷ϵͳÔÊÐíTIME_WAITÌ×½Ó×ÖÊýÁ¿µÄ×î´óÖµ£¬Èç¹û³¬¹ýÕâ¸öÊý×Ö£¬TIME_WAITÌ×½Ó×Ö½«Á¢¿Ì±»Çå³ý²¡´òÓ¡¾¯¸æÐÅÏ¢¡£¸Ã²ÎÊýĬÈÏΪ180000£¬¹ý¶àµÄTIME_WAITÌ×½Ó×Ö»áʹWeb·þÎñÆ÷±äÂý¡£
(6) tcp_max_syn_backlog:Õâ¸ö²ÎÊý±íʾTCPÈý´ÎÎÕÊÖ½¨Á¢½×¶Î½ÓÊÕSYNÇëÇó¶ÓÁеÄ×î´ó³¤¶È£¬Ä¬ÈÏΪ1024£¬½«ÆäÉèÖõôóһЩ¿ÉÒÔʹ³öÏÖNginx·±Ã¦À´²»¼°acceptÐÂÁ¬½ÓµÄÇé¿öʱ£¬Linux²»ÖÁÓÚ¶ªÊ§¿Í»§¶Ë·¢ÆðµÄÁ¬½ÓÇëÇó¡£
(7) ip_local_port_range:Õâ¸ö²ÎÊý¶¨ÒåÁËÔÚUDPºÍTCPÁ¬½ÓÖб¾µØ(²»°üÀ¨Á¬½ÓµÄÔ¶¶Ë)¶Ë¿ÚµÄȡֵ·¶Î§¡£
(8) net.ipv4.tcp_rmem:Õâ¸ö²ÎÊý¶¨ÒåÁËTCP½ÓÊÕ»º´æ(ÓÃÓÚTCP½ÓÊÕ»¬¶¯´°¿Ú)µÄ×îСֵ¡¢Ä¬ÈÏÖµ¡¢×î´óÖµ¡£
(9) net.ipv4.tcp_wmem:Õâ¸ö²ÎÊý¶¨ÒåÁËTCP·¢ËÍ»º´æ(ÓÃÓÚTCP·¢ËÍ»¬¶¯´°¿Ú)µÄ×îСֵ¡¢Ä¬ÈÏÖµ¡¢×î´óÖµ¡£
(10)netdev_max_backlog:µ±Íø¿¨½ÓÊÕÊý¾Ý°üµÄËÙ¶È´óÓÚÄں˴¦ÀíµÄËÙ¶Èʱ£¬»áÓÐÒ»¸ö¶ÓÁб£´æÕâЩÊý¾Ý°ü¡£Õâ¸ö²ÎÊý±íʾ¸Ã¶ÓÁеÄ×î´óÖµ¡£
(11)rmem_default£ºÕâ¸ö²ÎÊý±íʾÄÚºËÌ×½Ó×Ö½ÓÊÕ»º´æÇøÄ¬ÈϵĴóС¡£
(12)wmem_default£ºÕâ¸ö²ÎÊý±íʾÄÚºËÌ×½Ó×Ö·¢ËÍ»º´æÇøÄ¬ÈϵĴóС¡£
(13)rmem_max: Õâ¸ö²ÎÊý±íʾÄÚºËÌ×½Ó×Ö½ÓÊÕ»º´æÇøµÄ×î´ó´óС¡£
(14)wmem_max: Õâ¸ö²ÎÊý±íʾÄÚºËÌ×½Ó×Ö·¢ËÍ»º´æÇøµÄ×î´ó´óС¡£
(15)tcp_syncookies:¸Ã²ÎÊýÓëÐÔÄÜÎ޹أ¬ÓÃÓÚ½â¾öTCPµÄSYN¹¥»÷¡£
4.4.1 ÍøÂçIO·ÖÎöµÄ³£ÓÃÃüÁî
ÔÚLinuxÖпɲÉÓÃsar·ÖÎöÍøÂçIOµÄÏûºÄ×´¿ö£¬
sar ÃüÁî
Àý×Ó£º
sar -n ALL sar -n DEV sar -n { <keyword> [,...] | ALL } Network statistics Keywords are: DEV Network interfaces EDEV Network interfaces (errors) NFS NFS client NFSD NFS server SOCK Sockets (v4) IP IP traffic (v4) EIP IP traffic (v4) (errors) ICMP ICMP traffic (v4) EICMP ICMP traffic (v4) (errors) TCP TCP traffic (v4) ETCP TCP traffic (v4) (errors) UDP UDP traffic (v4) SOCK6 Sockets (v6) IP6 IP traffic (v6) EIP6 IP traffic (v6) (errors) ICMP6 ICMP traffic (v6) EICMP6 ICMP traffic (v6) (errors) UDP6 UDP traffic (v6)
|

ͼ-26
ÉÏÃæµÄÊä³öµÄÐÅÏ¢Ö÷Òª·ÖÈý²¿·Ö£º
µÚÒ»²¿·ÖÎªÍø¿¨Éϳɹ¦½Ó°üºÍ·¢°üµÄÐÅÏ¢£¬Æä±¨¸æÖеÄÐÅÏ¢Ö÷ÒªÓÐ: rxpck/s
txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
µÚ¶þ²¿·ÖÎªÍø¿¨ÉÏʧ°ÜµÄ½Ó°üºÍ·¢°üµÄÐÅÏ¢£¬Æä±¨¸æÖеÄÐÅÏ¢Ö÷ÒªÓÐ: rxerr/s
txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s
txfifo/s
µÚÈý²¿·ÖÎªÍø¿¨ÉÏsocketsµÄͳ¼ÆÐÅÏ¢£¬Æä±¨¸æÖеÄÐÅÏ¢Ö÷ÒªÓÐ: rtotsck
tcpsck udpsck rawsck ip-frag tcp-tw
¶ÔÓÚJavaÓ¦ÓöøÑÔ£¬Ê¹ÓõÄÖ÷ҪΪtcpsck ºÍ udpsck
tcpsck: Number of TCP sockets currently
in use.
udpsck: Number of UDP sockets currently
in use.
tcp-tw: Number of TCP sockets in TIME_WAIT
state.
ÈçÐèÒªÏêϸ¸ú×ÙTCP/IPͨÐŵĹý³ÌÐÅÏ¢£¬Ôò¿Éͨ¹ýtcpdumpÃüÁî½øÐС£
²é¿´ÍøÂçµÄ³£ÓÃÃüÁ
netstat -ps nfsstat ethtool snmp ifport ifconfig route arp ping traceroute host nslookup ifconfig eth0 |
Linuxϲ鿴ÄÇЩUDPÀàÐͶ˿ڿª·¢£¬ÄÇЩTCP¶Ë¿Ú¿ª·Å
netstat -nupl (UDPÀàÐ͵Ķ˿Ú)
netstat -ntpl (TCPÀàÐ͵Ķ˿Ú)
netstat -n | awk '/^tcp/ {++S[$NF]}
END {for(a in S) print a, S[a]}';
4.4.2 ÍøÂçIOÏûºÄ·ÖÎö°¸Àý
ÓÉÓÚû·½·¨·ÖÎö¾ßÌåÿ¸öÏß³ÌËøÏûºÄµÄÍøÂçIO, Òò´Ëµ±ÍøÂçIOÏûºÄ¸ßʱ£¬¶ÔÓÚJavaÓ¦ÓöøÑÔÖ»ÄܶԽø³Ì½øÐÐdump£¬²éÕÒ²úÉúÁË´óÁ¿ÍøÂçIO²Ù×÷µÄÏ̡߳£ÕâЩÏ̵߳ÄÌØÕ÷ÊǶÁÈ¡»òдÈëÍøÂçÁ÷£¬ÔÚÓÃJavaʵÏÖÍøÂçͨÐÅʱ£¬Í¨³£Òª½«¶ÔÏóÐòÁл¯Îª×Ö½ÚÁ÷£¬½øÐз¢ËÍ£¬»ò¶ÁÈ¡×Ö½ÚÁ÷£¬²¢·´ÐòÁл¯Îª¶ÔÏó¡£Õâ¸ö¹ý³ÌÒªÏûºÄJVM¶ÑÄڴ棬JVM¶ÑÄÚ´æ´óСͨ³£ÓÐÏÞ¡£
ÍøÂçÈÝÒ׳öÏÖÎÊÌâµØ·½È磺Êý¾Ý¿âÁ¬½ÓûÓйرÕ(ÔÚÅ׳öÒì³£µÄÇé¿öÏ¡¢ÍøÂç¾³£³öÏÖ¶¶¶¯Çé¿öÏÂ)¡£ Ò»¶Ë¹Ø±ÕÁíÒ»¶ËûÓйرյȡ£ÔËÐгÌÐò¼û²Î¿¼¸½¼þ:NetUsedHighTCPServer.java
ºÍ NetUsedHighTCPClient.java

ͼ-27 ÏÔʾ rxpck/s(Total number of packets
received per second.) txpck/s(Total number of packets
transmitted per second.) rxkB/s(Total number of kilobytes
received per second.) txkB/s(Total number of kilobytes
transmitted per second.) ¶¼±È½Ï¸ß

ͼ-28

ͼ-29

ͼ-30
4.5³ÌÐòÖ´ÐÐÂýÔÒò·ÖÎö
ÓÐЩÇé¿öʱ×ÊÔ´ÏûºÄ²»¶à£¬µ«³ÌÐòÖ´ÐÐÈÔÈ»Âý£¬ÕâÖÖÏÖÏó¶à³öÏÖÓÚ·ÃÎÊÁ¿²»ÊǷdz£´óµÄÇé¿öÏ£¬Ôì³ÉÕâÖÖÏÖÏóµÄÔÒòÖ÷ÒªÓÐÒÔÏÂÈýÖÖ£º
4.5.1. δ³ä·ÖʹÓÃÓ²¼þ×ÊÔ´
µ±Ç°Ö÷Á÷»úÆ÷CPU»ù±¾¶¼ÊÇ4»ò8ºË,Èç¹û³ÌÐòÖж¼Êǵ¥Ï̴߳®ÐеIJÙ×÷£¬²¢Ã»Óгä·Ö·¢»ÓÓ²¼þ×ÊÔ´µÄ×÷Óã¬ÄÇô¾Í¿É½øÐÐÒ»¶¨µÄÓÅ»¯(Èç:½«´®ÐÐÐÞ¸ÄΪ²¢·¢»ò²¢ÐеÄ)À´³ä·ÖʹÓÃÓ²¼þ×ÊÔ´£¬ÌáÉý³ÌÐòµÄÖ´ÐÐËÙ¶È¡£
Èç¹ûÔÚÒ»¶¨µÄ¸ºÔØÇé¿öÏ£¬¶àºËCPUʹÓÃÂʲ»¸ß£¬³ÌÐòÖ´ÐÐÂý(ͨ¹ý¼Ç¼ִÐеÄÕû¸ö¹ý³Ìʱ¼äÏûºÄ»òʹÓÃJProfilerµÈ¹¤¾ß)£¬ÕÒµ½Ö´ÐкÄʱ±ÈÀý×î´óµÄ´úÂë¡£
4.5.2. Ëø¾ºÕù¼¤ÁÒ
Ëø¾ºÕù¼¤ÁÒÖ±½Ó¾Í»áÔì³É³ÌÐòÖ´ÐÐÂý£¬ ÀýÈçÒ»¸öµäÐ͵ÄÀý×ÓÊÇÊý¾Ý¿âÁ¬½Ó³Ø(µ×²ãÒ²ÊÇÒ»¸öÍøÂçÁ¬½Ó³Ø)£¬Í¨³£Êý¾Ý¿âÁ¬½Ó³ØÌṩµÄÁ¬½ÓÊý¶¼ÊÇÓÐÏ޵ġ£¼ÙÉèÌṩµÄÊÇ10¸ö£¬ÄÇô¾ÍÒâζ×ÅͬʱÄܹ»½øÐÐÊý¾Ý¿â²Ù×÷µÄ¾ÍÖ»ÓÐ10¸öỊ̈߳¬¶øÈç¹û´ËʱÓÐ50¸öÏß³ÌÒª½øÐÐÊý¾Ý¿â²Ù×÷£¬ÄǾͻáÔì³ÉÁíÍâµÄ40¸öÏ̴߳¦Óڵȴý״̬£¬ÕâÖÖÇé¿ö϶ÔÓÚ8ºËÀàÐ͵ĻúÆ÷¶øÑÔ£¬CPUµÄÏûºÄ²¢²»»á¸ß£¬µ«³ÌÐòµÄÖ´ÐÐÈÔÈ»»á½ÏÂý¡£
4.5.3. Êý¾ÝÁ¿Ôö³¤
Êý¾ÝÁ¿Ôö³¤Í¨³£Ò²ÊÇÔì³É³ÌÐòÖ´ÐÐÂýµÄµäÐÍÔÒò£¬ÀýÈçµ±Êý¾Ý¿âÖе¥±íµÄÊý¾Ý´Ó100ÍòÌõ¼Ç¼ÉÏÕǵ½1¸öÒÚºó£¬Êý¾Ý¿âµÄ¶ÁдËٶȽ«´ó·ù¶ÈϽµ£¬ÏàÓ¦µÄ²Ù×÷´Ë±íµÄ³ÌÐòµÄÖ´ÐÐËÙ¶ÈÒ²¾ÍϽµÁË¡£
Èç¹ûÔÚÒ»¶¨µÄ¸ºÔØÇé¿öÏ£¬¶àºËCPUʹÓÃÂʲ»¸ß£¬³ÌÐòÖ´ÐÐÂý(ͨ¹ý¼Ç¼ִÐеÄÕû¸ö¹ý³ÌµÄʱ¼äÏûºÄ»òʹÓÃJProfilerµÈ¹¤¾ß)£¬ÕÒµ½Ö´ÐкÄʱ±ÈÀý×î´óµÄ´úÂë¡£
5 ÐÔÄܵ÷Õû(ÓÅ)
ÔÚѰÕÒµ½ÏµÍ³µÄÐÔÄÜÆ¿¾±ºó£¬½ÓÏÂÀ´µÄ²½Öè¾ÍÊǵ÷ÓÅ£¬ÒÔÌá¸ßϵͳÐÔÄÜ£¬ÏÁÒåµÄµ÷ÓÅͨ³£¿ÉÒÔ´ÓÓ²¼þ¡¢²Ù×÷ϵͳ¡¢JVMÒÔ¼°Ó¦ÓóÌÐòËĸö·½ÃæÈëÊÖ£¬Ó²¼þºÍ²Ù×÷ϵͳ·½ÃæµÄ֪ʶ²»ÊDZ¾ÎÄÕµÄÖØµã£¬ÏÂÃæ½áºÏÐÔÄÜÆ¿¾±µÄ·ÖÎö´ÓJVM¼°³ÌÐò·½ÃæÀ´½éÉÜһЩ³£Óõĵ÷ÓÅ·½·¨¡£
5.1 JVMµ÷ÓÅ
JVMµ÷ÓÅÖ÷ÒªÊÇÄÚ´æ¹ÜÀí·½ÃæµÄµ÷ÓŰüÀ¨ ¸÷¸ö´úµÄ´óС£¬GC²ßÂÔ µÈ¡£ÓÉÓÚGC¶¯×÷»á¹ÒÆðÓ¦ÓÃỊ̈߳¬ÑÏÖØÓ°ÏìÓ¦ÓóÌÐòµÄÐÔÄÜ£¬ÕâЩµ÷ÓŶÔÓÚÓ¦ÓóÌÐò¶øÑÔÖÁ¹ØÖØÒª£¬¸ù¾ÝÓ¦ÓóÌÐòµÄÇé¿öÑ¡Ôñ²»Í¬µÄÄÚ´æ¹ÜÀí²ßÂÔÓÐЩʱºòÄܹ»´ó·ù¶ÈµØÌáÉýÓ¦ÓóÌÐòµÄÐÔÄÜ£¬ÓÈÆäÊǶÔÓÚÄÚ´æÏûºÄ½Ï¶àµÄÓ¦Óá£ÏÂÃæ¾ÍÀ´¿´Ò»Ð©³£ÓõÄÄÚ´æ¹ÜÀíµ÷Óŵķ½·¨£¬ÕâЩ·½·¨¶¼ÊÇΪÁ˾¡Á¿½µµÍGCËùµ¼ÖµÄÓ¦ÓóÌÐòÔÝͣʱ¼ä¡£
5.1.1 ´ú´óСµÄµ÷ÓÅ
ÔÚ²»²ÉÓÃG1(G1²»Çø·Öminor GCºÍFull GC)µÄÇé¿öÏ£¬Í¨³£minor
GC»áÔ¶¿ìÓÚFull GC, ¸÷¸ö´úµÄ´óСÉèÖÃÖ±½Ó¾ö¶¨ÁËminor GCºÍFull GC´¥·¢µÄʱ»ú£¬ÔÚ´ú´óСµÄµ÷ÓÅÉÏ£¬×î¹Ø¼üµÄ²ÎÊýΪ:-Xms
-Xmx -Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold
-XmsºÍ-Xmxͨ³£ÉèÖÃΪÏàͬµÄÖµ£¬±ÜÃâÔËÐÐʱҪ²»¶ÏµØÀ©Õ¹JVMÄÚ´æ¿Õ¼ä£¬Õâ¸öÖµ¾ö¶¨ÁËJVM
HeapËùÄÜʹÓõÄ×î´ó¿Õ¼ä¡£
-Xmn¾ö¶¨ÁËÐÂÉú´ú(New Generation)¿Õ¼äµÄ´óС£¬ÐÂÉú´úÖÐEden¡¢S0
ºÍ S1 Èý¸öÇøÓòµÄ±ÈÂÊ¿Éͨ¹ý-XX:SurvivorRatio À´¿ØÖÆ¡£
-XX:MaxTenuringThreshold ¿ØÖƶÔÏóÔÚ¾Àú¶àÉÙ´ÎMinor
GCºó²ÅתÈë¾ÉÉú´ú£¬Í¨³£ÓÖ½«´ËÖµ³ÆÎªÐÂÉú´ú´æ»îÖÜÆÚ£¬´Ë²ÎÊýÖ»ÓÐÔÚ´®ÐÐGCʱÓÐЧ£¬ÆäËûGC·½Ê½Ê±ÔòÓÉSun
JDK×ÔÐоö¶¨¡£
½éÉÜMinor GC ºÍ Full GC´¥·¢µÄʱ»ú£¿£¿£¬ÔÚ´Ë´¦¾ÍÖ±½Ó¾ÙÀýÀ´¿´¿´²»Í¬µÄ´ú´óСÉèÖÃÇé¿öÏ£¬Ó¦ÓúķÑÔÚGCÉϵÄʱ¼ä£¬´ÓÖÐÒ²¿É¿´³öÔÚ²»Í¬µÄ³¡¾°Ï´ú´óСµ÷Óŵķ½·¨¡£
5.1.1.1. ±ÜÃâÐÂÉú´ú´óС ÉèÖùýС
µ±ÐÂÉú´ú´óСÉèÖùýСʱ»á²úÉúÁ½ÖֱȽÏÃ÷ÏÔµÄÏÖÏó: Ò»ÊÇminor GCµÄ´ÎÊý¸ü¼ÓƵ·±£»¶þÊÇÓпÉÄܵ¼ÖÂminor
GC¶ÔÏóÖ±½Ó½øÈë¾Éʱ´ú£¬´ËʱÈç½øÈë¾ÉÉú´úµÄ¶ÔÏóÕ¼¾ÝÁ˾ÉÉú´úÊ£Óà¿Õ¼ä£¬Ôò´¥·¢Full GC.
ÔËÐÐʾÀý³ÌÐò(ʾÀý³ÌÐòGCDemo.javaÔڲο¼²¿·ÖÏÂÔØ)
Ê×ÏÈÒÔJVMÆô¶¯²ÎÊý£º-Xms135M -Xmx135M -Xmn10M
-XX:+UseSerialGCÖ´ÐÐÉÏÃæµÄ´úÂ룬ͨ¹ýjstat¸ú×Ùµ½µÄGC×´¿öΪ£º

ͼ-31
Æä´Î£¬°´ÕÕÕâÑùµÄ˼·µ÷´óÐÂÉú´úµ½30MB,ÔòJVMÆô¶¯²ÎÊýΪ£º-Xms135M
-Xmx135M -Xmn50M -XX:+UseSerialGCÖ´ÐÐÉÏÃæµÄ´úÂ룬ͨ¹ýjstat¸ú×Ùµ½µÄGC×´¿öΪ£º

ͼ-32
ͨ¹ý¶Ô±È·¢ÏÖ£¬µ±ÅäÖÃ-Xmn10MÓë-Xmn50M,GCTºÄ·ÑµÄʱ¼ä´Ó0.403Ãë½µµ½0.237Ãë¡£
³ýÁ˵÷´óÐÂÉú´ú´óСÍ⣬Èç¹ûÄܹ»µ÷´óJVM HeapµÄ´óС£¬Í¨³£Òâζ×ŵ¥´ÎGCʱ¼äµÄÔö¼Ó¡£
µ±minor GC¹ýÓÚÆµ·±£¬»ò·¢ÏÖ¾³£³öÏÖminor GCʱ£¬SurvivorµÄÒ»¸öÇøÓò¿Õ¼äÂú£¬ÇÒOld
GenÔö³¤³¬¹ýÁËSurvivorÇøÓò´óСʱ£¬¾ÍÐèÒª¿¼ÂÇÐÂÉú´ú´óСµÄµ÷ÕûÁË¡£µ÷ÕûʱµÄÔÔòÊÇÔÚ²»Äܵ÷´óJVM
HeapµÄÇé¿öÏ£¬¾¡¿ÉÄÜ·Å´óÐÂÉú´ú¿Õ¼ä£¬¾¡Á¿ÈöÔÏóÔÚminorGC½×¶Î±»»ØÊÕ£¬µ«ÐÂÉú´ú¿Õ¼äÒ²²»¿É¹ý´ó£»ÔÚÄܹ»µ÷´óJVM
HeapµÄÇé¿öÏ£¬Ôò¿ÉÒÔ°´ÕÕÔö¼ÓµÄÐÂÉú´ú¿Õ¼ä´óСÔö¼ÓJVM Heap´óС£¬ÒÔ±£Ö¤¾ÉÉú´ú¿Õ¼ä¹»Óá£
5.1.1.2. ±ÜÃâÐÂÉú´ú´óС ÉèÖùý´ó
ÐÂÉú´úÉèÖùý´ó»á´øÀ´Á½¸öµäÐ͵ÄÏÖÏó£¬Ò»ÊǾÉÉú´ú±äСÁË£¬ÓпÉÄܵ¼ÖÂFull
GCƵ·±Ö´ÐУ» ¶þÊÇminor GCµÄºÄʱ´ó·ù¶ÈÔö¼Ó¡£
ÈÔÈ»ÓÃÉÏÃæµÄÀý×Ó Ê×ÏÈÒÔJVMÆô¶¯²ÎÊý£º-Xms135M -Xmx135M
-Xmn105M -XX:+UseSerialGCÖ´ÐÐÉÏÃæµÄ´úÂ룬ͨ¹ýjstat¸ú×Ùµ½µÄGC×´¿öΪ£º
Ê×ÏÈÒÔJVMÆô¶¯²ÎÊý£º-Xms135M -Xmx135M -Xmn105M
-XX:+UseSerialGC Ö´ÐÐÉÏÃæµÄ´úÂ룬ͨ¹ýjstat¸ú×Ùµ½µÄGC×´¿öΪ£º

ͼ-33
Æä´ÎÒÔJVMÆô¶¯²ÎÊý£º-Xms135M -Xmx135M -Xmn25M
-XX:+UseSerialGC Ö´ÐÐÉÏÃæµÄ´úÂ룬ͨ¹ýjstat¸ú×Ùµ½µÄGC×´¿öΪ£º

ͼ-34
´ÓÕâ¸öµ÷ÕûºÍ֮ǰ°ÑÐÂÉú´úµ÷Ϊ25MBʱ¶Ô±È£¬´Ëʱminor GCϽµÁË£¬µ«Full
GCÈÔÈ»¶àÁËÒ»´Î¡£ÔÒòÔÚÓÚ£¬µ±µÚ¶þ´Îµ½´ïminor GCµÄ´¥·¢Ìõ¼þʱ£¬JVM»ùÓÚ±¯¹ÛÔÔò£¬ÅжÏĿǰoldÇøµÄÊ£Óà¿Õ¼äСÓÚ¿ÉÄÜ»á´ÓÐÂÉú´ú½úÉýµ½oldÇøµÄ¶ÔÏóµÄ´óС£¬ÓÚÊÇÖ´ÐÐÁËFull
GC,´Ó¶øminor GCÏûºÄµÄʱ¼äÀ´¿´£¬µ¥´Êminor GCµÄʱ¼äÒ²±ÈÒÔǰÂýÁ˲»ÉÙ¡£
´ÓÉÏÃæµÄ·ÖÎöÀ´¿´£¬¿É¼ûÐÂÉú´úͨ³£²»ÄÜÉèÖõùý´ó£¬´ó¶àÊý³¡¾°Ï¶¼Ó¦ÉèÖõıȾÉÉú´úС£¬Í¨³£ÍƼöµÄ±ÈÀýÊÇÐÂÉú´úÕ¼JVM
HeapÇø´óСµÄ33%×óÓÒ¡£
5.1.1.3. ±ÜÃâSurvivorÇøÉèÖùýС»ò¹ý´ó
ÔÚ²ÉÓô®ÐÐGCʱ£¬Ä¬ÈÏÇé¿öÏÂEden¡¢S0¡¢s1µÄ´óС±ÈÀýΪ 8:1,µ÷ÕûΪÒÔϲÎÊýÖ´ÐÐÉÏÃæµÄʾÀý´úÂ룺
java -Xms135M -Xmx135M -Xmn20M -XX:SurvivorRatio=10
-XX:+UseSerialGC -jar GCDemo.jar ,ͨ¹ýjstat -gc [pid]
1000 50 ¹Û²ìµ½ÆäGC×´¿öΪ£º

ͼ-35
´ÓÉÏÃæµÄ·ÖÎöÀ´¿´£¬ÔÚÎÞ·¨µ÷ÕûJVM HeapÒÔ¼°ÐÂÉú´úµÄ´óСʱ£¬ºÏÀíµ÷ÕûSurvivorÇøµÄ´óСҲÄÜ´øÀ´Ò»Ð©Ð§¹û¡£
µ±µ÷´óSurvivorRatioÖµÒâζ×ÅEdenÇøÓò±ä´ó£¬minor GCµÄ´¥·¢´ÎÊý»á½µµÍ£¬µ«´ËʱSurvivorÇøÓòµÄ¿Õ¼ä±äСÁË£¬ÈçÓг¬¹ýSurvivor¿Õ¼ä´óСµÄ¶ÔÏóÔÚminor
GCºóÈÔûÓб»»ØÊÕ£¬Ôò»áÖ±½Ó½øÈë¾ÉÉú´ú£»
µ±µ÷СSurvivorRatioÔòÒâζ×ÅEdenÇøÓò±äС£¬minor GCµÄ´¥·¢´ÎÊý»áÔö¼Ó£¬SurvivorÇøÓò±ä´ó£¬Òâζ×Å¿ÉÒÔ´æ´¢¸ü¶àÔÚminor
GCºóÈÔ´æ»îµÄ¶ÔÏ󣬱ÜÃâÆä½øÈë¾ÉÉú´ú¡£
5.1.1. 4. ºÏÀíÉèÖÃÐÂÉú´ú´æ»îÖÜÆÚ
ÐÂÉú´ú´æ»îÖÜÆÚµÄÖµ¾ö¶¨ÁËÐÂÉú´úµÄ¶ÔÏó¾¹ý¶àÉÙ´ÎMinor GCºó½øÈë¾ÉÉú´ú£¬Òò´ËÕâ¸öÖµÒ²ÐèÒª¸ù¾ÝÓ¦ÓõÄ×´¿öÀ´×öÕë¶ÔÐԵĵ÷ÓÅ£¬JVM²ÎÊýÉÏÕâ¸öÖµ¶ÔÓ¦µÄΪ-XX:MaxTenuringThreshold£¬Ä¬ÈÏֵΪ15´Î£¬
ÏÂÃæÍ¨¹ýÉèÖòÎÊýµÄÀý×Ó(²Î¿¼²¿·Ö¸½¼þ)¿´Ò»Ï£º
Ê×ÏÈ -Xms150M -Xmx150M -Xmn20M -XX:+UseSerialGCÖ´ÐдúÂ룬ִÐнá¹ûÈçÏÂ

ͼ-36
Æä´Î -Xms150M -Xmx150M -Xmn20M -XX:+UseSerialGC
-XX:MaxTenuringThreshold=20 Ö´ÐдúÂ룬ִÐнá¹ûÈçÏ£º

ͼ-37
´ÓÉÏÃæµÄµ÷Õû½á¹û¿É¼û£¬ÔÚÔö´óÁË´æ»îÖÜÆÚºó£¬¶ÔÏóÔÚMinor GC½×¶Î±»»ØÊյĻú»á¾ÍÔö¼ÓÁË£¬µ«Í¬Ê±´øÀ´µÄÊÇsurvivorÇø±»Õ¼Ó㬵«´ËÖµ½öÔÚ´®ÐÐGCºÍParNew
GCʱ¿Éµ÷Õû¡£
×ܽáÉÏÃæµÄ¼¸¸öÀý×ÓÀ´¿´£¬¶ÔÓÚ´ú´óСµÄµ÷ÓÅ£¬Ö÷ÒªÊǺÏÀíµ÷Õû -Xms¡¢-Xmx¡¢-Xmn
ÒÔ¼° -XX:SurvivorRatioµÄÖµ£¬¾¡¿ÉÄܼõÉÙGCËùÕ¼ÓõÄʱ¼ä¡£
-Xms¡¢-XmxÊÊÓÃÓÚµ÷ÕûÕû¸öJVM HeapÇø´óС£¬ÔÚÄÚ´æ²»¹»ÓõÄÇé¿öÏ¿ÉÊʵ±¼Ó´ó´ËÖµ£¬Õâ¸öÖµÄܵ÷Õûµ½¶à´ó
È¡¾öÓÚ²Ù×÷ϵͳλÊý ÒÔ¼° CPUµÄÄÜÁ¦¡£
-Xmn ÊÊÓÃÓÚµ÷ÕûÐÂÉú´úµÄ´óС¡¢ÐÂÉú´úµÄ´óС¾ö¶¨Á˶àÉÙ±ÈÀýµÄ¶ÔÏóÓлú»áÔÙminor
GC½×¶Î±»»ØÊÕ£¬µ«´ËÖµÏàÓ¦µÄÒ²¾ö¶¨Á˾ÉÉú´úµÄ´óС¡£ÐÂÉú´úÔ½´ó£¬Í¨³£Òâζ×ŶàÊý¶ÔÏóÄܹ»ÔÚminor GC½×¶Î±»»ØÊÕµô£¬µ«Í¬Ê±ÒâζמÉÉú´úµÄ¿Õ¼ä»á±äС£¬¿ÉÄÜ»áÔì³É¸üƵ·±µÄFull
GC£¬ÉõÖÁÊÇOutOfMemoryError.
-XX:SurvivorRatio ÊÊÓÃÓÚµ÷ÕûEdenÇøºÍSurvivorÇøµÄ´óС£¬EdenÇøÔ½´óͨ³£Ò²¾ÍÒâζ×Åminor
GC·¢ÉúµÄƵÂÊÔ½µÍ¡£µ«ÓпÉÄÜ»áÔì³ÉSurvivorÇøÌ«Ð¡£¬µ¼Ö¶ÔÏóÔÚ¾¹ýminorºóÖ±½Ó¾Í½øÈë¾ÉÉú´úÁË£¬´Ó¶ø¸üƵ·±µÄ´¥·¢Full
GC, ÕâÈ¡¾öÓÚµ±EdenÇøÂúµÄʱºòÆäÖдæ»î¶ÔÏóµÄ±ÈÀý¡£
ÔÚÇå³þÕÆÎÕminor GC¡¢Full GCµÄ´¥·¢Ê±»úÒÔ¼°´ú´óСµÄµ÷Õûºó£¬½áºÏÓ¦ÓõÄ×´¿ö(ÀýÈç´´½¨³öµÄ¶ÔÏ󶼿ɺܿ챻»ØÊÕµô¡¢»º´æ¶ÔÏó¶àµÈ)ͨ³£¾Í¿É½ÏºÃÉèÖôúµÄ´óС£¬¼õÉÙGCËøÕ¼ÓõÄʱ¼ä¡£ÔÚµ÷Õûºó¿É½áºÏjstat¡¢VisualVMµÈ²é¿´GCµÄ±ä»¯ÊÇ·ñ´ïµ½Á˵÷ÓŵÄÄ¿µÄ¡£
5.1.2 GC²ßÂԵĵ÷ÓÅ
Sun JDKËùÌṩµÄ¼¸ÖÖGC²ßÂÔ£¬´®ÐÐGCÐÔÄÜÌ«²î£¬Òò´ËÔÚʵ¼Ê³¡¾°ÖÐʹÓõÄÖ÷ҪΪ²¢ÐкͲ¢·¢GC,
ͨ¹ýÏÂÃæÕâ¸öÀý×Ó´¥·¢¶à´ÎGC,²é¿´²¢ÐÐGCÒÔ¼°²¢·¢GCʱ¶ÔÓÚÓ¦ÓÃÔì³ÉµÄ²»Í¬µÄÔÝͣʱ¼ä¡£
Ê×ÏÈÒÔVM Args: -Xms680M -Xmx680M -Xmn80M
-XX:+UseConcMarkSweepGC -XX:+PrintGCApplicationStoppedTime
-XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5
²ÎÊýÖ´ÐУ¬Í¨¹ýjstat¹Û²ìµ½µÄGC×´¿ö£º

ͼ-38
Æä´ÎÒÔVM Args: -Xms680M -Xmx680M -Xmn80M
-XX:+PrintGCApplicationStoppedTime -XX:+UseParallelGC
²ÎÊýÖ´ÐУ¬Í¨¹ýjstat¹Û²ìµ½µÄGC×´¿ö£º

ͼ-39
´ó²¿·Ö´ó²¿·Ö WebÓ¦ÓÃÔÚ´¦ÀíÇëÇóʱÉèÖÃÁËÒ»¸ö×î´ó¿Éͬʱ´¦ÀíµÄÇëÇóÊý£¬µ±³¬¹ý´ÎÇëÇóÊýʱ£¬»á½«Ö®ºóµÄÇëÇó·ÅÈëµÈ´ý¶ÓÁÐÖУ¬¶øÕâ¸öµÈ´ý¶ÓÁÐÒ²ÏÞÖÆÁË´óС¡£µ±µÈ´ý¶ÓÁÐÂýÁËÒÔºóÈÔÈ»ÓÐÇëÇó½øÈ룬ÄÇôÕâЩÇëÇ󽫻áÖ±½Ó±»¶ªÆú£¬ËùÓеÄÇëÇóÓÖ¶¼ÊÇÓг¬Ê±ÏÞÖÆµÄ¡£ÔÚÕâÖÖÇé¿öÏÂÈç´¥·¢ÁËÔì³ÉÓ¦ÓÃÔÝͣʱ¼ä½Ï³¤µÄFull
GC,ÄÇôÓпÉÄÜÔÚÕâ´ÎFull GCºó£¬Ôì³ÉÁË3ÃëµÄÔÝÍ££¬ÄÇô֮ǰÔÚ´ËÓ¦ÓÃÉϵȴý´¦ÀíµÄÇëÇó¾Í»áÈ«²¿³¬Ê±ÁË¡£´ÓÉϿɿ´³ö£¬WebÓ¦Ó÷dz£ÐèÒªÒ»¸ö¶ÔÓ¦ÓÃÔì³ÉÔÝͣʱ¼ä¶ÌµÄGC,ÔÙ¼ÓÉϴ󲿷ÖWebÓ¦ÓÃµÄÆ¿¾±¶¼²»ÔÚCPUÉÏ¡£Òò´Ë¶ÔÓÚWebÓ¦ÓöøÑÔ£¬ÔÚG1»¹²»¹»³ÉÊìµÄÇé¿öÏ£¬CMS
GCÊDz»´íµÄÑ¡Ôñ¡£
5.1.3 JVMµ÷Ó۸Àý
ÒÔÏÂΪһ¸öϵͳһ¶Îʱ¼äÄÚµÄGC×´¿ö£¬´ËϵͳÔËÐеĻúÆ÷²Ù×÷ϵͳΪ32Ϊ£¬CPUΪ4ºË£¬ÎïÀíÄÚ´æÎª4G,Æô¶¯²ÎÊýΪ£º
VM args: -server -Xms1536m -Xmx1536m
-Xmn700m -XX:PermSize=96m -XX:MaxPermSize=96m
¸ù¾ÝÆô¶¯µÄ²ÎÊýÒÔ¼°»úÆ÷ÅäÖÃÀ´¿´£¬Ä¿Ç°ÏµÍ³ÐÂÉú´úGCµÄÀàÐÍΪParallel
Scavenge,Æô¶¯Ê±Eden Space,S0,S1½«»áÓÉHotSpot×Ô¶¯µ÷Õû£¬´óÖ¿ռä´óС£ºEden561¡¢59ºÍ72ÕâÑùµÄ·ÖÅäÇé¿ö£¬¼ÙÉè¶àÊýÇé¿öϾùΪÕâÑùµÄÕ¼±È£¬Ä¿Ç°µÄÔËÐÐ×´¿öΪÿ´ÎMinor
GCºó´ó¸ÅÓÐ16MB¶ÔÏó½øÈë¾ÉÉú´ú£¬¼ÙÉèÕâЩ¶ÔÏó¶¼ÊÇÒòΪ³¬¹ýSurvivor Space²Å½øÈë¾ÉÉú´úµÄ£¬ÄÇô¿ÉÒÔÈÏΪÿ´ÎMinor
GCʱÓÐ16+72=88MBµÄ¶ÔÏóʱ´æ»îµÄ£¬´ÓĿǰFull GCµÄ×´¿öÀ´¿´£¬ÆäʵÕâ88MBµÄ¶ÔÏóÔÚÒ»¶Îʱ¼äºó¶¼ÊÇ¿ÉÒÔ»ØÊյģ¬ÄÇôÀíÂÛÉÏÀ´ËµÖ»Óý«Survivor
SpaceÀ©´óµ½88MBÒÔÉϼ´¿É£¬°´×ÅÕâ¸öÏë·¨£¬¿ÉÒÔ½«Æô¶¯²ÎÊýµ÷ÕûΪ£º
VM args: -server -Xms1536m -Xmx1536m
-Xmn700m -XX:PermSize=96m -XX:MaxPermSize=96m -XX:InitialSurvivorRatio=7
-XX:-UseAdaptiveSizePolicy
³ýÁËÒÔÉÏ·½·¨Í⣬»¹¿É²ÉÓõÄÁíÒ»·½Ê½Îª½«GC²âÁ¿µ÷ÕûΪCMS GC,²ÎÊýÈçÏ£º
VM args: -server -Xms1536m -Xmx1536m
-Xmn700m -XX:PermSize=96m -XX:MaxPermSize=96m
-XX:+UseConcMarkSweepGC -XX:+UseCompactAtFullCollection
-XX:CMSMaxAbortablePrecleanTime=500
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
ÔÚ×öÍêÒÔÉϵĵ÷Óź󣬶¼ÐèÒª¼ÌÐø½áºÏjstat¹¤¾ßÀ´²é¿´ÊÇ·ñ´ïµ½Á˵÷ÓŵÄÄ¿±ê£¬Èç¹ûûÓÐÔòÐèÒª¼ÌÐø°´×ÅÒÔÉϲ½Öè½øÐвÎÊýµÄµ÷Õû¡£¾ßÌå²ÎÊýÁбí¿ÉÒԲο¼Oracle¹Ù·½
ÔÚ½øÐвÎÊýµ÷Õûʱ£¬¿É¸ù¾ÝĿǰÊÕ¼¯µ½µÄ¶¥·åʱϵͳÇëÇó´ÎÊý¡¢ÏìӦʱ¼äÒÔ¼°GCµÄÐÅÏ¢£¬À´¹À¼ÆÏµÍ³Ã¿´ÎÇëÇóÐèÒªÏûºÄµÄÄڴ棬ÒÔ¼°Ã¿´ÎMinor
GCʱ´æ»îµÄ¶ÔÏóËùÕ¼µÄÄڴ棬´Ó¶ø¹À¼ÆÐèÒªÉèÖöà´óµÄSurvivor²ÅÄܹ»¾¡¿ÉÄܵرÜÃâ¶ÔÏó½øÈë¾ÉÉú´ú¡£
ÀýÈ磺ÿÃëµÄÇëÇóΪ60´Î£¬GCÐÅÏ¢ÏÔʾÿ10ÃëÖ´ÐÐÒ»´Îminor GC,ÿ´ÎMinor
GC»áÓÐ10MB¶ÔÏóתÈë¾ÉÉú´ú£¬Ã¿´ÎMinor GCÔÚEden·ÖÅäµÄÄÚ´æÎª600MB,SurvivorΪ100MB.¸ù¾ÝÕâЩÐÅÏ¢£¬¿ÉÒÔ¼òµ¥ÈÏΪϵͳÖÐÿ´ÎÇëÇóÏûºÄµÄÄÚ´æ´óÖÂΪ1MB,
²¢´ÖÂÔ¹À¼ÆÎªÔÚ¿ªÊ¼Minor GCʱ£¬»¹ÓÐ110¸öÇëÇóδ´¦ÀíÍê¡£ ¶ÔÓÚÕâÑùµÄ×´¿ö£¬¼òµ¥µÄµ÷ÓÅ·½Ê½¿ÉÒÔÔÚ±£³ÖEden
Space 600 MBµÄÇé¿öÏ£¬ ½«Survivor SpaceÔö³¤µ½120MB,ÄǾͻù±¾¿ÉÒÔ×öµ½ÔÚµ±Ç°µÄÏìÓ¦ËÙ¶ÈÏ£¬Èç10ÃëÄÚ½ÓÊܵÄÇëÇó×î¶àΪ600¸öʱ£¬Minor
GCʱ´ó²¿·ÖÇé¿ö²»»áÓжÔÏóתÈë¾ÉÉú´ú£¬µ«±Ï¾¹ÏµÍ³ÖеÄÇëÇóÏìӦʱ¼ä¡¢ÄÚ´æÏûºÄ·Ö²¼²»»áÕâôƽ¾ù£¬²¢ÇÒ»¹»Ø³öÏÖÖ±½ÓÔÚ¾ÉÉú´ú·ÖÅäµÄÏÖÏó£¬Òò´Ëͨ³£°´ÕâÑù´ÖÂԵĹÀ¼ÆÉèÖõIJÎÊýÈÔÈ»»á´ï²»µ½Ä¿±ê£¬Òª¼ÌÐø½øÐÐһЩϸ΢µÄµ÷½ÚÀ´Ö𲽴ﵽĿ±ê¡£
ÓÉÓÚ²ÎÊýµÄ¹À¼ÆÊÇÒÔÇëÇó´ÎÊýºÍÏìӦʱ¼äΪ»ù×¼µÄ£¬Òò´ËÒ»µ©ÏµÍ³µÄÏìÓ¦ËÙ¶ÈϽµ»òÇëÇóµÄ´ÎÊýÉÏÉý£¬¾Í¿ÉÄÜÈÔÈ»»áµ¼Ö´óÁ¿¶ÔÏó½øÈë¾ÉÉú´ú£¬´Ó¶ø´¥·¢Æµ·±µÄFull
GC,Ƶ·±µÄFull GCÓÖµ¼ÖÂϵͳµÄÏìÓ¦ËÙ¶ÈϽµ£¬´ÓÕâ¸ö²ãÃæÀ´¿´£¬¸ù±¾ÉÏÐèÒª×öµÄµ÷ÓÅÈÔÈ»ÊÇÌáÉýÇëÇóµÄ´¦ÀíËÙ¶ÈÒÔ¼°½µµÍÿ´ÎÇëÇóÐèÒª·ÖÅäµÄÄڴ棬ֻÓÐÕâÑù²ÅÄÜʹµÄÓ¦ÓÃÄܹ»Ö§³Å¸ü¸ßµÄ²¢·¢Á¿£¬·ñÔò¾Í»áËæ×Ų¢·¢Á¿µÄÉÏÕǶøÑ¸ËÙ³öÏÖÆ¿¾±¡£
¾ÉÉú´ú´óСµÄµ÷ÕûÒ»·½ÃæÒªÒÀ¾ÝÐÂÉú´úµÄ´óС£¬ÁíÒ»·½ÃæÒªÒÀ¾ÝϵͳÖг־ôæ»îµÄ¶ÔÏó»áÏûºÄ¶à´óµÄÄÚ´æÀ´¾ö¶¨¡£
Èçϵͳ²»ÊÇCPUÃܼ¯ÐÍ£¬ÇÒ´ÓÐÂÉú´ú½øÈë¾ÉÉú´úµÄ´ó²¿·Ö¶ÔÏóʱ¿É»ØÊյģ¬ÄÇô²ÉÓÃCMS
GC¿ÉÒÔ¸üºÃµØÔÚ¾ÉÉú´úÂú֮ǰÍê³É¶ÔÏóµÄ»ØÊÕ£¬¸ü´ó³Ì¶È½µµÍÁËFull GC·¢ÉúµÄ¿ÉÄÜ¡£
ĿǰÄÚ´æ¹ÜÀí·½Ãæ£¬JVM×ÔÉíÒѾ×öµÃ·Ç³£²»´íÁË£¬Òò´ËÈç¹û²»ÊÇÓÐÈ·ÇеÄGCÔì³ÉÐÔÄܵ͵ÄÀíÓÉ£¬¾ÍûÓбØÒª×ö¹ý¶àµÄϸ½Ú·½ÃæµÄµ÷ÓÅ(ÀýÈ磺survivorÇø´óСµÄÉèÖõÈ)¡£¶àÊýÇé¿öÏÂÖ»ÐëÑ¡ÔñGC²ßÂÔ²¢ÉèÖÃJVM
HeapµÄ´óС¼´¿É¡£ÔÚµ÷ÕûÁËÄÚ´æ¹ÜÀí·½ÃæµÄ²ÎÊýºóӦͨ¹ý-XX:+PrintGCDetails¡¢-XX:+PrintGCTimeStamps¡¢-XX:+PrintGCApplicationStoppedTime
¼°jstat »ò visualvmµÈ·½Ê½À´¹Û²ìµ÷ÕûºóGCµÄ×´¿ö£¬³ýÄÚ´æ¹ÜÀí·½ÃæµÄµ÷ÓÅÍ⣬Sun JDK»¹ÌṩÁËһЩÆäËû·½ÃæµÄµ÷ÓŲÎÊý£º
È磺-XX:CompileThreshold¡¢ -XX:+UseFastAccessorMethods
¼° -XX:+UseBiasedLockingµÈ¡£
»ù±¾ÉÏJVMµ÷ÓÅ£¬¶àÊýÇëÏÂÖ»ÐèҪѡÔñGC²ßÂÔ(´®ÐС¢²¢ÐС¢²¢·¢¡¢G1)²¢ÉèÖÃJVM
HeapµÄ´óС¼´¿É¡£ÔÚµ÷ÕûÁËÄÚ´æ¹ÜÀí·½ÃæµÄ²ÎÊýӦͨ¹ý-XX:+PrintGCDetails¡¢-XX:+PrintGCTimeStamps¡¢-XX:+PrintGCApplicationStoppedTime¼°jstat
»ò visualvmµÈ·½Ê½À´¹Û²ìµ÷ÕûºóGCµÄÇé¿ö£¬³ýÁËÄÚ´æ¹ÜÀí·½ÃæµÄµ÷ÓÅÍ⣬ Sun JDK»¹ÌṩÁËһЩÆäËû·½ÃæµÄµ÷ÓŲÎÊý£ºÈç-XX:CompileThreshold¡¢-XX:+UseFastAccessorMethods
¼°-XX:+UseBiasedLockingµÈ¡£
³ýÁËÒÔÉÏ»ùÓÚ¶ÔJDKʵÏÖ¼°JDKµ÷ÓŲÎÊýµÄÕÆÎÕ½øÐеĵ÷ÓÅÍ⣬¹Ø×¢JDKµÄа汾ҲÊDz»´íµÄÑ¡Ôñ¡£Ã¿´ÎJDKа汾µÄ·¢²¼¼¸ºõ¶¼»áÔÚÐÔÄÜÉÏ×ö³öһЩÓÅ»¯£¬Ò²ÐíÕâЩÓÅ»¯ÕýÊÇÓ¦ÓÃËùÐèÒªµÄ¶î¡£
5.2 ³ÌÐòµ÷ÓÅ
5.2.1 CPUÏûºÄÑÏÖØµÄ½â¾ö·½·¨
5.2.1.1. CPU us¸ßµÄ½â¾ö·½·¨
¸ù¾Ý֮ǰµÄ·ÖÎö£¬CPU us¸ßµÄÔÒòÖ÷ÒªÊÇÖ´ÐÐÏß³ÌÎÞÈÎºÎ¹ÒÆð¶¯×÷£¬ÇÒÒ»Ö±Ö´ÐУ¬µ¼ÖÂCPUûÓлú»áÈ¥µ÷¶ÈÖ´ÐÐÆäËûµÄỊ̈߳¬Ôì³ÉÏ̶߳öËÀµÄÏÖÏó¡£¶ÔÓÚÕâÖÖÇé¿ö£¬³£¼ûµÄÒ»ÖÖÓÅ»¯·½·¨ÊǶÔÕâÖÖÏ̵߳͝×÷Ôö¼ÓThread.sleep(),ÒÔÊÍ·ÅCPUµÄÖ´ÐÐȨ£¬½µµÍCPUµÄÏûºÄ¡£½â¾öʾÀý£ºUsHighOfCpuSolveDemo.java
°´ÕÕÕâÑùµÄ˼·£¬¶Ô"CPUÏûºÄ·ÖÎö"ÖеÄÀý×Ó½øÐÐÐ޸ģ¬ÔÚÍù¼¯ºÏÖÐÔö¼ÓÔªËØµÄ²¿·ÖÔö¼Ósleep,ÐÞ¸ÄÈçÏ´úÂ룺

ͼ-40
ÖØÐÂÖ´ÐÐÒÔÉÏ´úÂ룬ͨ¹ýtop²é¿´Ð§¹ûÈçͼִÐÐЧ¹û£º

ͼ-41
´ÓÉϽá¹û¿É¼û£¬CPUµÄÏûºÄ´ó·ù¶ÈϽµ£¬µ±È»£¬ÕâÖÖÐ޸ķ½Ê½ÊÇÒÔËðʧµ¥´ÎÖ´ÐÐÐÔÄÜΪ´ú¼ÛµÄ£¬µ«ÓÉÓÚ½µµÍÁËCPUµÄÏûºÄ£¬¶ÔÓÚ¶àÏ̵߳ÄÓ¦ÓöøÑÔ£¬·´¶øÌá¸ßÁË×ÜÌåµÄƽ¾ùÐÔÄÜ¡£
ÔÚʵ¼ÊµÄJavaÓ¦ÓÃÖлáÓкܶàÀàËÆµÄ³¡¾°£¬ÀýÈç¶àÏ̵߳ÄÈÎÎñÖ´ÐйÜÀíÆ÷£¬Ëüͨ³£ÒªÍ¨¹ýɨÃèÈÎÎñ¼¯ºÏÁбíÀ´Ö´ÐÐÈÎÎñ¡£¶ÔÓÚÕâЩÀàËÆ³¡¾°£¬¶¼¿Éͨ¹ýÔö¼ÓÒ»¶¨µÄsleepʱ¼äÀ´±ÜÃâÏûºÄ¹ý¶àµÄCPU.
¶ÔÓÚÆäËûÀàËÆÑ»·´ÎÊýÌ«¶à¡¢ÕýÔò¡¢¼ÆËãµÈÔì³ÉµÄCPU us¹ý¸ßµÄÇé¿ö£¬ÔòÒª½áºÏÒµÎñÐèÇóÀ´½øÐе÷ÓÅ¡£
¶ÔÓÚGCƵ·±Ôì³ÉµÄCPU us¸ßµÄÏÖÏó£¬ÔòҪͨ¹ýJVMµ÷ÓÅ»ò³ÌÐòµ÷ÓÅ£¬½µµÍGCµÄÖ´ÐдÎÊý¡£
5.2.1 2. CPU sy¸ßµÄ½â¾ö·½·¨
5.2.1.2.1 ¼õÉÙÏß³ÌÊý
CPU sy¸ßµÄÔÒòÖ÷ÒªÊÇÏ̵߳ÄÔËÐÐ״̬Ҫ¾³£Çл»£¬¶ÔÓÚÕâÖÖÇé¿ö£¬×î¼òµ¥µÄÓÅ»¯·½·¨ÊǼõÉÙÏß³ÌÊý¡£

¿É¼û¼õÉÙÏß³ÌÊýʱÄÜÈÃsyֵϽµµÄ£¬ËùÒÔ²»ÊÇÏß³ÌÊýÔ½¶àÍÌÍÂÁ¿¾ÍÔ½¸ß£¬Ïß³ÌÊýÐèÒªÉèÖÃΪºÏÀíµÄÖµ£¬ÕâÐèÒª¸ù¾ÝÓ¦ÓÃÇé¿öÀ´¾ßÌå¾ö¶¨£¬Í¬Ê±Ê¹ÓÃÏ̳߳رÜÃâÒª²»¶ÏµØ´´½¨Ï̡߳£ÈçÓ¦ÓÃÒªÖ§³Å´óÁ¿µÄ²¢·¢£¬ÔÚ¼õÉÙÏß³ÌÊýµÄÇé¿öÏÂ×îºÃÊÇÔö¼ÓÒ»¸ö»º³å¶ÓÁУ¬±ÜÃâÒòΪÏß³ÌÊýµÄ¼õÉÙÔì³Éϵͳ³ö´íÂÊÉÏÉý¡£
Ôì³ÉCPU sy¸ßµÄÔÒò³ýÁËÆô¶¯µÄÏ̹߳ý¶àÒÔÍ⣬»¹ÓÐÒ»¸öÖØÒªµÄÔÒòÊdzÌÐòÖ®¼äËø¾ºÕù¼¤ÁÒ£¬Ôì³ÉÁËÏß³Ì״̬¾³£ÒªÇл»£¬Òò´Ë¾¡¿ÉÄܽµµÍÏ̼߳äµÄËø¾ºÕùÒ²Êdz£¼ûµÄÓÅ»¯·½·¨¡£Ëø¾ºÕù½µµÍºó£¬Ï̵߳Ä״̬Çл»µÄ´ÎÊýÒ²¾Í»áϽµ£¬syÖµ»ØÏàӦϽµ¡£µ«ÖµµÄ×¢ÒâµÄÊÇÈËÏß³ÌÊý¹ý¶à£¬µ÷ÓźóÓпÉÄÜ»áÔì³ÉusÖµ¹ý¸ß£¬ËùÒÔºÏÀíµØÉèÖÃÏß³ÌÊý·Ç³£¹Ø¼ü¡£Ëø¾ºÕù¸üÓпÉÄÜÔì³Éϵͳ×ÊÔ´ÏûºÄ²»¶à£¬µ«ÏµÍ³ÐÔÄܲ»×ãµÄÏÖÏó¡£
5.1.2.2.2 Coroutine(гÌ)
³ýÁËÒÔÉÏÁ½ÖÖÇé¿öÍ⣬¶ÔÓÚ·Ö²¼Ê½JavaÓ¦ÓöøÑÔ£¬»¹ÓÐÒ»ÖÖµäÐÍÏÖÏóÊÇÓ¦ÓÃÖÐÓн϶àµÄÍøÂçIO²Ù×÷»òȷʵÐèÒªÒ»Ð©Ëø¾ºÕù»úÖÆ(ÀýÈçÊý¾Ý¿âÁ¬½Ó³Ø)£¬µ«ÎªÁËÄܹ»Ö§³Ö¸ßµÄ²¢·¢Á¿£¬ÔÚJavaÓ¦ÓÃÖÐÓÐÖ»ÄܽèÖúÆô¶¯¸ü¶àµÄÏß³ÌÀ´Ö§³Å¡£ÔÚÕâÑùµÄÇé¿öϵ±²¢·¢Á¿Ôö³¤µ½Ò»¶¨³Ì¶Èºó£¬¿ÉÄÜ»áÔì³ÉCPU
sy¸ßµÄỊ̈߳¬¶ÔÓÚÕâÖÖÏÖÏ󣬿ɲÉÓÃгÌ(Coroutine)À´Ö§³Å¸ü¸ßµÄ²¢·¢Á¿£¬±ÜÃâ²¢·¢Á¿ÉÏÕǺóÔì³ÉCPU
syÏûºÄÑÏÖØ¡¢ÏµÍ³loadѸËÙÉÏÕǺÍϵͳÐÔÄÜϽµ¡£
²ÉÓÃг̺ó£¬ÄÜ×öµ½µ±Ï̵߳ȴýÊý¾Ý¿âÖ´Ðнá¹ûʱ£¬¾ÍÁ¢¿ÌÊÍ·Å´ËÏß³Ì×ÊÔ´¸øÆäËûÇëÇ󣬵ȵ½Êý¾Ý¿âÖ´Ðнá¹û·µ»Øºó²Å¼ÌÐøÖ´ÐУ¬ÔÚJavaÖÐĿǰÖ÷Òª¿ÉÓÃÓÚʵÏÖг̵Ŀò¼ÜΪKilim.
ÔÚʹÓÃKilimÖ´ÐÐixiangÈÎÎñʱ£¬²¢²»´´½¨Thread,¶øÊǸÄΪ´´½¨Task,TaskÏà¶ÔÓÚThread¶øÑÔ¾ÍÇáÁ¿¼¶¶àÁË¡£µ±´ÎTaskÒª×ö×èÈû¶¯×÷ʱ£¬¿Éͨ¹ýMailbox.get
»ò Task.pauseÀ´×èÈûµ±Ç°µÄTask,Kilim»á±£´æTaskÖ®ºóÖ´ÐÐÐèÒªµÄ¶ÔÏóÐÅÏ¢£¬²¢ÊÍ·ÅTaskÖ´ÐÐËùÕ¼ÓõÄÏß³Ì×ÊÔ´£»µ±TaskµÄ×èÈû¶¯×÷Íê³É»ò±»»½ÐÑʱ£¬´ËʱKilim»áÖØÐÂÔØÈëTaskËùÐèµÄ¶ÔÏóÐÅÏ¢£¬»Ö¸´TaskµÄÖ´ÐУ¬Ï൱ÓÚKilimÀ´³Ðµ£ÁËÏ̵߳ĵ÷¶ÈÒÔ¼°ÉÏÏÂÎÄÇл»¶¯×÷¡£
ÕâÖÖ·½Ê½Ïà¶ÔÔÉúThread·½Ê½¸üΪÇáÁ¿£¬ÇÒÄܹ»¸üºÃµÚÀûÓÃCPU£¬Òò´Ë¿É×öµ½½öÆô¶¯CPUºËÊýµÄÏß³ÌÊý£¬ÒÔ¼°´óÁ¿µÄTaskÀ´³Ô³Å¸ß²¢·¢Á¿£¬Kilim´øÀ´µÄÊÇÏß³ÌʹÓÃÂʵÄÌáÉý£¬µ«Í¬Ê±ÓÉÓÚÒªÔÚJVM¶ÑÖб£´æTaskÉÏÏÂÎÄÐÅÏ¢£¬Òò´ËÔÚ²ÉÓÃKilimµÄÇé¿öÏÂÒªÏûºÄ¸ü¶àµÄÄÚ´æ¡£
ÏÂÃæÊÇÒ»¸ö´«Í³·½Ê½µÄÀý×Ó£ºSimpleBenchMark.java ºÍ»ùÓÚKilim²ÉÓÃCoroutine·½Ê½Ö§³Å¸ß²¢·¢ÇëÇóÀý×Ó£ºSimpleBenchMarkV2.java
ͨ¹ýÔËÐбȽϴ«Í³·½Ê½ºÄʱ´ó¸ÅΪ3077ms,¶ø»ùÓÚKilim²ÉÓÃг̷½Ê½µÄºÄʱ´ó¸ÅΪ277ms,¿É¼ûÔÚÕâÖָ߲¢·¢µÄÇé¿öÏ£¬Ð³Ì·½Ê½¶ÔÐÔÄÜÌáÉýÒÔ¼°Ö§³Å¸ü¸ß²¢·¢Á¿¿ÉÒÔÆðµ½ºÜ´óµÄ×÷Óá£
ĿǰKilim»¹±È½ÏУ¬Ã»ÓÐÉÌÓóɹ¦µÄ°¸Àý£¬Èç´òËãÔÚʵ¼ÊµÄϵͳÖÐʹÓ㬻¹ÐèÒª½÷É÷¡£Ò»·½ÃæÊÇ0.7°æ±¾ÖлùÓÚobject.wait/notify»úÖÆÊµÏÖµÄSchedulerÔÚ¸ßѹÏ»á³öÏÖbug,¿É×ÔÐлùÓÚThreadPoolExecutor½øÐиÄÔ죻ÁíÒ»¸ö·½ÃæMailbox.get(timeout)ÊÇ»ùÓÚTimerʵÏֵģ¬ÓÉÓÚTimerÔÚÔö¼Ótaskµ½¶ÓÁÐʱºÍÔËÐÐtask¶ÓÁÐÊÇ»¥³âµÄ(¼´Ê¹ÊÇScheduledTheadPoolExecutorҲͬÑùÐèÒªËøÕû¸ö¶ÓÁÐ)£¬¶ÔÓÚ´ó²¢·¢µÄÓ¦ÓöøÑÔÕâÀïÊǸöDZÔ򵀮¿¾±¡£¶ÔÓÚJavaÓ¦ÓöøÑÔ£¬TimerÊÇÒ»¸ö¾³£ÓÃÀ´ÊµÏÖ¶¨Ê±ÈÎÎñµÄÀ࣬µ«TimerµÄÐÔÄÜÔڸ߲¢·¢ÏÂÒ»°ã£¬¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔ³¢ÊÔ»ùÓÚTimerWheelËã·¨À´ÌáÉýTimerµÄÐÔÄÜ¡£
ÏÖÔÚÒªÔÚJavaÓ¦ÓÃÖÐʹÓÃKilimÀ´ÊµÏÖг̷½Ê½²¢²»¼òµ¥£¬ÒòΪг̷½Ê½ÒªÇóËùÓеIJÙ×÷¶¼²»×èÈûÔÉúỊ̈߳¬Õâ¾ÍÒªÇóÓ¦ÓÃÖв»ÄÜʹÓÃĿǰJavaÀïµÄͬ²½¡¢ËøµÈ»úÖÆ¡£³ýÁËÕâЩÍ⣬»¹ÐèÒª½â¾öͬ²½·ÃÎÊÊý¾Ý¿â¡¢²Ù×÷ÎļþµÈÎÊÌ⣬ÕâЩ¶¼±ØÐë¸ÄΪÊÇÒì²½·½Ê½»òKilimÖеÄTaskÔÝÍ£µÄ»úÖÆ¡£
ĿǰSun JDK7ÖÐÒ²ÓÐÒ»¸öÖ§³Öг̷½Ê½µÄʵÏÖhttp://code.google.com/p/coroutines/¡£
ÁíÍâ»ùÓÚJVMµÄScalaµÄActorÒ²¿ÉÓÃÓÚÔÚJavaÖÐʹÓÃг̡£
³ýÁËÈí¼þ·½Ãæ¶ÔÌáÉýCPUʹÓÃÂÊ×ö³öµÄŬÁ¦Í⣬Ӳ¼þ·½ÃæµÄCPUרҵ»¯(ÀýÈç
GPU½øÐÐͼÐμÆËã)Ò²ºÜÖµµÄ¹Ø×¢¡£
5.2.2 ÄÚ´æÏûºÄÑÏÖØµÄ½â¾ö·½·¨
ÔÚÄÚ´æÏûºÄ·½Ã棬×îÃ÷ÏÔµÄÔÚÓÚÏûºÄÁ˹ý¶àµÄJVM HeapÄڴ棬Ôì³ÉGCƵ·±Ö´ÐеÄÏÖÏ󣬶øÎïÀíÄÚ´æ·½ÃæµÄÏûºÄͨ³£À´Ëµ²»»á³ÉΪJavaÓ¦ÓÃÖеÄÖ÷ÒªÎÊÌâ¡£³ýÁËJVMµÄµ÷ÓÅÍ⣬ÔÚѰÕÒµ½ÄÚ´æÏûºÄÑÏÖØµÄ´úÂëºó£¬¿É´Ó´úÂë±¾Éí½øÐÐÓÅ»¯£¬±ÜÃâÄÚ´æ×ÊÔ´ÏûºÄ¹ý¶à¡£´Ë´¦¾Í½éÉÜһЩJVM
HeapÄÚ´æÏûºÄÑÏÖØÊ±³£ÓõijÌÐòµ÷ÊÔ·½·¨¡£
5.2.2.1. ÊͷŲ»±ØÒªµÄÒýÓÃ
ÄÚ´æÏûºÄ×îÑÏÖØµÄÇé¿öÖÐ×îµäÐ͵ÄÒ»ÖÖÏÖÏóÊÇ´úÂëÖгÖÓÐÁ˲»ÐèÒªµÄ¶ÔÏóÒýÓã¬Ôì³ÉÕâЩ¶ÔÏóÎÞ·¨±»GC,´Ó¶øÕ¼¾ÝÁËJVM¶ÑÄÚ´æ¡£ÕâÖÖÇé¿ö×îµäÐ͵ÄÒ»¸öÀý×ÓÊÇÔÚ¸´ÓÃÏ̵߳ÄÇé¿öÏÂʹÓÃThreadLocal£¬ÓÉÓÚÏ̸߳´Óã¬ThreadLocalÖдæ·ÅµÄ¶ÔÏóÈçδ×öÖ÷¶¯ÊͷŵϰÔò²»»á±»GCÊÍ·Å¡£Ê¾ÀýÈçÏ£º


Ö´ÐдúÂ룬ͨ¹ýjstat¹Û²ì£¬»á·¢ÏÖÔÚOld Generation JVMÄÚ´æÒ»Ö±±»Ê¹ÓÃÁË60MB×óÓÒ¡£


Ö´ÐдúÂ룬ͨ¹ýjstat¹Û²ì£¬»á·¢ÏÖÔÚOld Generation JVMÄÚ´æÒ»Ö±±»Ê¹ÓÃÁË60MB×óÓÒ¡£¶ÔÓÚÕâÖÖÇé¿ö£¬Òª×¢ÒâÔÚÏß³ÌÄڵ͝×÷Ö´ÐÐÍê±ÏʱִÐÐThreadLocal.set°Ñ¶ÔÏóÇå³ý£¬±ÜÃâ³ÖÓв»±ØÒªµÄ¶ÔÏóÒýÓ᣻ᷢÏÖÔÚOld
Generation JVMÄÚ´æ´Ó60MB×óÓÒ½µµ½ÁË1M×óÓÒ¡£
5.2.2.2. ʹÓöÔÏó»º´æ³Ø
´´½¨¶ÔÏóµÄʵÀýÒªºÄ·ÑÒ»¶¨µÄCPUÒÔ¼°Äڴ棬ʹÓöÔÏó»º´æ³ØÒ»¶¨³Ì¶ÈÉϿɽµµÍJVM
HeapÄÚ´æµÄʹÓá£
ͨ¹ýÔËÐгÌÐò£ºObjectPoolDemo.java(ÏÂÔØµØÖ·¼û ²Î¿¼²¿·Ö)
1 ûÓвÉÓöÔÏó»º´æ³ØÇé¿ö
²ÎÊý£ºVM Args : -Xms128M -Xmx128M -Xmn64M
( runMode is NOTUSE_OBJECTPOOL:)
Main Args:
Ö´Ðнá¹û£ºExecute summary: Round( 10 ) Thread
Per Round( 100 ) Object Factor ( 10 ) Execute Time (
111594 ) ms
2 ²ÉÓöÔÏó»º´æ³ØÇé¿ö
²ÎÊý£ºVM Args : -Xms128M -Xmx128M -Xmn64M
( runMode is USE_OBJECTPOOL:)
Main Args: 2
Ö´Ðнá¹û£ºExecute summary: Round( 10 ) Thread
Per Round( 100 ) Object Factor ( 10 ) Execute Time (
1094 ) ms
´ÓÉÏÃæµÄ½á¹û¶Ô±È¿É¿´³ö£¬ÔÚÄÚ´æÏûºÄÑÏÖØµÄÇé¿öÏ£¬²ÉÓöÔÏó»º´æ³Ø¿É´ó·ù¶ÈÌáÉýÐÔÄÜ£¬±ÜÃâ´´½¨¶ÔÏóËùºÄ·ÑµÄʱ¼ä¼°Æµ·±GCÔì³ÉµÄÏûºÄ¡£
5.2.2.3. ²ÉÓúÏÀíµÄ»º´æÊ§Ð§Ëã·¨
ÉÏÃæËµµ½Á˲ÉÓöÔÏó»º³å³ØÀ´½µµÍÄÚ´æµÄÏûºÄ£¬µ«Èç¹û·ÅÈëÌ«¶àµÄ¶ÔÏóÔÚ»º´æ³ØÖУ¬·´¶ø»áÔì³ÉÄÚ´æµÄÑÏÖØÏûºÄ¡£Í¬Ê±ÓÉÓÚ»º´æ³ØÒ»Ö±¶ÔÕâЩ¶ÔÏó³ÖÓÐÒýÓ㬴Ӷø»áÔì³ÉFull
GCÔö¶à£¬¶ÔÓÚÕâÖÖÇé¿öÒªºÏÀí¿ØÖÆ»º´æ³ØµÄ´óС¡£
¿ØÖÆ»º´æ³Ø´óСµÄÎÊÌâÔÚÓÚµ±µ½´ï»º´æ³ØµÄ×î´óÈÝÁ¿ºó£¬Èç¹ûÒª¼ÓÈëеĶÔÏó¸ÃÈçºÎ´¦Àí£¿ÓÐһЩ¾µäµÄ»º´æÊ§Ð§Ëã·¨À´Çå³ý»º³å³ØÖеĶÔÏó£¬ÀýÈçFIFO,LRU,LFUµÈ¡£²ÉÓÃÕâЩËã·¨¿É¿ØÖÆ»º´æ³ØÖеĶÔÏóÊýÄ¿£¬±ÜÃ⻺´æ³ØÖеĶÔÏóÊýÁ¿ÎÞÏÞÉÏÕÇ¡£
ObjectCachePoolDemo.java(ÏÂÔØµØÖ·¼û ²Î¿¼²¿·Ö)
ÊäÈë²ÎÊý£ºÏòÈÝÆ÷×ܲåÈë15¸öÔªËØ£¬±£´æÈÝÆ÷10¸öÔªËØ
Êä³ö½á¹û£º
size(10), policy(1) FIFO 6, 6 7, 7 8, 8 9, 9 10, 10 11, 11 12, 12 13, 13 14, 14 15, 15 |
·ÖÎö£º°´×ÅFIFO»º´æÊ§Ð§Ëã·¨£¬Ê§Ð§ÁËÔªËØ1£¬2,3,4,5£¬±£³ÖÈÝÆ÷ÖÐÓÐ10¸öÔªËØ
5.2.2.4. ºÏÀíʹÓÃSoftReference ºÍ WeakReference
¶ÔÓÚÕ¼¾ÝÄڴ浫ÓÖ²»ÊDZØÐë´æÔڵĶÔÏó£¬ÀýÈ绺´æ¶ÔÏó£¬Ò²¿ÉÒÔ»ùÓÚSoftReference»òWeakReferenceµÄ·½Ê½À´½øÐлº´æ¡£SoftReferenceµÄ¶ÔÏó»áÔÚÄÚ´æ²»¹»ÓõÄʱºò½øÐлØÊÕ£¬WeakReferenceµÄ¶ÔÏóÔò»áÔÚFull
GCµÄʱºò»ØÊÕ£¬²ÉÓÃÕâÁ½ÖÖ·½Ê½Ò²ÄÜÒ»¶¨³ÌÐòÉϼõÉÙJVM HeapÇøÄÚ´æµÄÏûºÄ¡£
¶ÔÓÚÒÔÉÏÓ²¼þ×ÊÔ´ÏûºÄ¹ý¶àÔì³ÉµÄÐÔÄܲ»×ãµÄÏÖÏ󣬳ýÁËÈí¼þ·½Ãæµ÷ÓÅÍ⣬ÔÚ´ó¶àÊýÇé¿öÏ»¹¿Éͨ¹ýÉý¼¶»òÔö¼ÓÓ²¼þÀ´ÌáÉý³ÌÐòµÄÐÔÄÜ¡£
5.2.2 ÎļþIOÏûºÄÑÏÖØµÄ½â¾ö·½·¨
´Ó³ÌÐò½Ç¶È¶øÑÔ£¬Ôì³ÉÎļþIOÏûºÄÑÏÖØµÄÔÒòÖ÷ÒªÊǶà¸öÏß³ÌÔÚд´óÁ¿µÄÊý¾Ýµ½Í¬Ò»¸öÎļþ£¬µ¼ÖÂÎļþºÜ¿ì±äµÄºÜ´ó£¬´Ó¶øÐ´ÈëËÙ¶ÈÔ½À´Ô½Âý£¬²¢Ôì³É¸÷Ï̼߳¤ÁÒÇÀÎļþËø£¬¶ÔÓÚÕâÀàÇé¿ö£¬Í¨³£µ÷ÓŵÄÓÐÒÔÏ·½·¨£º¿ÉÒԲο¼log4j
5.2.2.1 Ò첽дÎļþ
½«Ð´ÎļþµÄͬ²½¶¯×÷¸ÄΪÒì²½¶¯×÷£¬±ÜÃâÓ¦ÓÃÓÉÓÚдÎļþÂý¶øÐÔÄÜϽµÌ«¶à£¬ÀýÈçдÈÕÖ¾£¬¿ÉÒÔʹÓÃlog4jÌṩµÄAsyncAppender.
5.2.2.2 ÅúÁ¿¶Áд
Ƶ·±µÄ¶Áд²Ù×÷¶ÔIOÏûºÄ»áºÜÑÏÖØ£¬ÅúÁ¿²Ù×÷½«´ó·ù¶ÈÌáÉýIO²Ù×÷µÄÐÔÄÜ¡£
5.2.2.3 ÏÞÁ÷
Ƶ·±¶ÁдµÄÁíÍâÒ»¸öµ÷ÓÅ·½Ê½ÊÇÏÞÁ÷£¬´Ó¶ø½«ÎļþIOÏûºÄ¿ØÖƵ½Ò»¸öÄܽÓÊܵķ¶Î§¡£log.error
log.warn. log.info. log.debug.
5.2.2.4 ÏÞÖÆÎļþ´óС
²Ù×÷Ì«´óµÄÎļþÒ²ÊÇÔì³ÉÎļþIOЧÂʵ͵ÄÒ»¸öÔÒò£¬Òò´Ë¶ÔÓÚÿ¸öÊä³öµÄÎļþ£¬¶¼Ó¦¸Ã×ö´óСµÄÏÞÖÆ£¬ÔÚ³¬¹ý×î´óÖµºó¿ÉÉú³ÉÒ»¸öеÄÎļþ,ÀàËÆlog4jÖÐRollingFileAppenderµÄmaxFileSizeÊôÐÔµÄ×÷Óá£
³ýÁËÒÔÉÏÕâЩÍ⣬»¹ÓоÍÊǾ¡¿ÉÄܲÉÓûº³åÇøµÈ·½Ê½À´¶ÁÈ¡ÎļþÄÚÈÝ£¬±ÜÃâ²»¶ÏÓë²Ù×÷ϵͳ½»ÐУ¬²Î¿¼
Sun¹Ù·½µÄ¹ØÓÚJavaÎļþIOÓÅ»¯µÄÎÄÕÂ:¼û²Î¿¼²¿·ÖµÄ[4.5]Articles: Tuning Java
I/O Performance
5.2.3 ÍøÂçIOÏûºÄÑÏÖØµÄ½â¾ö·½·¨
´Ó³ÌÐò½Ç¶È¶øÑÔ£¬Ôì³ÉÍøÂçIOÏûºÄÑÏÖØµÄÔÒòÖ÷ÒªÊÇͬʱÐèÒª·¢ËÍ»ò½ÓÊյİüÌ«¶à¡£¶ÔÓÚÕâÀàÇé¿ö£¬³£Óõĵ÷ÓÅ·½·¨Îª½øÐÐÏÞÁ÷£¬ÏÞÁ÷ͨ³£ÊÇÏÞÖÆ·¢ËÍpacketµÄƵÂÊ£¬´Ó¶øÔÚÍøÂçIOÏûºÄ¿É½ÓÊܵÄÇé¿öÏÂÀ´·¢ËÍpacket.
¡¶Linux Performance and Tuning Guidelines.pdf¡·¡¶IOµÄ×èÈûÓë·Ç×èÈû¡¢Í¬²½ÓëÒì²½ÒÔ¼°JavaÍøÂçIO½»»¥·½Ê½¡·
5.3 ¶ÔÓÚ×ÊÔ´ÏûºÄ²»¶à£¬µ«³ÌÐòÖ´ÐÐÂýµÄÇé¿ö(Ðè²¹³ä)
¶ÔÓÚ·Ö²¼Ê½JavaÓ¦ÓöøÑÔ£¬Ôì³ÉÕâÕâÖÖÇé¿öµÄÖ÷ÒªÔÒòͨ³£ÓÐËø¾ºÕù¼¤ÁÒ¼°Î´³ä·Ö·¢»ÓÓ²¼þ×ÊÔ´Á½ÖÖ¡£
5.3.1 Ëø¾ºÕù¼¤ÁÒ
Ï̶߳àÁ˺ó£¬Ëø¾ºÕùµÄ×´¿ö»á±È½ÏÃ÷ÏÔ£¬ÕâʱÏ̺߳ÜÈÝÆ÷´¦ÓڵȴýËøµÄ×´¿ö£¬´Ó¶øµ¼ÖÂÐÔÄÜϽµÒÔ¼°CPU
syÉÏÉý¡£
ʾÀý:LockHotDemo.java
Ö´Ðнá¹û£ºExecute summary: Round( 10 ) Thread
Per Round( 200 ) Execute Time ( 10579 ) ms
´Ëʱ¸÷·½ÃæµÄ×ÊÔ´ÏûºÄ²¢²»¸ß£¬µ«ÐÔÄܱÈÃ»Ó´ËøµÄÇé¿öϽµÁ˷dz£¶à¡£´ÓÕâ¸öÀý×ӿɼû£¬ËøÊÇÓ°ÏìÐÔÄܵÄÖØÒªÒòËØ£¬µ«ÎªÁ˱£Ö¤×ÊÔ´µÄÒ»ÖÂÐÔ£¬¶àÏß³ÌÓ¦ÓÃÖÐËøµÄʹÓÃÊDz»¿É±ÜÃâµÄ£¬Ö»Äܾ¡Á¿È¥½µµÍÏ̼߳äµÄËø¾ºÕù£¬³£¼ûµÄ·½·¨ÈçÏ£ºÊ¹Óò¢·¢°üÖеÄÀࡢʹÓÃTreiberËã·¨¡¢Ê¹ÓÃMichael-Scott·Ç×èÈû¶ÓÁÐËã·¨¡¢¾¡¿ÉÄܼõÉÙËø¡¢²ð·ÖËø¡¢È¥³ý¶Áд²Ù×÷µÄ»¥³âËøµÈ
5.3.1.1 ʹÓò¢·¢°üÖеÄÀà
µÚÈý·½²¢·¢¿â£ºDisruptor¡¢JPPF¡¢Kilim¡¢Amino
¶ÔÓÚjava.util.concurrent°üÖеÄÀàµÄ·ÖÎö£¬¿ÉÒÔ¿´³ö£¬²¢·¢°üÖеÄÀà¶àÊý¶¼²ÉÓÃÁË
lock-free¡¢nonblockingËã·¨£¬¼õÉÙÁ˶àÏß³ÌÇé¿öÏÂ×ÊÔ´µÄËø¾ºÕù£¬Òò´Ë¶ÔÓÚÏ̼߳äÒª¹²Ïí²Ù×÷µÄ×ÊÔ´¶øÑÔ£¬Ó¦¾¡Á¿Ê¹Óò¢·¢°üÖеÄÀàÀ´ÊµÏÖ(AtomicInteger¡¢ConcurrentHashMapµÈ)£¬µ±ÏµÍ³ÌṩµÄ²¢·¢°üÖеÄÀàÎÞ·¨Âú×ãÐèÇóʱ£¬¿É²Î¿¼Ñ§Ï°Ò»Ð©nonblockingËã·¨À´×ÔÐÐʵÏÖ£¬nonblockingËã·¨µÄ»úÖÆ£¬Îª»ùÓÚCASÀ´×öµ½ÎÞÐèlock¾Í¿ÉʵÏÖ×ÊÔ´Ò»ÖÂÐԵı£Ö¤£¬Ö÷ÒªµÄʵÏÖnonblockingµÄËã·¨ÓУº
5.3.1.2 ʹÓÃTreiberËã·¨
TreiberËã·¨Ö÷ÒªÓÃÓÚʵÏÖStack,»ùÓÚTreiberË㷨ʵÏÖµÄÎÞ×èÈûµÄStack´úÂëÈçÏ£º
´úÂëÀý×Ӳο¼£º²¢·¢Õ»ConcurrentStack<E>£º
http://blog.csdn.net/ajian005/article/details/18324407
ÓÉÓÚStackÊÇLIFO·½Ê½£¬Òò´Ë²»ÄܲÉÓÃÀàËÆLinkedBlockingQueueÖÐÁ½°ÑËøµÄ»úÖÆ¡£ÕâÀïÇÉÃîµØ²ÉÓÃAtomicReferenceÀ´ÊµÏÖÁËÎÞ×èÈûµÄpushºÍpop,
ÔÚpushʱ»ùÓÚAtomicReferenceµÄCAS·½·¨À´±È½ÏĿǰµÄheadÊÇ·ñÒ»Ö¡£Èç²»Ò»Ö£¬ËµÃ÷ÓÐÆäËûÏ̸߳͝ÁË£¬ÈçÓи͝Ôò¼ÌÐøÑ»·£¬Ö±µ½Ò»Ö£¬²ÅÐÞ¸ÄheadÔªËØ£¬ÔÚpopʱ¿ÉÒÔ²ÉÓÃͬÑùµÄ·½Ê½½øÐвÙ×÷¡£
²âÊÔÓÃÀý£¬²âÊÔ½á¹û£º
Stack consume Time: 125 ms
ConcurrentStack consume Time: 63 ms
5.3.1.3 ʹÓÃMichael-Scott·Ç×èÈû¶ÓÁÐËã·¨
ºÍTreiberËãÀàËÆ£¬Michael-ScottËã·¨Ò²ÊÇ»ùÓÚCASÒÔ¼°AtomicReferenceÀ´ÊµÏÖ¶ÓÁеķÇ×èÈû²Ù×÷£¬java.util.concurrentÖеÄConcurrentLinkedQueue¾ÍÊǵäÐ͵ĻùÓÚMichael-ScottʵÏֵķÇ×èÈû¶ÓÁС£ConcurrentLinkedQueueÔÚÖ´ÐÐoffer¶¯×÷ʱ£¬Í¨¹ýCAS±È½ÏÄõ½µÄtailÔªËØÊÇ·ñΪµ±Ç°´¦ÓÚĩβµÄÔªËØ£¬Èç²»ÊÇÔò¼ÌÐøÑ»·£¬ÈçÊÇÔò½«tailÔªËØ¸üÐÂΪеÄÔªËØ¡£
ÔÚÖ´ÐÐpoll¶¯×÷ʱ£¬Í¨¹ýCAS±È½ÏÄõ½µÄheadÔªËØÊÇ·ñΪµ±Ç°´¦ÓÚÊ×λµÄÔªËØ£¬Èç²»ÊÇÔò¼ÌÐøÑ»·£¬ÈçÊÇÔò½«headºóµÄÔªËØ¸³Öµ¸øhead,ͬʱ»ñȡ֮ǰheadÔªËØÖеÄÖµ²¢·µ»Ø¡£
´ÓÉÏÃæÁ½ÖÖËã·¨À´¿´£¬»ùÓÚCAS ºÍ AtomicReferenceÀ´ÊµÏÖÎÞ×èÈûÊDz»´íµÄÑ¡Ôñ¡£µ«ÖµµÃ×¢ÒâµÄÊÇ£¬ÓÉÓÚCASÊÇ»ùÓÚ²»¶ÏµÄÑ»·±È½ÏÀ´±£Ö¤×ÊÔ´Ò»ÖÂÐԵ쬶ÔÓÚ³åÍ»½Ï¶àµÄÓ¦Óó¡¾°¶øÑÔ£¬CAS»á´øÀ´¸ü¸ßµÄCPUÏûºÄ£¬Òò´Ë²»Ò»¶¨²ÉÓÃCASʵÏÖÎÞ×èÈûµÄ¾ÍÒ»¶¨±È²ÉÓÃLock·½Ê½µÄÐÔÄܺá£Òµ½çÖл¹ÓÐһЩÎÞ×èÈûËã·¨µÄ¸Ä½ø£¬ÀýÈçMCAS¡¢WSTMµÈ¡£
5.3.1.4 ¾¡¿ÉÄÜÉÙÓÃËø
¾¡¿ÉÄÜÈÃËø½öÔÚÐèÒªµÄµØ·½³öÏÖ£¬Í¨³£Ã»±ØÒª¶ÔÕû¸ö·½·¨¼ÓËø£¬¶øÖ»¶ÔÐèÒª¿ØÖƵÄ×ÊÔ´×ö¼ÓËø²Ù×÷¡£
½«Ëø×îС»¯ºó£¬ÐÔÄÜ»áÓÐÌá¸ß£¬ÔÚ±àд¶àÏ̳߳ÌÐòʱ£¬Òª×Ðϸ¿¼ÂÇÄÄЩµØ·½ÊÇÒª¼ÓËøµÄ£¬ÄÄЩµØ·½ÊDz»Òª¼ÓËøµÄ¡£¾¡¿ÉÄÜÈÃËø×îС»¯£¬Ö»¶Ô»¥³â¼°Ô×Ó²Ù×÷µÄµØ·½¼ÓËø£¬¼ÓËøÊ±¾¡¿ÉÄÜÒÔ±»°üº¬×ÊÔ´µÄ×îСÁ£¶ÈΪµ¥Î»¡£
5.3.1.5 ²ð·ÖËø
²ð·ÖËø¼´°Ñ¶ÀÕ¼Ëø²ð·ÖΪ¶à°ÑËø£¬³£¼ûµÄÓжÁÐ´Ëø²ð·Ö¼°ÀàËÆConcurrentHashMapÖÐĬÈϲð·ÖΪ16°ÑËøµÄ·½·¨¡£²ð·ÖËøºÜ´ó³Ì¶ÈÉÏÄÜÌá¸ß¶ÁдµÄËÙ¶È£¬µ«ÐèҪעÒâµÄÊÇÔÚ²ÉÓòð·ÖËøºó£¬È«¾ÖÐÔÖʵIJÙ×÷»á±äµÄ±È½Ï¸´ÔÓ£¬ÀýÈçConcurrentHashMapÖеÄsize²Ù×÷¡£
ÊÇ·ñ²ð·ÖËø»¹µÃ¸ù¾ÝÒµÎñ³¡¾°À´¾ö¶¨¡£ÓÐЩ³¡¾°²¢²»ÊʺÏ×öËøµÄ²ð·Ö£¬¶øÇÒËø²ð·ÖµÄÌ«¶àÒ²»áÔì³ÉÆäËû¸±×÷Óã¬ÀýÈçCPUµÄÏûºÄÃ÷ÏÔÔö¼ÓµÈ£¬Òò´ËËø²ð·ÖÒªÔÚºÏÀíµÄÒµÎñ³¡¾°ÒÔ¼°CPUÏûºÄϽøÐС£
5.1.3.6 È¥³ý¶Áд²Ù×÷µÄ»¥³âËø
ÔÚÐÞ¸Äʱ¼ÓËø£¬²¢ÔÚ¸´ÖƶÔÏóʱ½øÐÐÐ޸ģ¬ÐÞ¸ÄÍê±ÏºóÇл»¶ÔÏóµÄÒýÓ㬶ø¶ÁȡʱÔò²»¼ÓËø£¬ÕâÖÖ·½Ê½³ÆÎªCopyOnWrite.
CopyOnWriteArrayListÊÇCopyOnWrite·½·¨µÄµäÐÍʵÏÖ£¬CopyOnWriteµÄºÃ´¦ÊÇ¿ÉÒÔÃ÷ÏÔÌáÉý¶ÁµÄÐÔÄÜ£¬¶ÔÓÚ¶Á¶àдÉÙµÄÓ¦Ó÷dz£Êʺϣ¬µ«ÓÉÓÚд²Ù×÷ʱÿ´Î¶¼Òª¸´ÖÆÒ»·Ý¶ÔÏ󣬻áÔì³É¸ü¶àµÄÄÚ´æÏûºÄ¡£
5.3.2 δ³ä·ÖʹÓÃÓ²¼þ×ÊÔ´
ÕâÖÖÇé¿öÒ²ÊÇÐÔÄܵ͵ÄÓ¦ÓÃÖо³£³öÏֵģ¬Ö÷ÒªÌåÏÖÔÚδ³ä·ÖʹÓÃCPU ºÍ ÄÚ´æ¡£
5.3.2.1 δ³ä·ÖʹÓÃCPU
¶ÔÓÚJavaÓ¦ÓöøÑÔ£¬Î´³ä·ÖʹÓÃCPUµÄÔÒòÖ÷ÒªÊÇÔÚÄܲ¢Ðд¦ÀíµÄ³¡¾°ÖÐδʹÓÃ×ã¹»µÄÏ̡߳£
Àý×Ó CpuNotUseEffectiveDemo.java µ¥Ïß³Ì
¶ÔÓÚÓжà¸ö»ò¶àºËµÄCPU¶øÑÔÒª³ä·ÖʹÓÃCPU.
Àý×Ó CpuUseEffectiveDemo.java µ¥Ïß³Ì
¶ÔÓÚ´ËÀà¿ÉÒÔÑݱäΪ¶àÏß³ÌÒ²ÎÞÐë¼ÓËøµÄ³¡¾°¶øÑÔ£¬Æô¶¯¶à¸öÏ̺߳óµÄÐÔÄÜ»áÔ¶¸ßÓÚµ¥Ị̈߳¬²¢ÇÒÖ»ÒªÆô¶¯µÄÏß³ÌÊýºÏÀí£¬Ò²²»»á¸øCPUÔì³É¹ý´óµÄ¸ºµ£¡£Èç´Óµ¥Ïß³ÌÑݱäΪ¶àÏß³ÌÒª¼ÓËø£¬ÔòÒªÒýÈ뾡Á¿¼õÉÙËø¾ºÕùµÄ·½·¨£¬²¢½øÐÐÐÔÄܲâÊÔÒÔ±£Ö¤µ÷ÓźóµÄ×ÊÔ´ÏûºÄÒÔ¼°ÐÔÄÜÂú×ãÒªÇó¡£
´ËÖÖÀàÐ͵ij¡¾°»¹Óв»ÉÙ£¬ÀýÈçµ¥Ï̵߳ļÆË㣬¿ÉÒÔ²ð·ÖΪ¶àÏß³ÌÀ´·Ö±ð¼ÆË㣬×îºó½«½á¹ûºÏ²¢£¬ÕâÑùµÄ·½Ê½Ò²¿ÉºÜ´ó³Ì¶ÈÌáÉýϵͳµÄÐÔÄÜ£¬JDK7ÖеÄfork-join¿ò¼Ü¿ÉÒÔ¸øÒÔÉÏÕâÀೡ¾°Ìṩһ¸öºÃµÄÖ§³Å·½·¨¡£
ÔÚCPU×ÊÔ´ÏûºÄ¿É½ÓÊÜ£¬ÇÒ²»»áÒòΪÏß³ÌÔö¼Ó´øÀ´¼¤ÁÒËø¾ºÕùµÄ³¡¾°Ï£¬Ó¦Êʵ±¶Ô´¦Àí¹ý³Ì½øÐзֽ⣬Ôö¼ÓÏß³ÌÊý´Ó¶øÄܲ¢Ðд¦ÀíÒÔÌáÉýϵͳµÄÔËÐÐÐÔÄÜ¡£µ«ÔÚÖØ¹¹Îª²¢ÐÐʱ£¬Òª×¢Òâ¿ØÖÆÄÚ´æÏûºÄ£¬¶øÇÒͨ¹ýÖØ¹¹Îª²¢ÐÐÄÜÌáÉýµÄÐÔÄÜÒ²ÊÇÓÐÏ޵ġ£ÖøÃûµÄAmdahl¶¨ÂÉÖеļòµ¥¼ÆË㹫ʽΪ£º
ϵͳÌáÉýµÄÐÔÄÜ = 1/ (F+(1-F)/N), ÆäÖÐFΪ±ØÐë´®Ðл¯µÄÖ´ÐÐÔÚÕû¸öÖ´Ðйý³ÌÖÐËùÕ¼µÄ±ÈÂÊ£¬
NΪ´¦ÀíÆ÷¸öÊý£¬ÀýÈçÔÚÕû¸öÖ´Ðйý³ÌÖд®Ðл¯µÄ¹ý³ÌÕ¼50%,ÄÇô×î¶àÖ»ÄÜÌáÉý2±¶µÄÐÔÄÜ¡£
5.3.2.2 δ³ä·ÖʹÓÃÄÚ´æ
δ³ä·ÖʹÓÃÄÚ´æµÄ³¡¾°·Ç³£¶à£¬ÈçÊý¾ÝµÄ»º´æ¡¢ºÄʱ×ÊÔ´µÄ»º´æ(ÀýÈçÊý¾Ý¿âÁ¬½ÓµÄ´´½¨¡¢ÍøÂçÁ¬½ÓµÄ´´½¨µÈ)¡¢Ò³ÃæÆ¬¶ÎµÄ»º´æµÈ£¬ÕâÑùµÄ³¡¾°±È½ÏÈÝÒ×Àí½â£¬±Ï¾¹ÄÚ´æµÄ¶ÁÈ¡¿Ï¶¨Ô¶¿ìÓÚÓ²ÅÌ¡¢ÍøÂçµÄ¶ÁÈ¡¡£µ«Ò²Òª±ÜÃâÄÚ´æ×ÊÔ´µÄ¹ý¶ÈʹÓã¬ÔÚÄÚ´æ×ÊÔ´ÏûºÄ¿É½ÓÊÜ£¬GCƵÂʼ°ÏµÍ³½á¹¹(ÀýÈ缯Ⱥ»·¾³¿ÉÄÜ»á´øÀ´»º´æµÄͬ²½µÈ)¿É½ÓÊܵÄÇé¿öÏ£¬Ó¦³ä·ÖʹÓÃÄÚ´æÀ´»º´æÊý¾Ý£¬ÌáÉýϵͳµÄÐÔÄÜ¡£
5.3.2.3 ¶ÔÓÚÊý¾ÝÁ¿´óÔì³ÉµÄÐÔÄܲ»×ã
Êý¾Ý·Ö¿â¡¢·Ö±í¡¢·ÖÇøµÈ
ºÃµÄµ÷ÓŲßÂÔÓ¦ÊÇÊÕÒæ±È(µ÷ÓźóÌáÉýµÄЧ¹û/µ÷ÓŸĶ¯Ëù¸¶³öµÄ´ú¼Û)×î¸ßµÄ£¬Í¨³£À´Ëµ¹¦Äܼòµ¥µÄϵͳµ÷ÓűȽϺÃ×ö£¬·ñÔòÓпÉÄܳöÏÖµ÷ÓÅÁ˵±Ç°¹¦ÄÜÓ°Ïìµ½ÁËÆäËû¹¦ÄÜ£¬Òò´ËÓ¦¾¡Á¿±£³Öµ¥»úÉÏÓ¦Óù¦ÄܵĴ¿´âÐÔ£¬ÕâÊÇ´óÐÍϵͳµÄ»ù±¾¼Ü¹¹ÔÔò¡£
´Ó´¿´âµÄÈí¼þµ÷ÓŽǶÈÀ´½²£¬³ä·Ö¶ø²»¹ý·ÖʹÓÃÓ²¼þ×ÊÔ´£¬ºÏÀíµ÷ÕûJVM(²Ù×÷ϵͳ¡¢ÐéÄâ»ú)ÒÔ¼°ºÏÀíʹÓÃJDK°ü(ÓïÑÔÌṩµÄºËÐÄ¿â)Êǵ÷ÓŵÄÈý´óÓÐЧÔÔò£¬µ÷ÓÅûÓС°Òøµ¯¡±£¬½áºÏϵͳÏÖ×´ºÍ¶à³¢ÊÔ²»Í¬µÄµ÷ÓŲßÂÔÊÇÕÒµ½ºÏÊʵĵ÷ÓÅ·½·¨µÄΨһ;¾¶¡£
²é¿´ÊÇ·ñÓнø³Ì±»ÏµÍ³¸økillµôÁË:
dmesg | grep -i oom cat /var/log/messages sudo grep oom /var/log/messages sudo less /var/log/messages
|
|