JVM 堆内存调优

来源:互联网 发布:选择linux内核启动 编辑:程序博客网 时间:2024/06/11 11:20

最近我的服务器的因为在tomcat7放了比较多的项目所以JVM内存不够用了,报OutOfMem java heap size 的异常。很显然需要对tomcat的JVM堆内存重新进行设置。

我的服务器是买的阿里云的服务,单核2G内存,因为不需要跑太复杂的应用,所以这足够了。


从GC日志看到当前的新生代大小为87M, 老年代大小为126M。重新设置JVM堆内存大小,需要设置以下参数:

1. -Xmx, -Xms, 指定新生代及老年代空间大小的初始值和最大值。-Xms指定初始值,-Xmx指定最大值。这两个参数指定的也就是java堆内存的大小。JVM会根据情况在初始值和最大值之间调整大小。但是为了避免JVM调整大小可以把这两个值设置的一样大,因为java堆内存的调整必然伴随着Full GC,造成应用程序的停顿和延迟。如果非常关注吞吐量和延迟的话就要注意这两个值一定要设置一样的值。

2. 新生代的大小可以通过以下参数进行设置:

-XX: NewSize=<n>[g|m|k],设置新生代的初始值,也是最小值,n为要设置的大小,g,m,k为单位

-XX: MaxNewSize=<n>[g|m|k],新生代最大值

-Xmn<n>[g|m|k] 设置新生代的初始值,最小值,最大值。这个参数可以设置新生代为一个固定的值,不会随着堆大小的调整而变化。也就是-Xmx和-Xms如果没有设定为同一个值,那么在-Xmn的作用下新生代大小也不会变化。

3. 老年代的大小就等于-Xmx和-Xms设置的值减去新生代的值,所以没有参数单独设置。

4. 永久代的大小设置:

-XX:PermSize=<n>[g|m|k],设置永久代的初始值,也是最小值

-XX:MaxPermSize=<n>[g|m|k],设置永久代的最大值

永久代的大小变化也会引起Full GC,所以如果你不想Full GC太频繁还是把永久代的初始值和最大值设置为一样的值。


研究了需要设置的参数,开始研究如何设置

内存要让JVM够用,而且还不能让服务器上其他的应用没有内存可用,查看服务器当前的内存使用情况,服务器的内存使用在60%左右,所以还有空间可以分配给JVM去使用,毕竟tomcat是我的服务器上的主要应用。

JVM优化的原则是minor GC回收大多数的内存。如果minor GC不能回收就会进入老年代,如果老年代也占满,就会进行Full GC,如何Full GC还是不能释放足够的空间来分配新的

内存就会跑出Out of Memery exception. 另外,永久代占满也会触发Full GC, full GC不能让永久代有足够的空间分配给新的对象也会Out of Memery exception。所以老年代和永久代的大小取决于你的应用有多少活跃的数据。活跃的数据指GC过后仍然留在内存里的数据,这部分数据如果占满了内存空间将导致你不能分配内存给新的对象。所以分析应用程序在稳定状态下的活跃数据大小可以来帮助设置JVM堆内存大小。

通过分析Full GC后JVM堆中各区域的使用情况可以知道活跃数据大小。这里需要研究的包括老年代的活跃数据大小和永久代的活跃数据大小。

java堆大小计算法则空间命令行选项占用倍数java堆-Xmx 和 -Xms3 - 4 倍Full GC后老年代空间占用量永久代-XX: PermSize 
-XX: MaxPermSize1.2 -1.5 倍Full GC后永久代空间占用量新生代-Xmn1-1.5倍Full GC后老年代空间占用量老年代java堆大小减去新生代大小2-3倍的老年代空间占用量      
从GC日志看出,老年代在full GC后占用空间是124M,永久代在full GC后占用是100M,考虑到以后可能还要加应用到tomcat去,所以设置的更大一些:

-Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m -Xmn180m
-Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m -Xmn180m

-Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxNewSize=512m -Xmn180m


设置后重启tomcat,查看当前服务器的内存使用情况是85%,可以接受。也算是充分利用这个单核2G的服务器了。


1 0
原创粉丝点击