tomcat的JVM调优
1.error场景
Tomcat 长期运行过程遇到Caused by: java.lang.OutOfMemoryError: PermGen space或java.lang.OutOfMemoryError: Java heap space错误。
2.异常原因
PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这块内存主要是被JVM存放Class和Meta信息的。
Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同。
GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
Java heap space
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。
Heap size 的大小是Young Generation 和Tenured Generaion 之和。JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
Heap Size 最大不要超过可用物理内存的80%
一般的要将-Xms和-Xmx选项设置为相同(java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源)。而-Xmn为1/4的-Xmx值。
“推荐Xms和Xmx设置值为相同”,并不适用于所有情况,要根据实际情况而定。 当服务器多个tomcat同时运行时,(Xms要肯定小于Xmx)建议每个tomcat 设置 Xms = 1/2Xmx或2/3Xmx。理由是当某个tomcat高峰时,可以弹性分配内存空间。无可避免以上重新分配分隔内存的效率问题。
3.解决办法
tomcat安装文件,/bin/catalina.sh文件修改JAVA_OPTS
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256 -Djava.awt.headless=true"
重启tomcat,JAVA_OPTS各参数的具体数值大小须根据实际服务器物理内存大小进行分配。
4.JVM监控
查看jdk安装路径:whereis java echo $JAVA_HOME which java echo $PATH
采用jdk提供的jps(JavaVirtual Machine Process Status Tool)小工具。
查看当前Java进程:bin/jps -v
使用jstat工具查看GC情况,语法为:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]参数解释: *Options -选项,我们一般使用-gcutil查看GC情况 vmid -VM的进程号,即当前运行的java进程号 interval -间隔时间,单位为秒或毫秒
例:bin/jstat -gcutil 18860 3000
结果参数说明如下:
S0 -Heap上的Survivor space 0区已使用空间的百分比
S1 -Heap上的Survivor space 1区已使用空间的百分比
E -Heap上Eden space区已使用空间的百分比
O -Heap上的Old space区已使用空间的百分比,达到100%,就是内存溢出了
P -Perm space区已使用空间的百分比,达到100%,就是内存溢出了
YGC -从应用程序启动到采样时发生Yang GC 的次数
YGCT -从应用程序启动到采样时Yang GC所用的时间【单位秒】
FGC -从应用程序启动到采样时Full GC的次数
FGCT -从应用程序启动到采样时Full GC所用的时间
GCT -从应用程序启动到采样时用于垃圾回收的总时间【单位秒】
通过监控O、P数值情况,再次调整JAVA_OPTS相关参数大小达到优化目的。
tomcat的JVM调优的更多相关文章
- JVM的常用的调优策略和垃圾回收算法及Tomcat的常用调优参数
jvm调优主要针对堆内存,堆内存分为:新生区.养老区和永久区 永久区存放的是系统jdk自身的interface和class的元数据,所以唯有新生区和养老区具有优化空间. 新生区:伊甸区和幸存者区.所有 ...
- JVM调优(四)——tomcat远程debug
JVM调优(四)--tomcat远程debug tomcat远程debug jdwp协议 使用步骤 登录远程服务器,进入tomcat目录,并打开文件: //tomcat/bin/startup.sh ...
- jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...
- jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...
- JVM调优的几种策略
一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从J ...
- SpringBoot项目优化和Jvm调优(转)
原文:https://blog.csdn.net/wd2014610/article/details/82182617 项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringB ...
- 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)
目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...
- [转]jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...
- Java虚拟机(七):JVM调优案列
Eclispe启动优化 概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程栈来分析代 ...
随机推荐
- python摸爬滚打之day09----初识函数
1.函数 把一段公共的代码提取出来通过一个变量(函数名)将这些代码重复调用, 使程序可拓展易维护. def 函数名(形参): 函数体 函数名(实参) -----> 调用该函数 2.return ...
- vue中watch的详细用法
在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-model=&quo ...
- 那些年读过的书《Java并发编程实战》二、如何设计线程安全类
1.设计线程安全类的过程 设计线程安全类的过程就是设计对象状态并发访问下线程间的协同机制(在不破坏对象状态变量的不变性条件的前提下). (1)构建线程安全类的三个基本要素: 1)找出构成对象状态的所有 ...
- 记录关于vs2008 和vs2015 的报错问题
出现了 VS2008无法创建项目,无法打开项目的情况,提示这个注册表键值有问题 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSBuild \ ToolsV ...
- QGL登陆wui 提示not possible
1: sap 登陆 QGL系统, 提示 2: 需要到该系统下,使用 T-CODE su01 或者 su3 对LIHANS1 用户角色进行修改. 3:su53 查询 自己操作的 历史纪录和 状 ...
- 网络编程——socket编程
一.客户端/服务端架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网企业处处是C/S架构 C/S架构与socket的关系:学习socket就是为了完成C/S架构的开发 二.OSI七层 一个 ...
- Linux修改IP网络配置
文件路径:/etc/sysconfig/networe-scripts/ifcfg-eth0 BOOTPROTO="static" IPADDR=IP地址 NETMASK=掩码 G ...
- eclipse配置新约束
一.DTD格式的约束: 二.xsd格式的
- nodejs+mysql入门实例(改)
//连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'bdm253137448. ...
- IntelliJ IDEA 普通java工程如何转为maven工程
1.项目上右键 Add Framework Support. 2.选择maven,点击OK.