JVM性能调优

调优思路
JVM是Java Virtual Machine(Java虚拟机)的缩写,Java代码在不同平台上运行时不需要重新编译,Java语言使用JVM屏蔽了与具体平台相关的硬件指令差异,使得Java语言编译程序只需生成在JVM上运行的字节码,实现在多种平台上不加修改地运行。JVM包括即时编译(JIT)、内存管理(垃圾回收GC技术)和Runtime技术,其中GC调优是性能调优中应用最为广泛。本章调优思路主要针对GC展开说明:

首先优选尽可能高的JDK版本,高版本有更新的特性和优化,对Java程序性能有好处;
其次根据实际业务场景和硬件资源给JVM选择合理的堆空间;
最后要选择合理的GC算法。
同时,Java自带很多工具,对程序运行的检测和性能分析都很有帮助,利用这些工具可以辅助Java性能调优。

主要优化参数
优化项

优化项简介

默认值

生效范围

鲲鹏916

鲲鹏920

-Xmx

设置JVM最大可用堆内存大小。

根据系统资源计算默认值

Java进程重启生效 YY

-Xms

设置初始堆大小,一般和Xmx保持一致。

根据系统资源计算默认值

Java进程重启生效 YY

-Xmn

设置年轻代堆大小。

根据系统资源计算默认值

Java进程重启生效 YY

-Xss

设置每个线程的堆大小。

JDK 1.5以后每个线程堆栈大小默认为1MB,1.5以前为256KB。

Java进程重启生效 YY
二、
介绍
jstat是JDK自带的一个JVM统计监控工具,利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括堆大小和应用程序GC状况的监控。

安装方式
完整安装JDK后自带jstat工具,无需单独安装,一般位于Java的bin目录下。

使用方式
jstat是个非常强大的命令,可选项多,可以详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程pid和所选参数。

命令格式:jstat [参数]

一级参数主要功能如下:

参数

说明

jstat -class

显示加载class的数量,及所占空间等信息。

jstat -compiler

显示虚拟机实时编译的数量等信息。

jstat -gc

显示GC的信息,查看GC的次数及时间。

jstat -gccapacity

显示虚拟机内存中三代对象的使用和占用大小。

jstat -gcutil

显示GC的统计信息。

jstat -gcnew

显示年轻代对象的信息。

jstat -gcnewcapacity

显示年轻代对象信息及其内存占用情况。

jstat -gcold

显示老年代对象的信息。

jstat -gcpermcapacity

显示永久代对象的信息及其占用量。

jstat -printcompilation

显示当前虚拟机的执行信息。

GC优化中,利用jstat -gc 较多,其输出参数及含义如下:

参数

说明

S0C

年轻代中第一个survivor区的容量(字节)

S1C

年轻代中第二个survivor区的容量(字节)

S0U

年轻代中第一个survivor区目前已使用空间(字节)

S1U

年轻代中第二个survivor区目前已使用空间(字节)

EC

年轻代中Eden区的容量 (字节)

EU

年轻代中Eden区目前已使用空间(字节)

OC

老年代的容量(字节)

OU

老年代目前已使用空间(字节)

PC

Perm(永久代)的容量(字节)

PU

Perm(永久代)目前已使用空间(字节)

YGC

从应用程序启动到采样时年轻代中gc次数

YGCT

从应用程序启动到采样时年轻代中gc所用时间(s)

FGC

从应用程序启动到采样时老年代(全gc)gc次数

FGCT

从应用程序启动到采样时老年代(全gc)gc所用时间(s)

GCT

从应用程序启动到采样时gc用的总时间(s)

输出格式:

jstat -gc 2342

sh-4.4# jstat -gc 159 1000
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
6144.0 13824.0 6128.8 0.0 702464.0 590176.1 497664.0 468611.6 139032.0 131745.2 15664.0 14404.5 151478 1673.004 1057 34
三、
介绍
jmap是JDK自带的堆信息查看和调试工具,可以将堆信息导出到文件分析,可以查看堆空间分配等信息,是Java性能调优常用工具之一。

安装方式
完整安装JDK后自带jmap工具,无需单独安装,一般位于Java的bin目录下。

使用方式
命令格式:jmap [参数]

常用参数如下:

参数

说明

举例

-dump:[live,]format=b,file=/you/path/filename.hprof

输出JVM的堆对象内容到指定文件。推荐以.hprof后缀命名文件,可以用MAT工具直接分析。 live选项是可选的,如果选live,那么只输出活的对象到文件。

jmap -dump:format=b,file=/opt/log/java12123.hprof 12123

-finalizerinfo

输出正等候回收的对象的信息。

jmap -finalizerinfo 12123

-heap

输出当前Java进程堆的概要统计信息,如GC算法,heap的配置空间等。

jmap -heap 12123

-histo[:live]

输出当前class的实例数目、内存占用、类全名信息。

jmap -histo:live 12123 | head -n 20

-permstat

打印classload和jvm heap中perm代的信息,包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量等信息。

jmap -permstat 12123

jmap -heap 举例说明:

using parallel threads in the new generation. ##新生代采用的是并行线程处理方式
using thread-local object allocation.
Concurrent Mark-Sweep GC ##同步并行垃圾回收
Heap Configuration: ##堆配置情况
MinHeapFreeRatio = 40 ##最小堆使用比例
MaxHeapFreeRatio = 70 ##最大堆可用比例
MaxHeapSize = 2147483648 (2048.0MB) ##最大堆空间大小
NewSize = 268435456 (256.0MB) ##新生代分配大小
MaxNewSize = 268435456 (256.0MB) ##最大新生代可分配大小
OldSize = 5439488 (5.1875MB) ##老年代大小
NewRatio = 2 ##新生代比例
SurvivorRatio = 8 ##新生代与survivor的比例
PermSize = 134217728 (128.0MB) ##perm区大小
MaxPermSize = 134217728 (128.0MB) ##最大可分配perm区大小
Heap Usage: ##堆使用情况
New Generation (Eden + 1 Survivor Space): ##新生代(Eden区 + survivor空间)
capacity = 241631232 (230.4375MB) ##Eden区容量
used = 77776272 (74.17323303222656MB) ##已经使用大小
free = 163854960 (156.26426696777344MB) ##剩余容量
32.188004570534986% used ##使用比例
Eden Space: ##Eden区
capacity = 214827008 (204.875MB) ##Eden区容量
used = 74442288 (70.99369812011719MB) ##Eden区使用
free = 140384720 (133.8813018798828MB) ##Eden区当前剩余容量
34.65220164496263% used ##Eden区使用情况
From Space: ##survivor1区
capacity = 26804224 (25.5625MB) ##survivor1区容量
used = 3333984 (3.179534912109375MB) ##survivor1区已使用情况
free = 23470240 (22.382965087890625MB) ##survivor1区剩余容量
12.43827838477995% used ##survivor1区使用比例
To Space: ##survivor2 区
capacity = 26804224 (25.5625MB) ##survivor2区容量
used = 0 (0.0MB) ##survivor2区已使用情况
free = 26804224 (25.5625MB) ##survivor2区剩余容量
0.0% used ## survivor2区使用比例
concurrent mark-sweep generation: ##老年代使用情况
capacity = 1879048192 (1792.0MB) ##老年代容量
used = 30847928 (29.41887664794922MB) ##老年代已使用容量
free = 1848200264 (1762.5811233520508MB) ##老年代剩余容量
1.6416783843721663% used ##老年代使用比例
Perm Generation: ##perm区使用情况
capacity = 134217728 (128.0MB) ##perm区容量
used = 47303016 (45.111671447753906MB) ##perm区已使用容量
free = 86914712 (82.8883285522461MB) ##perm区剩余容量
35.24349331855774% used ##perm区使用比例

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值