看到下面這一堆信息, 我想你應該知道要做什麼了.
main at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48) at java.util.Arrays.copyOfRange([CII)[C (Arrays.java:2694) at java.lang.String.<init>([CII)V (String.java:203) at java.lang.StringBuilder.toString()Ljava/lang/String; (StringBuilder.java:405) at com.mkk.utils.GuidGeneratorTest.outOfMemory()V (GuidGeneratorTest.java:25) at sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (Method.java:601)
加大內存,加大內存, 內存溢出了, 於是我設置了
JAVA_OPTS=-server -Xms2048m -Xmx2048m -XX:PermSize=1024m -XX:MaxPermSize=512m -Xss512k
重啟服務器, 沒過多久又 OutOfMemoryError
是時候知道該死的OutOfMemoryError,
所以, 請給JAVA_OPTS添加
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/error
(注: 紅色部分為服務器的一路徑,當OutOfMemoryError是JVM信息會保存在該目錄裡)
再重啟服務器,期待下一次的OutOfMemoryError吧.
是的, OutOfMemoryError又來了...
現在,去/home/error目錄看看吧. 是否有類似java_pid6472.hprof的文件生成, 還很大(好幾十或幾百MB).
現在, 推薦去下載MAT(Memory Analyzer Tool)工具在看看是什麼東東把內存都消耗完了(也可用JDK自帶的jvisualvm.exe工具). 下載地址:
http://www.eclipse.org/mat/downloads.php
最後, 找到了源頭. 去修改代碼吧.