JVM优化
1 JVM内存模型
这里可以参考一篇如若大佬的一篇博文(侵删),不再赘述。
深入详解KVM内存模型
2 jvm的运行参数
2.1 java运行参数类型
java运行参数共分为三类
- 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
- 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
- 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
2.2 标准参数
Java使用方式
java [options] classname [args]
java [options] -jar filename [args]
options: 命令行选项,空格分隔
classname: 启动的class名称
filename: Jar包名称(JAR)
args: main()方法参数,空格隔开
常用的标准参数:
-?
或者-help
: 输出java标准参数列表及其描述。
-jar
:指定以jar包的形式执行一个应用程序。 要这样执行一个应用程序,必须让jar包的manifest文件中声明初始加载的Main-class,当然那Main-class必须有public static void main(String[] args)方法。
-showversion
: 输出java版本信息(与-version相同)之后,继续输出java的标准参数列表及其描述。
-client
: 设置jvm使用client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者PC应用开发和调试。
-server
: 设置jvm使server模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有64位能力的jdk环境下将默认启用该模式,而忽略-client参数。
-X
:输出非标准的参数列表及其描述。
2.3 非标准参数
常用的非标准参数:
-Xint
: 设置jvm以解释模式(interpreted mode)运行,所有的字节码将被直接执行,而不会编译成本地码,但是会降低运行速度。
-Xcomp
: 设置jvm以解释模式(compiled mode)运行,所有的字节码编译成本地码,带来最大程度的优化,但是没有让JVM启用JIT编译器全部功能,会编译一些只执行一次的代码带来一些性能损失。
-Xmixed
: 设置jvm以混合模式(mixed mode)运行将以上两种模式混合使用,由JVM自己决定,是JVM的默认模式。
-Xmnsize
:设置堆中年轻代(young generation)的初始值和最大值大小。单位是bytes,常用K,M,G (不区分大小写)。年轻代主要放置新对象,这块区域也是GC执行比较频繁的区域。如果该区域设置较小,可能导致频繁minor GC,如果设置过大,只有Full GC执行则每次GC耗时较长。Oracle建议的大小是整个堆大小的1/4 - 1/2之间。
例: -Xmn256m
可通过-XX:NewSize设置初始,-XX:MaxNewSize设置最大值。
-Xmssize
:设置堆的初始值,该值必须是1024的倍数并且大于1MB。-Xms
等价于高级选项-XX:InitialHeapSize
例: -Xms6m
如果该值不设置,则通过计算年轻代和老年代的和作为堆的初始值
-Xmxsize
:指定应用的最大内存大小,该值必须是1024的倍数并且大于2MB。对于服务型应用,-Xms和-Xmx常设置为相同,至于原因涉及垃圾回收机制,如果两者设置相同则应用占据的内存不进行动态扩展。-Xmx
等价于高级选项-XX:MaxHeapSize
例: -Xmx1g
-Xsssize
:设置线程栈的大小。-Xss
等价于高级选项-XX:ThreadStackSize
例: -Xss1024k
2.4 非Stable参数
-XX也是非标准参数 ,主要用于JVM调优和debug的操作
-XX参数的使用主要有两种方式,一种是Boolean类型,一种是非Boolean类型
- boolean类型的
-格式:-XX[±]<name>表示启用或者禁用<name>属性
-如:-XX:-DisableExplicitGC
表示禁止手动调用System.gc(),但jvm的gc仍然有效 - 非Boolean类型的
-格式:-XX<name>=<value>表示<name>属性的值为<value>
-如:-XX:NewRatio=2
表示新生代内存容量与老生代内存容量的比例
常用的参数:
-XX:HeapDumpPath=./java_pid.hprof 指定导出堆信息时的路径或文件名
-XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
-XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
3 查看正在运行的JVM参数
- 查看java进程id
-方法一:ps -ef|grep <进程名称>
-方法二:jps -l
- 根据进程id查询参数
-jinfo -flag <参数名> <进程id>
注:参数名可以不填,默认查询所有参数
4 内存溢出的定位及分析
既然我们学会了加减乘除,下面我们就做个微积分来练练手吧。
这里是找到的一篇使用eclipse的MAT工具分析内存溢出问题的操作文章,可以看看这个(侵删)
使用MAT工具进行内存溢出定位及分析