JVM调优 - 工具篇

作者:张学亮

讲解内容

  • 了解下我们为什么要学习JVM优化

  • 掌握jvm的运行参数以及参数的设置

  • 掌握jvm的内存模型(堆内存)

  • 掌握jamp命令的使用以及通过MAT工具进行分析

  • 掌握定位分析内存溢出的方法

  • 掌握jstack命令的使用

  • 掌握VisualJVM工具的使用

1、为什么要对jvm进行优化?

在本地开发环境中我们很少会遇到需要对jvm进行优化的需求,但是到了生产环境,我们

可能将有下面的需求:

  • 运行的应用“卡住了”,日志不输出,程序没有反应

  • 服务器的CPU负载突然升高

  • 在多线程应用下,如何分配线程的数量?

  • ……

在本次课程中,我们将对jvm有更深入的学习,我们不仅要让程序能跑起来,而且是可以

跑的更快!可以分析解决在生产环境中所遇到的各种“棘手”的问题。

说明:本套课程使用的jdk版本为1.8.0_201。
PS:超过该版本oracle版jdk将收费。

2、jvm的运行参数

在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行。 绝大部分的参数保持默认即可。

2.1、三种参数类型

jvm的参数类型分为三类,分别是:

  • 标准参数

    • -help
    • -version
  • -X参数 (非标准参数)
    • -Xint
    • -Xcomp
  • -XX参数(使用率较高)
    • -XX:newSize
    • -XX:+UseSerialGC

2.2、标准参数

jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help 检索出所有的标准参数。

$ java -help
用法: java [-options] class [args...](执行类)或  java [-options] -jar jarfile [args...](执行 jar 文件)
其中选项包括:-d32          使用 32 位数据模型 (如果可用)-d64          使用 64 位数据模型 (如果可用)-server       选择 "server" VM默认 VM 是 server.-cp <目录和 zip/jar 文件的类搜索路径>-classpath <目录和 zip/jar 文件的类搜索路径>用 ; 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。-D<名称>=<值>设置系统属性-verbose:[class|gc|jni]启用详细输出-version      输出产品版本并退出-version:<值>警告: 此功能已过时, 将在未来发行版中删除。需要指定的版本才能运行-showversion  输出产品版本并继续-jre-restrict-search | -no-jre-restrict-search警告: 此功能已过时, 将在未来发行版中删除。在版本搜索中包括/排除用户专用 JRE-? -help      输出此帮助消息-X            输出非标准选项的帮助-ea[:<packagename>...|:<classname>]-enableassertions[:<packagename>...|:<classname>]按指定的粒度启用断言-da[:<packagename>...|:<classname>]-disableassertions[:<packagename>...|:<classname>]禁用具有指定粒度的断言-esa | -enablesystemassertions启用系统断言-dsa | -disablesystemassertions禁用系统断言-agentlib:<libname>[=<选项>]加载本机代理库 <libname>, 例如 -agentlib:hprof另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help-agentpath:<pathname>[=<选项>]按完整路径名加载本机代理库-javaagent:<jarpath>[=<选项>]加载 Java 编程语言代理, 请参阅 java.lang.instrument-splash:<imagepath>使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html
。

有关详细信息, 请参阅

2.2.1、实战

实战1:查看jvm版本

$ java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)# `‐showversion`参数是表示,先打印版本信息,再执行后面的命令,在调试时非常有用, 后面会使用到。

实战2:通过-D设置系统属性参数

package cn.zxl.jvm;public class TestJVM {public static void main(String[] args) {String str = System.getProperty("str");if(str == null){System.out.println("dmgeo");}else{System.out.println(str);}System.gc();}
}

进行编译、测试:

打印结果:

上述配置就相当于命令行如下指令:

2.2.2、-server与-client参数

可以通过-server-client设置jvm的运行参数。

  • 它们的区别是Server VM的初始堆空间会大一些,默认使用的是并行垃圾回收器,启 动慢运行快。
  • Client VM相对来讲会保守一些,初始堆空间会小一些,使用串行的垃圾回收器,它 的目标是为了让JVM的启动速度更快,但运行速度会比Serverm模式慢些。
  • JVM在启动的时候会根据硬件和操作系统自动选择使用Server还是Client类型的 JVM32位操作系统 如果是Windows系统,不论硬件配置如何,都默认使用Client类型的JVM。 如果是其他操作系统上,机器配置有2GB以上的内存同时有2个以上CPU的话默 认使用server模式,否则使用client模式。 64位操作系统 只有server类型,不支持client类型。

测试:

由于本机是64位系统,所以不支持client模式。

2.3、-X参数

jvm的-X参数是非标准参数,在不同版本的jvm中,参数可能会有所不同,可以通过java - X查看非标准参数。

D:\develop\workspace\java\zxl-jvm\zxl-jvm-test\src\main\java
$ java -X-Xmixed           混合模式执行 (默认)-Xint             仅解释模式执行-Xbootclasspath:<用 ; 分隔的目录和 zip/jar 文件>设置搜索路径以引导类和资源-Xbootclasspath/a:<用 ; 分隔的目录和 zip/jar 文件>附加在引导类路径末尾-Xbootclasspath/p:<用 ; 分隔的目录和 zip/jar 文件>置于引导类路径之前-Xdiag            显示附加诊断消息-Xnoclassgc       禁用类垃圾收集-Xincgc           启用增量垃圾收集-Xloggc:<file>    将 GC 状态记录在文件中 (带时间戳)-Xbatch           禁用后台编译-Xms<size>        设置初始 Java 堆大小-Xmx<size>        设置最大 Java 堆大小-Xss<size>        设置 Java 线程堆栈大小-Xprof            输出 cpu 配置文件数据-Xfuture          启用最严格的检查, 预期将来的默认值-Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)-Xcheck:jni       对 JNI 函数执行其他检查-Xshare:off       不尝试使用共享类数据-Xshare:auto      在可能的情况下使用共享类数据 (默认)-Xshare:on        要求使用共享类数据, 否则将失败。-XshowSettings    显示所有设置并继续-XshowSettings:all显示所有设置并继续-XshowSettings:vm 显示所有与 vm 相关的设置并继续-XshowSettings:properties显示所有属性设置并继续-XshowSettings:locale显示所有与区域设置相关的设置并继续-X 选项是非标准选项, 如有更改, 恕不另行通知。

2.3.1、-Xint、-Xcomp、-Xmixed

  • 在解释模式(interpreted mode)下,-Xint标记会强制JVM执行所有的字节码,当然这 会降低运行速度,通常低10倍或更多。
  • -Xcomp参数与它(-Xint)正好相反,JVM在第一次使用时会把所有的字节码编译成 本地代码,从而带来最大程度的优化。
    • 然而,很多应用在使用-Xcomp也会有一些性能损失,当然这比使用-Xint损失的 少,原因是-xcomp没有让JVM启用JIT编译器的全部功能。JIT编译器可以对是否 需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就 没有意义了。
  • -Xmixed是混合模式,将解释模式与编译模式进行混合使用,由jvm自己决定,这是 jvm默认的模式,也是推荐使用的模式。

示例:强制设置运行模式

注意:编译模式下,第一次执行会比解释模式下执行慢一些,注意观察。

2.4、-XX参数

XX参数也是非标准参数,主要用于jvm的调优和debug操作。
-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型:

  • boolean类型

    • 格式:-XX:[+-]
    • 如:-XX:+DisableExplicitGC 表示禁用手动调用gc操作,也就是说调用 System.gc()无效
  • 非boolean类型
    • 格式:-XX:
    • 如:-XX:NewRatio=1 表示新生代和老年代的比值

用法:

2.5、-Xms与-Xmx参数

-Xms-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
-Xmx2048m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048M
-Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M
适当的调整jvm的内存大小,可以充分利用服务器资源,让程序跑的更快。
示例:

D:\develop\workspace\java\zxl-jvm\zxl-jvm-test\src\main\java
$ java -Xms512m -Xmx2048m cn.zxl.jvm.TestJVM
dmgeo

2.6、查看jvm的运行参数

有些时候我们需要查看jvm的运行参数,这个需求可能会存在2种情况:

  • 第一,运行java命令时打印出运行参数;
  • 第二,查看正在运行的java进程的参数;

2.6.1、运行java命令时打印参数

运行java命令时打印参数,需要添加-XX:+PrintFlagsFinal参数即可。
java -XX:+PrintFlagsFinal -version


由上述的信息可以看出,参数有boolean类型和数字类型,值的操作符是=:=,分别代表默认值和被修改的值。

修改参数VerifySharedSpaces的值
java -XX:+PrintFlagsFinal -XX:+VerifySharedSpaces -version

可以看到VerifySharedSpaces这个参数已经被修改了。

  • 开启:
    java -XX:+PrintFlagsFinal -XX:+VerifySharedSpaces -version|findstr VerifySharedSpaces
  • 关闭:
    java -XX:+PrintFlagsFinal -XX:-VerifySharedSpaces -version|findstr VerifySharedSpaces

2.6.2、查看正在运行的jvm参数

如果想要查看正在运行的jvm就需要借助于jinfo命令查看。
首先,启动一个tomcat用于测试,来观察下运行的jvm参数。

在这里插入代码片


访问:localhoost:8080

  • 通过jps或者 jps ‐l查看java进程
  • 查看所有的参数,用法:jinfo ‐flags <进程id>
$ jinfo -flags 8172
Attaching to process ID 8172, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.101-b13
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=197132288 -XX:MaxHeapSize=3143630848 -XX:MaxNewSize=1047527424 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=65536000 -XX:OldSize=131596288 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -Djava.util.logging.config.file=D:\develop\apache-tomcat-7.0.76\conf\logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=D:\develop\apache-tomcat-7.0.76\endorsed -Dcatalina.base=D:\develop\apache-tomcat-7.0.76 -Dcatalina.home=D:\develop\apache-tomcat-7.0.76 -Djava.io.tmpdir=D:\develop\apache-tomcat-7.0.76\temp
  • 查看某一参数的值,用法:jinfo ‐flag <参数名> <进程id>

3、jvm的内存模型

jvm的内存模型在1.7和1.8有较大的区别,虽然本套课程是以1.8为例进行讲解,但是我们 也是需要对1.7的内存模型有所了解,所以接下里,我们将先学习1.7再学习1.8的内存模型。

3.1、jdk1.7的堆内存模型

  • Young 年轻区(代)
    Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区,其中, Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制 对象用,在Eden区间变满的时候, GC就会将存活的对象移到空闲的Survivor区间 中,根据JVM的策略,在经过几次垃圾收集后,仍然存活于Survivor的对象将被移动 到Tenured区间。

  • Tenured 年老区
    Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young 复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了 application级别的缓存,缓存中的对象往往会被转移到这一区间。

  • Perm 永久区
    Perm代主要保存class,method,filed对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到 java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因 就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造 成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题。

  • Virtual区
    最大内存和初始内存的差值,就是Virtual区。

3.2、jdk1.8的堆内存模型


由上图可以看出,jdk1.8的内存模型是由2部分组成,年轻代 + 年老代。
年轻代:Eden + 2*Survivor
年老代:OldGen
在jdk1.8中变化最大的Perm区,用Metaspace(元数据空间)进行了替换。
需要特别说明的是:Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存空间中,这也是与1.7的永久代最大的区别所在。

3.3、为什么要废弃1.7中的永久区?

官网给出了解释:http://openjdk.java.net/jeps/122

This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.
移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。

现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen
基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。

3.4、通过jstat命令进行查看堆内存使用情况

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

3.4.1、查看class加载统计

$ jps

D:\develop\apache-tomcat-7.0.76\bin
$ jstat -class 8212
Loaded  Bytes  Unloaded  Bytes     Time11844 21107.6        0     0.0       7.11

说明:

  • Loaded:加载class的数量
  • Bytes:所占用空间大小
  • Unloaded:未加载数量
  • Bytes:未加载占用空间
  • Time:时间

3.4.2、查看编译统计

D:\develop\apache-tomcat-7.0.76\bin
$ jstat -compiler 8212
Compiled Failed Invalid   Time   FailedType FailedMethod5043      1       0    28.86          1 org/apache/tomcat/util/IntrospectionUtils setProperty


说明:

  • Compiled:编译数量。
  • Failed:失败数量
  • Invalid:不可用数量
  • Time:时间
  • FailedType:失败类型
  • FailedMethod:失败的方法

3.4.3、垃圾回收统计

D:\develop\apache-tomcat-7.0.76\bin
$ jstat -gc 8212S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT  FGC    FGCT     GCT
36352.0 38912.0  0.0    0.0   449536.0 83013.6   169984.0   45310.6   59028.0 58273.7 8192.0 8036.3     10    0.446   3      0.442    0.888


说明:

  • S0C:第一个Survivor区的大小(KB)
  • S1C:第二个Survivor区的大小(KB)
  • S0U:第一个Survivor区的使用大小(KB)
  • S1U:第二个Survivor区的使用大小(KB)
  • EC:Eden区的大小(KB)
  • EU:Eden区的使用大小(KB)
  • OC:Old区大小(KB)
  • OU:Old使用大小(KB)
  • MC:方法区大小(KB)
  • MU:方法区使用大小(KB)
  • CCSC:压缩类空间大小(KB)
  • CCSU:压缩类空间使用大小(KB)
  • YGC:年轻代垃圾回收次
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

4、jmap的使用以及内存溢出分析

前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,
如:内存使用情况的汇总、对内存溢出的定位与分析。

4.1、查看内存使用情况

D:\develop\apache-tomcat-7.0.76\bin
$ jmap -heap 8212
Attaching to process ID 8212, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.101-b13using thread-local object allocation.
Parallel GC with 4 thread(s)Heap Configuration: #堆内存配置信息MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 3143630848 (2998.0MB)NewSize                  = 65536000 (62.5MB)MaxNewSize               = 1047527424 (999.0MB)OldSize                  = 131596288 (125.5MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 460324864 (439.0MB)used     = 85005936 (81.06797790527344MB)free     = 375318928 (357.93202209472656MB)18.466509773410806% used
From Space:capacity = 37224448 (35.5MB)used     = 0 (0.0MB)free     = 37224448 (35.5MB)0.0% used
To Space:capacity = 39845888 (38.0MB)used     = 0 (0.0MB)free     = 39845888 (38.0MB)0.0% used
PS Old Generation #老年代capacity = 174063616 (166.0MB)used     = 46398096 (44.24867248535156MB)free     = 127665520 (121.75132751464844MB)26.655826798404554% used19142 interned Strings occupying 1739112 bytes.

4.2、查看内存中对象数量及大小

  • 查看所有对象,包括活跃以及非活跃的
    jmap ‐histo <pid> | more

  • 查看活跃对象
    jmap ‐histo:live <pid> | more

D:\develop\apache-tomcat-7.0.76\bin
$ jmap -histo:live 8212 | morenum     #instances         #bytes  class name
----------------------------------------------1:         94334       12898664  [C2:          7855        7754536  [B3:         90965        2183160  java.lang.String4:         12566        1382144  java.lang.Class5:         15133        1331704  java.lang.reflect.Method6:          8457        1121552  [I7:         30353         971296  java.util.HashMap$Node8:          7480         864296  [Ljava.util.HashMap$Node;9:         14008         797072  [Ljava.lang.Object;10:         16005         640200  java.util.LinkedHashMap$Entry11:          9971         638144  java.net.URL12:         19843         634976  java.util.concurrent.ConcurrentHashMap$Node13:          5830         419760  java.lang.reflect.Field14:          8299         398352  org.apache.catalina.loader.ResourceEntry15:          4485         358800  java.lang.reflect.Constructor16:         16948         354952  [Ljava.lang.Class;17:          5245         293720  java.util.LinkedHashMap18:          4553         218544  java.util.HashMap19:          6442         206144  java.lang.ref.WeakReference20:           196         197920  [Ljava.util.concurrent.ConcurrentHashMap$Node;21:          4460         178400  java.lang.ref.SoftReference22:          2865         160440  java.lang.Class$ReflectionData23:          6383         153192  java.util.ArrayList24:          2933         148576  [Ljava.lang.String;
-- More  --

# 对象说明
B  byte
C  char
D  double
F  float
I  int
J  long
Z  boolean
[  数组,如[I表示int[]
[L+类名 其他对象

4.3、将内存使用情况dump到文件中

有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也 是支持dump到文件中的。

#用法:
jmap ‐dump:format=b,file=dumpFileName <pid>#示例
jmap ‐dump:format=b,file=dump.dat 8212

可以看到已经在D:\develop\workspace\java\zxl-jvm\zxl-jvm-test\data下生成了dump.dat的文件。

D:\develop\workspace\java\zxl-jvm\zxl-jvm-test\data
$ jmap -dump:format=b,file=dump.dat 8212
Dumping heap to D:\develop\workspace\java\zxl-jvm\zxl-jvm-test\data\dump.dat ...
Heap dump file createdD:\develop\workspace\java\zxl-jvm\zxl-jvm-test\data
$ dir驱动器 D 中的卷是 软件卷的序列号是 960C-77CED:\develop\workspace\java\zxl-jvm\zxl-jvm-test\data 的目录2020/10/11  17:50    <DIR>          .
2020/10/11  17:50    <DIR>          ..
2020/10/11  17:50        78,462,398 dump.dat1 个文件     78,462,398 字节2 个目录 593,156,988,928 可用字节

4.4、通过jhat对dump文件进行分析

在上一小节中,我们将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看。

#用法:
jhat ‐port <port> <file>

示例:

D:\develop\workspace\java\zxl-jvm\zxl-jvm-test\data
$ jhat -port 9999 dump.dat
Reading from dump.dat...
Dump file created Sun Oct 11 17:50:10 CST 2020
Snapshot read, resolving...
Resolving 617627 objects...
Chasing references, expect 123 dots...........................................................................................................................
Eliminating duplicate references...........................................................................................................................
Snapshot resolved.
Started HTTP server on port 9999
Server is ready.

打开浏览器进行访问:http://localhost:9999/

在最后面有OQL查询功能。

select s from java.lang.String s where s.value.length >= 10000

4.5、通过MAT工具对dump文件进行分析

4.5.1、MAT工具介绍

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰 富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止 了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
官网地址:https://www.eclipse.org/mat/

4.5.2、下载安装

下载地址:https://www.eclipse.org/mat/downloads.php


将下载得到的MemoryAnalyzer-1.10.0.20200225-win32.win32.x86_64.zip进行解压:

4.5.3、使用

第一步:open

第二步:选择要分析的堆转储文件

第三步:

第四步:点击【Overview】

第五步:点击【Dominator Tree】搜索对象

查看对象以及它的依赖:

查看可能存在内存泄露的分析:

JVM调优:运行参数,内存模型,mat、jps、jstat、jmap、jstack、jvisualvm工具的使用相关推荐

  1. JVM调优和参数配置

    1.JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots    答:什么是垃圾:简单的说就是内存中已经不再被使用到的空间就是垃圾        要进行垃圾回收,如何判断一个对象是否可以被回 ...

  2. JVM调优-配置参数

    什么时候需要调优 非计算密集型任务cpu占用过高 老年代已使用空间大于70% Full GC频繁 单次GC时间大于1秒 出现OOM 程序的响应速度明显变慢 示例情况 非计算密集型任务cpu占用过高:有 ...

  3. JVM调优及参数设置

    (1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持 ...

  4. JVM调优-GC参数

    一.Throughput收集器(吞吐量) -XX:+UseParallelGC -XX:+UseParallelOldGC *参数调整:通过调整堆大小,减少GC停顿时间,增大吞吐量 增强堆大小可以减少 ...

  5. JVM调优常用参数配置

    2019独角兽企业重金招聘Python工程师标准>>> 堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n: ...

  6. java面试-JVM调优和参数配置

    JVM的参数类型: 1.标配参数: java -version java -help 2.X参数: -Xmixed 混合模式 -Xint  解释执行 -Xcomp 第一次使用就编译成本地代码 3.XX ...

  7. JVM调优之参数配置: -Xms -Xmx -Xmn -XX:+PrintGCDetails -XX:UseSerialGC -XX:SurvivorRadio -XX:NewRadio

    JVM提供了诸多的参数进行JVM各个方面内存大小的设置,为Java应用进行优化提供了诸多的工具,本文将会详细分析各个参数的功能与使用. 1.常见参数说明: -Xms: //堆内存初始化大小 -Xmx: ...

  8. 常用的 jvm 调优的参数都有哪些?

    (1)-Xms20M 表示设置JVM启动内存的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置JVM启动内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM ...

  9. JVM的进阶学习(GC Roots、JVM调优与参数配置、)

    1. GC Roots,可达性分析 从GC roots的对象作为起始点,从GC Roots对象开始向下搜索,如果一个对象到GCRoots没有任何引用链相连,则说明对象不可用.即给定一个集合的引用作为根 ...

  10. JVM调优_堆内存溢出和非堆内存溢出

    文章目录 1. pom 2. MemoryController 3. User 对象 4. 动态生成class文件工具类 5. 启动项目 6. 测试连接 7. 异常信息 1. pom <!--动 ...

最新文章

  1. “大型票务系统”和“实物电商系统”的数据库选型
  2. 睿云智合(Wise2C)谈论docker
  3. CCNP第四天(2) 配置、校验OSPF特殊区域类型-完全Stub区域
  4. legend3---lavarel常用artisan命令操作
  5. bzoj1212: [HNOI2004]L语言
  6. 1003 Emergency (25 分)【Dijastra与DFS解法】
  7. 创新的迷思——2019 Microsoft Hackathon 苏州站回顾
  8. 树形动规_(战略游戏)
  9. html 嵌入 excel_用了这么久Excel,你了解它的前世今生吗?
  10. java对象的内存结构_Java对象在内存中的结构分析
  11. 主动訪问用户数据的背后是品牌战略
  12. 每日算法系列【LeetCode 115】不同的子序列
  13. JAVA王思聪吃热狗程序_王思聪吃热狗什么梗?
  14. 一次监视雷达行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  15. 【LaTeX入门】02、CJK环境讲解
  16. DJYOS开发板系列之一:基于BK7251开发的ZQ1401物联屏开发板
  17. 使用经典的基本播放命令和 MML 创建 MIDI 文件
  18. 用python画动态皮卡丘_如何利用python绘制可爱皮卡丘?
  19. c语言还是python-自学编程应该从c语言还是python入手?
  20. tpc ds mysql_TPC-DS 生成数据

热门文章

  1. win7怎么合并计算机窗口,win7 已设置任务栏窗口从不合并,游戏多开,如何固定窗口顺序?...
  2. 【学术相关】中国霸榜AI顶会,但引用量最低!最新斯坦福AI指数出炉!
  3. 【机器学习】小数据集怎么上分? 几行代码生成伪标签数据集
  4. 适合小白的卷积神经网络图解
  5. 【深度学习】深度学习手写代码汇总(建议收藏,面试用)
  6. 【Python】Python处理图像五个有趣场景,很实用!
  7. 【深度学习】梯度消失和梯度爆炸问题的最完整解析
  8. 【论文解读】PFLD:高精度实时人脸关键点检测算法
  9. 神经网络十大学习率衰减提效策略
  10. 游戏的社交与延伸:怎样把玩家连结起来?