昨天启动工程,发现占用内存特别多,占用了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左右了,一下少了差不多一半,还是很值得的。这下再也不用担心电脑卡了。。