昨天啓動工程,發現佔用內存特別多,佔用了1個多G,導致系統特別卡,這還只是剛啓動呢,什麼都沒做,我不能忍,卡的人心煩,而且工作 效率也低,所以看是不是能解決掉這個問題?
首先看看程序中是否有代碼問題導致內存吃這麼多?通過JDK自帶的VisualVM監控,發現都挺正常的,使用的堆常在250M以內,還能接受,但是分配的話,是分配了900M的空間,初步估計應該是初始化的時候撐大的,但沒有釋放回去,所以決定通過設置JVM參數的方法看是不是能優化一下;
在IDEA中設置JVM啓動參數
-Xmx600m 最大堆大小
-Xms600m 初始堆大小
-Xmn100m 年輕代大小
-XX:SurvivorRatio=8 Eden區與Survivor區的大小比值,設置爲8,則兩個Survivor區與一個Eden區的比值爲2:8,一個Survivor區佔整個年輕代的1/10
-XX:+UseG1GC 使用 G1 (Garbage First) 垃圾收集器 (因爲本地是JDK版本是JDK8,所以啓用G1收集器,8以下的可以試用CMS收集器)
-XX:ParallelGCThreads=8 設置垃圾收集器在並行階段使用的線程數[一般設置爲本機CPU線程數相等,即本機同時可以處理的個數,設置過大也沒有用]
-XX:ConcGCThreads=8 併發垃圾收集器使用的線程數量
-XX:+DisableExplicitGC 禁止在啓動期間顯式調用System.gc()
-XX:+HeapDumpOnOutOfMemoryError OOM時導出堆到文件
-XX:HeapDumpPath=d:/dumps/xxx.dump 導出OOM的路徑(此處自定義dump文件路徑)
-XX:+PrintGCDetails 打印GC詳細信息
-XX:+PrintGCTimeStamps 打印CG發生的時間戳
-XX:+PrintHeapAtGC 每一次GC前和GC後,都打印堆信息
-XX:+TraceClassLoading 監控類的加載
設置完後再查看內存就基本上穩定在600M左右了,一下少了差不多一半,還是很值得的。這下再也不用擔心電腦卡了。。