这两天跑demo,demo总是因为out of memeory而停掉。之前也知道设置参数这回事,一直在工作中没有遇到过,顶多是eclipse启动的时候按照网上现成的模板弄一下,没有系统的了解一下,今天正好借这个机会了解一下。
java jvm的heap分3段:
--------------------------------
PermGen space ------------------------> 存储class文件等需要永久存储的
-------------------------------- -Xmx| -Xms
Older --------------------------> 存储。 jvm gc 一个线程专门负责扫描Older区进行gc
-------------------------------- -Xmn
Young ---------------------------> 新new的对象, jvm gc有一个线程在Heap不足时,遍历Heap,将Young 区升级为Older区
-------------------------------- heap begin
ms和mx在生产环境一般将这两个值设置成相同的值,为了减少系统在运行期间分配内存所花费的时间。
经验值mn一般为mx的1/3.
4种GC
1、第一种为单线程GC,也是默认的GC,该GC适用于单CPU机器。
2、第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
3、第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
4、第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
PS: 设置参数的默认单位是k,如果使用m或者g,要指明。
java -Xms15g -Xms15g -Xmn5g xxx
参考资料:http://developer.51cto.com/art/200906/127144.htm