首先了解一下JVM是什么?
在java中:
JDK:是java在开发中所需用到的jar包等,相当于我们常说的工具类一样。
JRE:是我们的java程序运行时所需要的环境,一般JRE包含JDK。
JVM:是java程序或者jar包运行时所需要的内存,就像windows系统一样,需要划分出一定的内存空间才能运行。
JVM(基于JDK1.7)内存主要分为三个:新生代区域、老年代区域、永久代区域。
其中新生代区域约占整个堆内存的1/3,老年代区域约占整个堆内存的2/3 。
新生代区域又可以分为三部分:
Eden区(约占整个新生代区域8/10)、
SurvivorFrom区(约占整个新生代区域1/10)、
SurvivorTo区(约占整个新生代区域1/10)。
1.新生代
新生代时垃圾回收的主要区域。在新生代内存中,存储一些除了大对象以外的新创建的对象,也是对象创建和销毁最为频繁的区域,会频繁的出发MinorGC进行垃圾回收。
2.老年代
老年代主要存储的是有长生命周期的大对象(一般是2kb-128kb)。关于垃圾回收,GC过程为MajorGC,对象比较稳定时,M案件orG C不会频繁地触发。当老年代没有内存空间分配时,会抛出OOM(内存溢出异常)。
3.永久代
内存永久保存的区域。主要保存的是class文件和MetaData。class文件被加载时存放在永久代。
内存参数设置主要有7组:
1. -Xms :初始堆内存大小。 -Xmx :最大堆内存大小。
2. -XX:NewSize=1g
表示新生代区域大小为1GB 。一般建议设置为总堆内存大小的1/3,最好不要超过2/3 。
3. -XX:MaxPermSize=128M
表示最大永久代区域的大小(可以适当的调高大小)。
4. -XX:NewRatio=3
表示新生代与老年代的比值为3,也就是新生代如果是1,老年代就是3 。
5. -XX:SurvivorRatio=8
表示Survivor与Eden的比值是8,也就是在新生代内存中,Eden占8/10,SurvivorFrom占1/10,SurvivorTo占1/10 。
6. 垃圾回收器:
UseParNewGC:年轻代为多线程收集。
UseConcMarkSweepGC:老年代为并发收集。
7. OOM异常诊断设置:
-XX:HeapDumpOnOutOfMemoryError:当发生OOM时,转存储堆到文件
-XX:HeapDumpPath:导出堆的转存储文件路径地址
假如有一块物理内存是8GB,其中2GB预留给操作系统使用,剩下的6GB设为JVM的内存。
因此可以设置-Xms:6g -Xmx:6g -XX:NewSize=2GB
结束。