Tomcat 内存与优化篇
Tomcat 内存与优化
一、Tomcat 运行环境介绍
	1.Tomcat 本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和Java虚拟机;
	2.Java 程序启动时JVM都会分配一个初始内存和最大内存给这个应用;
	3.当应用程序用到最大内存的时刻,就会触发JVM做垃圾回收(GC)动作,释放被占用的内存;
	4.因此想要调整Java程序启动时的初始内存和最大内存,需要向JVM申请;
	5.如果初始内存大小设置过小,且此时初始化的应用对象过多,虚拟机就必须重复的加载内存来满足使用;
	6.基于以上原因,最好把初始内存大小(Xms)和最大内存(Xmx)设置成一样;
	7.JVM上所有的对象都在"""堆区(heap)"""上分配内存(也有在"栈"上分配内存的)
	8.堆区的大小是可以动态扩展的,但"""堆"""的大小受限于系统使用的物理内存,当应用程序需要的内存超出"堆"的最大值时,JVM虚拟机就会抛出内存溢出异常,并且导致应用程序奔溃;
	9.基于以上原因,建议“堆”的大小设置成物理内存的80%
二、Tomcat 内存设置(for Linux)
	1.<CATALINA_HOME>/bin/catalina.sh    #路径以及修改内存的文件
	2.JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m"  #内存参数以及值
	3.-Xms:初始内存大小
	4.-Xmx:最大内存
	5.-Xss:每个线程所消耗的内存大小(如-Xss15120是指每增加一个线程就会消耗15M内存),最好设置成128K,默认值为512K
	6.-XX:PermSize:设定内存的永久保存区初始大小,默认为64M(永久是指方法区、永久代,还有年轻代、老年代)
	7.-XX:MaxPermSize:设定内存永久保存区最大大小,默认为64M
	8.其他参数:
		a)	-XX:SurvivorRatio=2:    #生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,可以尝试定制生还者池设置
		b)	-XX:NewSize:			 #新生成的池的初始大小,默认为2M
		c)	-XX:MaxNewSize:		 #新生成的池的最大大小,默认为32M
		d)	+XX:AggressiveHeap       #该参数会使得Xms没有意义,这个参数让参数JVM忽略Xmx参数,疯狂的吃掉一个G的物理内存,再疯狂的吃掉一个G的swap
		e)	-verbose:gc				 #实现垃圾收集信息					
		f)	-Xloggc:gc.log			 #指定来及收集日志文件
		g)	-Xmn:					 #年轻代的堆区大小,一般设置成Xmx的3、4分之一
		h)	-XX:+UseParNewGC		 #缩短minor收集时间(minor GC是指在年轻代触发的GC垃圾回收动作)
		I)	-XX:+UseConcMarkSweepGC  #缩短major收集的时间(major收集是指在年老代触发Full GC垃圾回收动作),此选项在heap size(堆区大小)比较大而且major收集时间较长的情况下使用更合适
		j)	-XX:userParNewGC         #可用来并行收集(多CPU)
		k)	-XX:ParallerGCThreads    #可用来增加并行度(多CPU)
		l)	-XX:UseParallerGC        #设置后可以使用并行清理收集器(多CPU)
		m)	如果JVM的堆大小大于 1G,则应该使用以下配置:
		-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16
		或者将堆的总大小的50%到60%分配给新生成的池,调大新对象区,减少Full GC次数。
	9.注意:
		a)	虚拟机的"堆区大小"决定了虚拟机花费在收集垃圾上的时间和频率;
		b)	如果"堆的大小"很大,那么执行Full GC垃圾回收就会很慢,但是频率降低了;
		c)	如果把"堆的大小"调小,执行Full GC垃圾收回就会很快,但是会更加频繁;
		d)	因此建议把"堆区大小"设置物理内存的80%左右
		e)	建议把内存的最高值和最低值的差值缩小。不然会浪费很多内存;
		f)	最低值加大,那么最高值可以随便设置;
		g)	但是要根据实际的物理内存来设置,且大于物理内存,tomcat就无法启动,可能会导致内存被系统收回,终止进程
三、Tomcat 内存溢出以及调整
	1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
		  a)	释义:
			    1.JVM在启动的时刻会自动设置JVM heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可能超过物理内存;
			    2.可以利用JVM提供的 -Xmn -Xms -Xmx等选项进行设置;
			    3.heap的大小是年轻代(Young Generation)和年老代(Tenured Generaion)之和;
			    4.在JVM中如果98%的时间用于GC,且可用的heap size不足2%的时刻将抛出此异常信息;
  b)	解决:
			    1.手动设置MaxPermSize的大小
			    2.JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
2. java.lang.OutOfMemoryError: PermGen space  ---- PermGen space溢出
		  a)	释义:
			    1.PermGen Space全程是Permanent Generation space,是指内存的永久保存区域;
			    2.这里内存溢出的原因是因为这块内存主要是被JVM存放class和meta信息的,class在被load的时刻被放入PermGen Space区域;
			    3.PermGen Space区域与存放instance的heap区域不同,GC不会在主程序运行期间对PermGen Space进行清理;
			    4.基于以上原因,如果你的APP会载入很多class的话,就很可能出现PermGen Space溢出;
  b)	解决:
			    1.手动设置MaxPermSize大小
3.java.lang.StackOverflowError   ---- 栈溢出
		  a)	释义:
			    1.JVM采用的是栈式虚拟机,函数的调用过程都体现在堆栈和退栈上;
			    2.调用构造函数的"层"太多了,以至于把栈区溢出了;
b)	解决:
			  1.修改程序
4.ava.lang.OutOfMemoryError: GC overhead limit exceeded
a) 这里的意思是指JVM溢出
b) 增加参数,-XX:-UseGCOverheadLimit,关闭这个特性,同时增加heap大小,-Xmx1024m
Tomcat 内存与优化篇的更多相关文章
- tomcat 内存参数优化示例
		https://www.cnblogs.com/cornerxin/p/9304100.html 
- Tomcat配置与优化(内存、并发、管理)与性能监控
		原文链接:http://blog.csdn.net/xyang81/article/details/51530979 一.JVM内存配置优化 在开发当中,当一个项目比较大时,依赖的jar包通常比较多, ... 
- 【Tomcat】Tomcat配置与优化(内存、并发、管理)【自己配置】
		一.JVM内存配置优化 主要通过以下的几个jvm参数来设置堆内存的: -Xmx512m 最大总堆内存,一般设置为物理内存的1/4 -Xms512m 初始总堆内存,一般将它设置的和最大堆内存一样大,这样 ... 
- Kafka集群优化篇-调整broker的堆内存(heap)案例实操
		Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ... 
- Tomcat内存优化
		一.Tomcat内存优化 T omcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS参数. 1.JAVA_OP ... 
- 【Tomcat】如何优化tomcat配置(从内存、并发、缓存4个方面)优化
		一.Tomcat内存优化 ** Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数. JAVA_O ... 
- [Android 性能优化系列]内存之基础篇--Android怎样管理内存
		大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ... 
- [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存
		大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ... 
- tomcat内存、连接数优化
		1.检測系统能够设置的内存大小 java -Xmx1024M -version(当中1024表示检測内存能否够调整到这个数) 2.设置tomcat内存 在tomcat_home/bin/catalin ... 
随机推荐
- Android Studio IDE 所遇问题汇总
			[窗体视图无法显示] 在/res/values/styles.xml文件中,修改一下内容 <!-- Base application theme. --><style nam ... 
- ios浅谈关于nil和 NIL区别及相关问题(转)
			转自:http://blog.csdn.net/guozh/article/details/8469131 个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次 ... 
- 阿里云主机SSD实例磁盘测试及IO调度算法调整
			测试背景及环境说明 阿里云ECS 主机配置: 4C8G root@zabbix-master:~# grep -i "model name" /proc/cpuinfo model ... 
- 黑马程序员——Java高级应用(一)
			------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ... 
- js判断浏览器类型以及版本
			你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外,世界上还有近百种浏览器. 几天前,浏览器家族有刚诞生了一位小王子,就是Google推出的 ... 
- Jsp request
			<%@ page language="java" import="java.util.*" pageEncoding="GB18030" ... 
- AngularJs练习Demo2
			@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ... 
- js中的function
			Math方法详解 Math.sqrt(x) 计算X开平方 Math.sqrt(x,y) 计算xy Math.round(x) 计算x 四舍五入的值 getBoundingClientRe ... 
- webview 上 postUrl 发送参数过程中数据丢失或错误 的问题
			用到了android 的 webview 来展示页面.webview需要用post来传递参数.于是问题出现了,后台解析中发现参数错误. 之前有因为String 和byte[]转行时,数据丢失的问题,于 ... 
- C# 向批处理文件输入字符
			先记录个无关标题哒~ 刚刚学习用C#,在用VS进行图形界面编程时,点界面中添加的空间,VS界面右侧会出现该控件的属性页,但是这个属性页并不全, 只列出了部分重要的属性,一开始还以为是没有对应的属性方法 ... 
