CentOS 7 Linux 安装Tomcat 8 - JVM内存优化(咋个办呢 zgbn)

本文介绍了如何在CentOS 7上安装Tomcat 8并进行JVM内存优化,包括JVM堆和非堆内存的默认分配、内存溢出问题及其解决方案,以及如何通过catalina.sh和daemon.sh配置启动时的JVM内存。重点关注了避免OutOftimeError,如Java heap space和PermGen space,以及如何通过工具监控JVM内存使用情况。
摘要由CSDN通过智能技术生成

CentOS 7 Linux 安装Tomcat 8 - JVM内存优化(咋个办呢 zgbn)

参考:CentOS 7 Linux 安装Tomcat 8

配置Tomcat启动JVM时分配的内存

JVM内存分配默认情况说明

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=128M -XX:MaxPermSize=128m"

JVM内存配置参数 描述
-Xmx Java Heap最大值,默认值为物理内存的1/4;
-Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
-Xmn Java Heap Young区大小,不熟悉最好保留默认值;
-XX:PermSize 设定内存的永久保存区域;
-XX:MaxPermSize 设定最大内存的永久保存区域;
-XX:NewSize 设置JVM堆的新生代的默认大小;
-XX:MaxNewSize 设置JVM堆的新生代的最大大小;
-Xss 每个线程的Stack大小,不熟悉最好保留默认值;

JVM堆内存分配

-Xms约定了JVM启动是初始化分配物理内存,默认为物理内存的1/64;
-Xmx约定了JVM运行时最大分配的物理内存,默认是物理内存的1/4;

在JVM运行时,当JVM空闲堆内存大于自身占用内存的70%时,JVM就会自动释放对内存一直达到-Xms约定的最小值,JVM调整自身堆内存时通常是在GC后发生。


内存优化
- 所以我们可以手动去设置-Xms-Xmx相等,避免在每次GC 后调整堆的大小。
- 建议堆内存的最大值设置-Xmx为可用内存的最大值的80%。


内存溢出
- -Xms<-Xmx时,JVM启动失败;
- -Xmx> 可用物理内存时,JVM启动失败;
- 应用程序在启动和运行时所使用的内存超出-Xmx时,JVM发生内存溢出( OutOfMemoryError: Java heap space);

JVM非堆内存分配

-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4;

JVM非堆内存(永久内存区),用于存放Class和Meta信息,应用程序所有的Class在被JVM加载的时候被放入该区域。它和存放类实例(Instance)的堆区域(Heap)不同,垃圾回收GC(Garbage Collection)不会在主程序运行期对非堆内存区(PermGen space)进行清理。

内存优化
- 建议根据服务器部署应用程序的实际情况分配,可以通过jconsole工具观察一下JVM启动后内存的使用情况进而分配;
- 建议将-XX:PermSize-XX:MaxPermSize值设置为相等。


内存溢出
- JVM启动加载应用程序时,加载class所使用内存超出-XX:MaxPermSize,则发生非堆内存溢出错误(OutOfMemoryError: PermGen space);
- 当-Xmx+-XX:MaxPermSize两者设置的内存超出系统可用物理内存时,JVM启动失败;

JVM内存的异常错误

感谢参考:http://blog.csdn.net/thunder0709/article/details/16855195

OutOfMemoryError: Java heap space

内存溢出主要存在问题就是出现在这个情况中。当在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

OutOfMemoryError: PermGen space

这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小,那么就会产生此错误信息了。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

OutOfMemoryError: unable to create new native thread

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。

查看JVM内存信息

使用jconsole工具查看JVM运行时内存

window系统安装JDK包中,有自带的jconsole工具,可以通过jconsole工具链接远程服务器的JVM实例,查看JVM运行时的内存。
顺便介绍另一个JDK自带的工具jvisualvm,可以使用此工具对JAVA程序进行性能测试,分析程序性能数据等等(具体用法大家自行百度一下)。
顺便介绍另一个JDK自带的工具jmc,可以使用此工具远程监控JVM,运行此工具后主界面有对此工具的介绍”Oracle Java Mission Control 是什么?”。

位置:%JAVA_HOME%/bin/jconsole.exe
位置:%JAVA_HOME%/bin/jvisualvm.exe
位置:%JAVA_HOME%/bin/jmc.exe

使用JAVA程序查看JVM运行时内存

//最大可用内存,对应-Xmx 
Runtime.getRuntime().maxMemory(); 
//当前JVM空闲内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值