JVM优化

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工具进行内存溢出定位及分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值