JVM内存
一、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。
通过JvisualVM监控JVM
Jvisualvm工具内置于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进程号。