java内存调优基础参数
参考文献:
1. JVM实用参数(四)内存调优
2.深入理解 java 虚拟机 第二版
目录:
前言:本文主要介绍了JVM中各个区域的大小设置参数,一般来说,凡可以设置大小的区域都有发生内存溢出的可能。这里没有提及的是程序计数器。程序计数器是java内存区域中最小的储存单元,线程私有,是当前线程所执行的字节码的行号指示器。也只有此区域没有规定任何内存溢出异常。
java堆
线程共享内存区域,JVM中最大的内存区域,主要用于存在对象实例。几乎所有对象实例都在此区域储存。
-Xms :指定JVM初始堆内存大小
-Xmx :指定JVM最大堆内存大小
这两个参数单位为byte,也可使用单位符号指定,如使用k(K)、m(M)或g(G)。
使用命令行启动MyTest类,并指定堆初始内存256M,最大1G:
java -Xms256M -Xmx1G MyTest
需知道的是,-Xms
和-Xmx
分别是和-XX:InitalHeapSize
及-XX:MaxHeapSize
的缩写。
-XX:+HeapDumpOnOutOfMemoryError :开启内存溢出自动生成快照。
-XX:HeapDumpPath=<path>
:指定内存快照生成路径。
-XX:+HeapDumpOnOutOfMemoryError
可以让程序内存溢出时自动生成堆内存快照。默认情况下,堆内存快照保存在JVM启动目录下,文件名为java_pid<pid>
.hprof。-XX:HeapDumpPath=<path>
指定堆内存快照的路径,此参数将改变上面提及的默认路径。一般来说堆内存快照一般很大,需指定到有很大空间的地方。
JVM参数中含有
+
的一般为bool值选项,如HeapDumpOnOutOfMemoryError
,在前面加+
表示开启此功能,-
则为禁止此功能。若选项为key-value
形式,则为key=value
,如HeapDumpPath=<path>
方法区
线程共享内存区域,存储类信息、常量、静态变量等
-XX:PermSize:方法区初始大小
-XX:MaxPermSize :方法区最大值
需注意的是:方法区并不等同于永久代,仅仅是HotSpot虚拟机使用永久代实现方法区,其他虚拟机并无永久代概念。另外,在JVM模型中方法区是堆的一个逻辑部分,可理解为其是区别于堆的独立空间。
启动MyTest类,设置方法区初始大小为128M,最大256M:
java -XX:PermSize=128M -XX:MaxPermSize=256M MyTest
虚拟机栈和本地方法栈
虚拟机栈
线程私有区域,是java方法执行的内存模型。,即每个方法的执行过程,就对应着虚拟机栈的一个栈帧从入栈到出栈的过程。一个栈帧包括:局部变量表、操作数栈、动态链接、方法完成等。
-Xss :设置虚拟机栈大小
启动MyTest类,设置虚拟机栈大小为128K
java -Xss128K MyTest
本地方法栈
线程私有,与虚拟机栈类似,不过本地方法栈是java中执行native方法的内存模型。在HotSpot虚拟机中虚拟机栈与本地方法栈合二为一了,因此在HotSpot中不存在本地方法栈
-Xoss :设置本地方法栈大小(在HotSpot中无效)
注:在HotSpot中,设置栈容量只有-Xss
参数。
本机直接内存
java1.4后,可通过NIO使用native函数库直接在堆外分配内存。直接内存不受java堆内存大小限制,默认与堆内存最大值(-Xmx)一致。
-XX:MaxDirectMemorySize=<size>
运行MyTest类,指定直接内存为256M
java -XX:MaxDirectMemorySize=256M MyTest