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
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于