一、JVM内存设置
1、JavaJVM内存介绍
JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中,它和堆不同,运行期内GC不会释放其空间。
2、各个参数的解释:
内存
说明
参数
说明
默认值
堆(Heap)内存分配
Java代码可及的内存,是留给开发人员使用的
-Xms
Java Heap初始值
默认是物理内存的1/64
-Xmx
Java Heap最大值
默认是物理内存的1/4
-Xmn
Java Heap Young区大小
不熟悉最好保留默认值
-XX:NewSize
设置JVM堆的‘新生代’的默认大小
用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大
-XX:MaxNewSize
设置JVM堆的‘新生代’的最大大小
非堆(Non-heap)内存分配
方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码
-XX:PermSize
设定内存的永久保存区域
默认是物理内存的1/64
-XX:MaxPermSize
设定最大内存的永久保存区域
默认是物理内存的1/4
注:
Server端JVM最好将-Xms和-Xmx设为相同值以避免在每次GC后调整堆的大小,降低性能,开发测试机JVM可以保留默认值;默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制JDK1.8取消PermSize,改为MetaSpaceSize。 二、JVM 异常监控 通过JvisualVM监控JVMJvisualvm工具内置于JDK1.6以上版本中。配置好PATH后,可直接通过jvisualvm命令来进行jvm监控。可以直接在远程桌面或shell中访问服务器中的jvisualvm工具,这样直接可以监控到服务器上所有java进程。
在抽样器页面,我们可以对CPU中线程、内存中对象加载情况进行监控。
三、tomcat
1、进程数设置
tomcat设置并发连接数:在tomcat配置文件server.xml中的配置中,和连接数相关的参数有:
参数
说明
minProcessors
最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors
最大连接线程数,即:并发处理的最大请求数,默认值为75
enableLookups
是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout
网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
maxThreads
表示最多处理多少个连接
minSpareThreads
表示即使没有人使用最少也会开这么多空线程等待
maxSpareThreads
表示最多可以开启多少个空线程等待
acceptCount
当同时连接的人数达到maxThreads时,还可以接收排队的连接,超过这个连接的则直接返回拒绝连接。
注:其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。
2、tomcat内存设置
Windows:
Jdk1.6:
set JAVA_OPTS=-server -Xms2048m -Xmx2048m -XX:PermSize=64M -XX:MaxPermSize=256M
Jdk1.8:
set JAVA_OPTS=-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256M-XX:MaxMetaspaceSize=256M
Linux:
jdk1.6:
JAVA_OPTS="-server -Xms2048m -Xmx2048m-XX:PermSize=64M -XX:MaxPermSize=256M"
Jdk1.8:
JAVA_OPTS=-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
常用的特殊参数:
-XX:+HeapDumpOnOutOfMemoryError
内存溢出时生成dump文件参数,dump文件可用于代码问题分析
生成dump文件
通过jvm参数--XX:+HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出时候Dump出当前的内存转储快照。
-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,如不设置,默认存储在jvm 运行环境目录。如我们这使用的是tomcat 默认dump文件存储在 tomcat/bin 目录下。也可以指定文件名称,如果不指定文件名,默认文件示例如下:java_pid2821.hprof,其中2821为Java进程号。