【JVM基础内容速查表】JVM基础知识 默认参数 GC命令 工具使用 JVM参数设置、说明、使用方法、注意事项等(持续更新)

news2024/11/18 2:48:45

目录

    • 一、JVM前置知识
        • 1. -X、-XX含义
        • 2. JVM参数值的类型和设置方式
        • 3. 查看GC时用到的命令和JVM参数
        • 4. 查看JVM默认参数
    • 二、垃圾收集器选择
        • -XX:+UseSerialGC
        • -XX:+UseParallelGC
        • -XX:+UseParallelOldGC
        • -XX:+UseParNewGC
        • -XX:+UseConcMarkSweepGC
        • -XX:+UseG1GC
    • 三、垃圾收集器特有参数
      • 1. ParNew
        • -XX:ParallelGCThreads=
      • 2. Parallel Scavenge
        • -XX:MaxGCPauseMillis=
        • -XX:GCTimeRatio=
        • -XX:+/-UseAdaptiveSizePolicy
    • 四、内存设置
        • -Xmx | -XX:MaxHeapSize=
        • -Xms | -XX:InitialHeapSize=
        • -Xmn | -XX:NewSize= | -XX:MaxNewSize=
        • -Xss | -XX:ThreadStackSize=
        • -XX:MetaspaceSize= | -XX:MaxMetaspaceSize= ——-XX:PermSize= | -XX:MaxPermSize=
    • 五、内存分配策略
        • -XX:FieldsAllocationStyle=
        • -XX:+/-CompactFields
        • -XX:+/-UseTLAB
        • -XX:MinHeapFreeRatio= | -XX:MaxHeapFreeRatio=
    • 六、内存分析
        • -XX:+/-HeapDumpOnOutOfMemoryError
        • -XX:+/-TraceClassLoading
        • -XX:+/-TraceClassUnloading
        • -Xloggc:filename & -XX:+/-PrintGC等GC日志打印相关参数
    • 参考


【JVM学习笔记】JVM内存区域定义与内存结构

【JVM学习笔记】对象的创建过程、 对象的内存布局、 如何定位和使用对象

【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

HotSpot VM垃圾收集器——Serial Parallel CMS G1垃圾收集器的JVM参数、使用说明、GC分析




一、JVM前置知识


1. -X、-XX含义

参数前缀含义
我们所有的JVM参数实际上,都是通过java命令传递的,也就是说,任何jvm参数实际上都是Java命令的一部分。

Java命令实际上包含的种类有很多,我们可以通过Java -h查看全部可用的命令。

语法

  • java [options] classname [args]
  • java [options] -jar filename [args]
  • javaw [options] classname [args]
  • javaw [options] -jar filename [args]

在这里插入图片描述

JVM参数即是java命令中的【-options】,Options支持的部分类型如下:

  • 【-】标准选项(Standard Options):保证所有Java虚拟机(JVM)的实现都支持标准选项。它们用于常见操作,例如检查JRE版本、设置类路径、启用详细输出等等,可以通过“java -h”查看可用标准选项。

  • 【-X】非标准选项(Non-Standard Options)是特定于Java HotSpot虚拟机的,因此不保证其它虚拟机实现支持该参数,并且在以后的JDK版本中不会通知其变更(某个版本不生效或含义变更时不做特别说明),可以通过“java -X”查看可用的非标准选项。

  • 【-XX】高级选项(Advanced Options),这些选项可以控制Java HotSpot虚拟机运行时的行为。这些是开发人员选项,用于为HotSpot虚拟机在特定领域的调优操作,这些领域通常具有特定的系统需求,可能需要对系统配置参数的特权访问。它们也不能保证得到所有JVM实现的支持,而且可能会发生变化。



2. JVM参数值的类型和设置方式

注:如果同时设置相同或同种功能的参数,那么在命令行中后设置的值才会生效。即“-Xmx=2m -XX:MaxHeapSize=4m”,生效的值是4m。

-X与-XX的参数类型和设置方式相同,这里以-XX为例

1. 布尔值

参数形式:-XX:+/-<option>
开启:-XX:+<option>
关闭:-XX:-<option>
例如:-XX:+UseSerialGC

2. 数值

参数形式:-XX:<option><number> | -XX:<option>=<number> (这两种形式并不互通,依照具体的参数选择使用那种形式,下文中以有无=号区分)
值单位:无(byte)、K(kb)、M(mb)、G(gb)
例如:-Xmx32M, -XX:MaxNewSize=32k(32 * 1024 = 32768(b))

3. 字符

参数形式: -XX:<option>=<string>
说明:设置字符值,一般用于设置文件、地址和命令



3. 查看GC时用到的命令和JVM参数

1. 查看当前机器上默认JVM参数

java -XX:+PrintCommandLineFlags -version


2. 查看指定运行程序的JVM参数(如果设置了JVM参数,将会覆盖上面的默认值)

jinfo -flags <pid>
查询指定参数(options)设置:jinfo -flag <options> <pid>


3. 通过jmap查看用了哪种算法的收集器
jmap -heap <pid>
Windows:jmap -heap <pid> | findstr GC
Linux:jmap -heap <pid> | grep GC


4. 通过jcmd强制gc
jcmd <pid> GC.run
注:可以通过jcmd <pid> help来查看程序可以执行的命令


5. 查看GC日志,方便查看GC时使用了什么收集器和收集时的内存信息(JDK8,JDK9后使用-Xlog参数打印日志)

-XX:+PrintGC:打印GC时的基本信息
-XX:+PrintGCDetails:打印GC详细信息
-XX:+PrintHeapAtGC:打印GC前后的堆、方法区可用容量的变化
-XX:+PrintGCTimeStamps**:打印GC时间戳


已经启动的Java程序,可以通过下面的命令启用上述参数:
jinfo -flag +PrintGC <pid>



4. 查看JVM默认参数

JVM默认参数会因为系统、内存大小、jdk版本、vm等内容的不同,而产生不同的默认值,所以你看到的值可能如下面的值有部分差异。


本机配置信息
内存:16GB
操作系统:WIN10 x64
JDK版本:1.8.0_171
VM:Java HotSpot™ 64-Bit Server VM


查看默认JVM参数设置

D:\Project>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=257905728 -XX:MaxHeapSize=4126491648 -XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

查看默认内存配置

# 查看pid
jps -l
# 查看heap信息
jmap -heap 2028

得到如下的默认内存配置信息:

Heap Configuration:
   MinHeapFreeRatio         = 0							// 闲置堆空间的最小百分比,默认40
   MaxHeapFreeRatio         = 100						// 闲置堆空间的最大百分比,默认70
   MaxHeapSize              = 4127195136 (3936.0MB) 	// 最大堆空间,默认1/4内存
   NewSize                  = 85983232 (82.0MB)			// 当前新生代大小
   MaxNewSize               = 1375731712 (1312.0MB)		// 新生代最大值,根据堆大小和NewRatio来决定
   OldSize                  = 171966464 (164.0MB)		// 当前老年代大小
   NewRatio                 = 2 						// old/new的比例,默认2
   SurvivorRatio            = 8							// eden/survivor的比例,默认8
   MetaspaceSize            = 21807104 (20.796875MB) 	// 当前元空间大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB)		// 类压缩空间,默认1G,-XX:CompressedClassSpaceSize指定,大小受限于MaxMetespaceSize
   MaxMetaspaceSize         = 17592186044415 MB 		// 允许的最大元空间,如果不设置元空间大小,默认无限大
   G1HeapRegionSize         = 0 (0.0MB)					// G1垃圾收集器中每个区域的大小(启动G1时才生效)





二、垃圾收集器选择

参考该文:HotSpot VM垃圾收集器——Serial Parallel CMS G1垃圾收集器的JVM参数、使用说明、GC分析

-XX:+UseSerialGC

启用组合:Serail Young (DefNew) + Serial Old Mark Sweep Compact

查看启用参数和GC内容:

D:\Project>jinfo -flag UseSerialGC 4288
-XX:+UseSerialGC

D:\Project>jmap -heap 4288 | findstr "GC"
Mark Sweep Compact GC

查看GC收集器详情:

D:\Project>jcmd 4288 GC.run
4288:
Command executed successfully


325.368: [Full GC (System.gc()) 325.368: 
	[Tenured: 32742K->32744K(349568K), 0.0769539 secs] 38309K->32744K(506816K), 
	[Metaspace: 57305K->57305K(1101824K)], 0.0770048 secs] 
[Times: user=0.08 sys=0.00, real=0.08 secs] 
  • Full GC (System.gc()):表明本次Full GC的原因是执行了System.gc()命令。

  • Tenured:老年代收集,一般表明老年代使用的是Serial Old收集器。

  • Metaspace:元空间收集情况,元空间为非堆,它是位于堆外的一块内存。

  • Times:本次GC所用时间。



-XX:+UseParallelGC

启用组合:Parallel Young (PSYoungGen、Parallel Scavenge) + Serial Old Mark Sweep Compact | Parallel Old Mark Sweep Compact

该JVM参数启用了Parallel Scavenge收集器,同时其老年代收集器默认为Parallel Old,可以通过设置参数来组合其它老年代的收集器。

查看启用参数和GC内容:

D:\Project>jinfo -flag UseParallelGC 15404
-XX:+UseParallelGC

D:\Project>jmap -heap 15404 | findstr "GC"
Parallel GC with 10 thread(s)

查看GC收集器详情:

D:\Project>jcmd 15404GC.run
15404:
Command executed successfully


76.217: [GC (System.gc()) 
	[PSYoungGen: 2870K->288K(140288K)] 35650K->33075K(489984K), 0.0026375 secs] 
[Times: user=0.00 sys=0.00, real=0.00 secs] 

76.220: 
[Full GC (System.gc()) 
	[PSYoungGen: 288K->0K(140288K)] 
	[ParOldGen: 32787K->31310K(349696K)] 33075K->31310K(489984K), 
	[Metaspace: 57241K->57241K(1101824K)], 0.0767850 secs] 
[Times: user=0.22 sys=0.00, real=0.08 secs] 



-XX:+UseParallelOldGC

启用组合:Serail Young (DefNew) | Parallel Young (PSYoungGen、Parallel Scavenge) | Parallel Young (ParNew)
+ Parallel Old Mark Sweep Compact

  • JDK 6时才提供Parallel Old收集器。
  • 该JVM参数,仅启用了Parallel Old收集器,新生代收集器会根据JVM默认参数来设置,也可以通过其它JVM参数指定新生代收集器。
  • 我的机器默认使用了UseParallelGC参数,所以新生代为PSYoungGen。

查看启用参数和GC内容:

D:\Project>jinfo -flag UseParallelOldGC 4964
-XX:+UseParallelOldGC

D:\Project>jmap -heap 4964 | findstr "GC"
Parallel GC with 10 thread(s)

查看GC收集器详情:

D:\Project>jcmd 4964 GC.run
4964:
Command executed successfully

675.850: [GC (System.gc()) 
	[PSYoungGen: 3065K->224K(141312K)] 29892K->27050K(491008K), 0.0026659 secs] 
[Times: user=0.00 sys=0.00, real=0.00 secs]

675.852: [Full GC (System.gc()) 
	[PSYoungGen: 224K->0K(141312K)] 
	[ParOldGen: 26826K->26795K(349696K)] 27050K->26795K(491008K), 
	[Metaspace: 56938K->56938K(1101824K)], 0.1212485 secs] 
[Times: user=0.27 sys=0.00, real=0.12 secs] 



-XX:+UseParNewGC

启用组合:Parallel Young (ParNew)
+ Serial Old Mark Sweep Compact | Parallel Old Mark Sweep Compact | Concurrent Mark Sweep (Old)

  • 除了Serial收集器外,目前只有它能与CMS收集器配合工作。
  • ParNew + CMS与ParNew + Serial Old组合,在JDK8被宣布废弃,JDK9取消了对该组合的支持。
  • -XX:+UseParNewGC参数也在JDK9后被直接取消了。

查看启用参数和GC内容:

D:\Project>jinfo -flag UseParNewGC 20052
-XX:+UseParNewGC

D:\Project>jmap -heap 20052 | findstr "GC"
Mark Sweep Compact GC

查看GC收集器详情(与serial别无二致,打印的GC日志都一样):

D:\Project>jcmd 20052 GC.run
20052:
Command executed successfully


16.495: [GC (Allocation Failure) 16.495: 
	[ParNew: 156622K->9790K(157248K), 0.0050190 secs] 213221K->66389K(506816K), 0.0050597 secs] 
[Times: user=0.00 sys=0.00, real=0.00 secs] 


89.628: [Full GC (System.gc()) 89.628: 
	[Tenured: 50767K->32723K(349568K), 0.0939450 secs] 83372K->32723K(506816K), 
	[Metaspace: 57211K->57211K(1101824K)], 0.0940025 secs] 
[Times: user=0.09 sys=0.00, real=0.09 secs] 

GC (Allocation Failure):表明本次GC的原因是内存分配失败导致的GC,从而进行的新生代垃圾收集(mirrorGC或称youngGC),如果GC后,内存仍无法分配就会尝试对堆进行扩容,如果已到堆的最大容量,那么将进行整堆收集。整堆收集后仍无法为对象分配内存时,就会抛出OOM异常。



-XX:+UseConcMarkSweepGC

启用组合:Serial Young (DefNew) | Parallel Young (ParNew) + Concurrent Mark Sweep (Old)

  • CMS的默认新生代为ParNew。
  • ParNew + CMS的组合在JDK8被宣布废弃,JDK9取消了对该组合的支持

查看启用参数和GC内容:

D:\Project>jinfo -flag UseConcMarkSweepGC 7156
-XX:+UseConcMarkSweepGC

D:\Project>jmap -heap 7156 | findstr "GC"
Concurrent Mark-Sweep GC

查看GC收集器详情:

D:\Project>jcmd 7156 GC.run
7156:
Command executed successfully

18.303: [GC (Allocation Failure) 18.303: 
	[ParNew: 153906K->13619K(157248K), 0.0094748 secs] 159600K->23724K(506816K), 0.0095149 secs] 
[Times: user=0.02 sys=0.00, real=0.01 secs] 


111.118: [Full GC (System.gc()) 111.118: 
	[CMS: 35564K->31991K(349568K), 0.0956757 secs] 37072K->31991K(506816K), 
	[Metaspace: 57246K->57246K(1101824K)], 0.0957642 secs] 
[Times: user=0.09 sys=0.00, real=0.10 secs]



-XX:+UseG1GC

启用G1收集器

查看启用参数和GC内容:

D:\Project>jinfo -flag UseG1GC 14300
-XX:+UseG1GC

D:\Project>jmap -heap 14300 | findstr "GC"
Garbage-First (G1) GC with 10 thread(s)

查看GC收集器详情:

D:\Project>jcmd 14300 GC.run
14300:
Command executed successfully

91.976: [Full GC (System.gc())  65M->31M(512M), 0.1022988 secs]
   [Eden: 23.0M(284.0M)->0.0B(307.0M) Survivors: 23.0M->0.0B Heap: 65.8M(512.0M)->31.6M(512.0M)], 
   [Metaspace: 57227K->57206K(1101824K)]
 [Times: user=0.11 sys=0.00, real=0.11 secs] 
  • Eden:新生代收集情况。

  • Survivors:幸存区收集情况。

  • Heap:整个堆空间收集情况。





三、垃圾收集器特有参数

1. ParNew

-XX:ParallelGCThreads=

设置垃圾收集时的线程数量,默认值根据平台而变。



2. Parallel Scavenge

-XX:MaxGCPauseMillis=

控制最大垃圾收集停顿时间,收集器将尽力保证内存回收花费的时间不超过用户设定值。

将MaxGCPauseMillis设置更小,并不一定能使系统的垃圾收集速度变得更快,垃圾收集停顿时间缩短是以牺牲吞吐量和新生代空间为代价换取的:系统把新生代调得小一些,收集300MB新生代肯定比收集500MB快,但这也直接导致垃圾收集发生得更频繁。停顿时间的确在下降,但吞吐量也降下来了。


-XX:GCTimeRatio=

设置吞吐量大小,范围(0 < n <100)。也就是垃圾收集时间占总时间的比率,相当于吞吐量的倒数。譬如把此参数设置为19,那允许的最大垃圾收集时间就占总时间的5%(即1/(1+19)),默认值为99,即允许最大1%(即1/(1+99))的垃圾收集时间。


-XX:+/-UseAdaptiveSizePolicy

这是一个开关参数,当这个参数被激活之后,就不需要人工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。这种调节方式称为垃圾收集的自适应的调节策略(GC Ergonomics)





四、内存设置

-Xmx | -XX:MaxHeapSize=

设置堆的最大值。值需要为1024的倍数且大于2M。默认值的设置基于系统配置,在64位JVM上,默认的最大堆大小为物理内存的1/4,默认值最大可达1G。


-Xms | -XX:InitialHeapSize=

设置堆的最小值。值需要为1024的倍数且大于1M。默认值为分配给newSize和oldSize的和(默认值为物理内存的1/64),默认值最大可达1G。


-Xmn | -XX:NewSize= | -XX:MaxNewSize=

  • -Xmn同时设置新生代的初始值和最大值。
  • -XX:NewSize设置新生代初始值。
  • -XX:MaxNewSize设置新生代最大值。

值设置过小时,会导致频繁的mirrorGC发生。值设置过大,会导致每次执行GC时间变得很长。Oracle官方建议新生代大小设置为整个堆大小的1/2或1/4。


-Xss | -XX:ThreadStackSize=

设置该参数以设置栈容量,值越大,能容纳的栈深越深。

默认值取决于平台:

  • Linux/ARM (32-bit): 320 KB
  • Linux/i386 (32-bit): 320 KB
  • Linux/x64 (64-bit): 1024 KB
  • macOS (64-bit): 1024 KB
  • Oracle Solaris/i386 (32-bit): 320 KB
  • Oracle Solaris/x64 (64-bit): 1024 KB
  • Windows: 默认值取决于物理内存大小

-XX:MetaspaceSize= | -XX:MaxMetaspaceSize= ——-XX:PermSize= | -XX:MaxPermSize=

metaspace用于元空间,perm永久代。jdk8前,perm参数用于限制永久代的大小,jdk8之后,永久代被元空间提代,metaspace参数用于限制元空间大小。

  • -XX:PermSize | -XX:MaxPermSize:分别设置永久代的初始大小和最大大小。
  • -XX:MetaspaceSize | -XX:MaxMetaspaceSize:分别设置元空间的初始大小和最大大小。
  • 永久代与元空间一样,当metadata使用超过当前空间大小时,均会产生一次gc,其默认值都取决于系统平台。




五、内存分配策略

-XX:FieldsAllocationStyle=

该参数已在JDK14被遗弃。可以参考Deprecate -XX:FieldsAllocationStyle product option

对象内存结构中的实例数据的存储顺序,会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。
相同宽度的字段总是被分配到一起存放,在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。该参数有三个选项:
0:oops、longs/doubles、ints、shorts/chars、bytes/booleans
1:HotSpot虚拟机的默认分配顺序,longs/doubles、ints、shorts/chars、bytes/booleans、oops
2:将父类和子类的oops放在一起


-XX:+/-CompactFields

启用或关闭的效果并不明显,该参数已在JDK14被遗弃。可以参考Deprecate product flag -XX:CompactFields

默认启用,启用时,将允许子类之中较窄的变量插入父类变量的空隙之中,以节省出一点点空间。


-XX:+/-UseTLAB

在为对象分配内存时,线程会在可用内存区域为这个对象分配一块内存。这时会产生一个问题,那就是对象创建是一个很频繁的操作,在并发情况下,那么内存的分配就变得不是那么安全了,默认情况下,虚拟机会采用CAS的方式保证并发操作的安全性。UseTLAB实际上提供了另一种方案,即为每一个线程单独分配一块内存,每个线程使用该内存来分配对象,当该内存使用完后,才会使用CAS来为线程分配一块新的私有内存。

默认启用,启用时将为每个线程在Java堆的新生代中预先分配一小块内存,这一块内存称为本地线程分配缓冲(thread-local allocation blocks,TLABs)使用该内存可以保证并发分配内存时的安全性和并发性。


-XX:MinHeapFreeRatio= | -XX:MaxHeapFreeRatio=

这里可以参考:4 Factors Affecting Garbage Collection Performance

  • -XX:MinHeapFreeRatio:设置堆在GC后的最小空闲百分比,默认40。GC后,如果堆的空闲空间百分比低于40%,那么将扩展以保持40%的空闲空间,直到允许的最大堆大小。
  • -XX:MaxHeapFreeRatio:设置堆在GC后的最大空闲百分比,默认70。GC后,如果空闲空间超过70%,那么根据堆的最小大小,生成的代将收缩,以便只有70%的空间是空闲的。
  • 这两者的作用就是将空闲空间限制在一定范围内,保证下限避免创建对象时频繁的进行堆空间扩容,保证上限避免大量空间被无效占用。
  • 两者计算百分比的空间是根据-Xms和-Xmx参数来计算的,即:堆空闲空间 / 当前堆的总空间;其中 当前堆的总空间(由于GC后会扩容或者收缩,导致这个空间总是变动的;当然-Xms和-Xmx值相同时,这个总空间则不变) 其下限为-Xms的值,上限为-Xmx的值。





六、内存分析

这部分参数,除非特殊说明都是默认关闭的。它们都可以在运行时启动,使用前文提到的命令行工具:jinfo -flag

-XX:+/-HeapDumpOnOutOfMemoryError

虚拟机出现内存溢出异常时,自动Dump出当前的内存堆转储快照,用于事后分析。一般用于分析事故机,正常的生产环境中打开此项容易造成系统处理业务变慢。


-XX:+/-TraceClassLoading

查看类型加载信息,启用该配置,就可以在打印的日志中看到哪些类被JVM加载。

[Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar]
[Loaded java.lang.String from C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar]

-XX:+/-TraceClassUnloading

查看类型卸载信息,在类型被JVM卸载时,打印被卸载的信息。


-Xloggc:filename & -XX:+/-PrintGC等GC日志打印相关参数

-Xloggc:filename:通过-Xloggc指定具体文件来收集所有的gc日志,这个参数与**-verbose:gc**的输出日志类似,同时使用时,-Xloggc将会覆盖-verbose:gc。

此外,如果需要更多GC日志,可以通过具体的GC日志参数来控制。

-Xloggc日志内容如下:

Java HotSpot(TM) 64-Bit Server VM (25.171-b11) for windows-amd64 JRE (1.8.0_171-b11), built on Mar 28 2018 16:06:12 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 16119108k(7787392k free), swap 34862400k(22884524k free)
CommandLine flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:InitialHeapSize=52428800 -XX:+ManagementServer -XX:MaxHeapSize=52428800 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 
0.408: [GC (Allocation Failure)  12800K->1872K(49152K), 0.0016370 secs]
0.540: [GC (Allocation Failure)  14672K->3393K(49152K), 0.0024662 secs]
0.676: [GC (Allocation Failure)  16193K->5145K(49152K), 0.0028768 secs]

可以看到启用-Xloggc后,它默认打开了-XX:+PrintGC -XX:+PrintGCTimeStamps这两个选择。事实上-Xloggc只有记录gc日志到文件的能力,具体要记录什么都是通过这些GC日志参数而定的。


GC日志参数(以下参数都默认关闭):

  • -XX:+PrintGC:打印GC摘要数据。
  • -XX:+PrintGCApplicationConcurrentTime:允许打印自上次暂停(例如,GC暂停)以来经过了多长时间。
  • -XX:+PrintGCApplicationStoppedTime:允许打印暂停(例如,GC暂停)持续了多长时间。
  • -XX:+PrintGCDateStamps:允许在每次GC时打印日期时间戳。
  • -XX:+PrintGCDetails:允许在每次GC时打印详细消息。
  • -XX:+PrintGCTaskTimeStamps:允许为每个GC工作线程任务打印时间戳。
  • -XX:+PrintGCTimeStamps:记录打印日志的时间,该时间为虚拟机启动到目前为止的总时长。





参考

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明
java
java 8 doc
javase doc
Java HotSpot VM
memorymanagement
Java Virtual Machine Technology
Java HotSpot Equivalents of Exact VM Flags
Java Platform, Standard Edition Documentation
4 Factors Affecting Garbage Collection Performance
Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pyinstaller打包遇到的问题

1、ModuleNotFoundError: No module named ‘scipy.spatial.transform_rotaion_groups’ 解决办法&#xff1a;–hidden-import scipy.spatial.transform._rotation_groups 2、FileNotFoundError:[Errno 2] No such file or directory:‘C:\Users\Gw0021\AppData\Local\Temp\_M…

leaflet 选择一个marker,点击后设置其为中心点(070)

第070个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中引用geojson文件,显示marker,点击某个marker后,设置其为中心点,并panTo到中心点。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共81行)相…

【数据库】MySQL 索引视图详解

目录 MySQL索引视图 视图 一&#xff0c;什么是视图 二&#xff0c;为什么需要视图 三&#xff0c;视图的作用和优点 四&#xff0c;创建视图 案例&#xff1a; 五&#xff0c;视图使用规则 六&#xff0c; 修改视图 1&#xff0c;修改列名 2&#xff0c;创建复杂视图…

把盏言欢,款款而谈,当WorkPlus接入了ChatGPT机器人

ChatGPT到底有多火&#xff1f; “谷歌AI聊天机器人出错&#xff0c;市值一夜蒸发7172亿”&#xff1b;“百度类ChatGPT项目‘文心一言’或将直接接入百度搜索”&#xff1b;“阿里确认正研发类ChatGPT产品&#xff0c;目前处于内测阶段”&#xff1b;“网易有道将推出教育场景…

电脑技巧:分享六个小众且非常实用的工具

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️荣誉&#xff1a; CSDN博客专家、数据库优质创作者&#x1f3c6;&…

黑马】后台管理-路由懒加载

当打包构建项目时&#xff0c; JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问的时候才加载对应组件&#xff0c;这样就更加高效了。具体需要 3 步&#xff1a;① 安装 babel/plugin-synt…

【Big Data】Hadoop--MapReduce经典题型实战(单词统计+成绩排序+文档倒插序列)

&#x1f34a;本文使用了3个经典案例进行MapReduce实战 &#x1f34a;参考官方源码&#xff0c;代码风格较优雅 &#x1f34a;解析详细 一、Introduction MapReduce是一个分布式运算程序的编程框架&#xff0c;核心功能是将用户写的业务逻辑代码和自身默认代码整合成一个完整的…

震源机制沙滩球(focal mechanism beach ball)绘制之傻瓜式教程

目录 1. 断层的定义 2. 绘制流程 3. 更多示例 沙滩球的含义可阅读&#xff1a;震源机制(Focal Mechanisms)之沙滩球(Beach Ball)_ddd...e_bug的博客-CSDN博客 1. 断层的定义&#xff08;&#xff09; 走向&#xff08;strike&#xff09;&#xff1a;正北方顺时针旋转到走向…

第五十四章 DFS进阶(二)——迭代加深

第五十四章 DFS进阶&#xff08;二&#xff09;——迭代加深一、DFS的缺陷二、迭代加深1、什么是迭代加深2、复杂度分析3、算法步骤三、例题1、问题2、分析3、代码一、DFS的缺陷 我们知道DFS是一条路走到黑&#xff0c;直到将整条路走完以后才会回头。 这就导致了一个问题&am…

dynamic-Echonet左心室语义分割——学习记录

1简单介绍 1.1 论文简介 论文地址Video-based AI for beat-to-beat assessment of cardiac function 数据集地址&#xff1a;here获取好像还挺麻烦的。需要在网站上填写并申请数据集&#xff0c;斯坦福那边会发邮件并拉入一个box组&#xff0c;就可以访问公开的超声心动数据集…

图解LeetCode——剑指 Offer 26. 树的子结构

一、题目 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即&#xff1a;A中有出现和B相同的结构和节点值。 二、示例 2.1> 示例 1&#xff1a; 【输入】A [1,2,3], B [3,1] 【输出】false 2.2> 示…

数字化转型的成功模版,珠宝龙头曼卡龙做对了什么?

2月11日&#xff0c;曼卡龙&#xff08;300945.SZ&#xff09;发布2022年业绩快报&#xff0c;报告期内&#xff0c;公司实现营业收入16.11亿元&#xff0c;同比增长28.63%。来源&#xff1a;曼卡龙2022年度业绩快报曼卡龙能在2022年实现营收增长尤为不易。2022年受疫情影响&am…

c语言操作文件

1、文件缓冲区 文件缓冲区的目的&#xff1a;提高访问效率 提高磁盘使用寿命 刷新就是将当前缓冲区数据全部提交。 不刷新时&#xff0c;程序在崩溃时缓冲区内容无法输出&#xff08;有些情形会带来错误&#xff09; 文件缓冲区的四种刷新方式 行刷新&#xff08;遇到换行符…

CSS3新增属性( 过渡、变形和动画)

文章目录一、过渡1、transition-property2、transition-duration3、transition-timing-function4、transition-delay二、变形1、transform2、2D变形2.1、平移&#xff08;translate&#xff09;2.2、缩放&#xff08;scale&#xff09;2.3、倾斜&#xff08;shew&#xff09;2.…

【记录】smartctl|Linux如何通过smartctl查看有没有坏的磁盘?以及使用时长、电源周期、故障记录等

smartctl是一个用于监测和分析硬盘健康状态的工具&#xff0c;可以用于检测是否存在坏的磁盘。以下是使用smartctl检查磁盘健康状态的步骤&#xff1a; 安装smartctl软件 在Linux系统中&#xff0c;smartctl通常包含在smartmontools软件包中。如果您还没有安装smartmontools&am…

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之间的关系

Kubernetes中Pod、Namespace、Label、Deployment、Service之间的关系Pod、Namespace、Label、Deployment、Service之间的关系NamespacePod1. 创建一个namespace并运行一个pod2. 查看pod3. 删除pod4. 删除pod控制器Label1. 创建yaml文件&#xff08;nginx-pod.yaml&#xff09;2…

【数据结构与算法】二分查找 移除元素

今日任务 数组理论基础 704.二分查找 27.移除元素 1.数组理论基础 &#xff08;1&#xff09;数组是存放在连续内存空间上的相同类型数据的集合。 注意&#xff1a; 数组下标都是从0开始的数组内存空间的地址是连续的 &#xff08;2&#xff09;正因为数组在内存空间的…

【C语言】字符串处理函数及典例(2)

接上&#xff1a;【C语言】字符串处理函数及典例&#xff08;1&#xff09; 之前在&#xff08;1&#xff09;中讨论的函数如strcpy&#xff0c;strcmp&#xff0c;strcat &#xff0c;都是长度不受限制函数&#xff0c;即不管参数的大小&#xff0c;关键点都是找到 \0 &…

ChatGPT爆火出圈,高质量文本标注数据成关键

“2022年11月30日&#xff0c;OpenAI发布了ChatGPT——一个对话式AI&#xff0c;上线仅五天&#xff0c;注册用户数突破100万&#xff0c;爆火出圈&#xff0c;成为社会热议话题。截止今年1月末&#xff0c;ChatGPT的月活用户数量破亿&#xff0c;成为史上用户数增长最快的消费…

Java字节流

4 字节流 字节流抽象基类 InputStream&#xff1a;这个抽象类是表示字节输入流的所有类的超类OutputStream&#xff1a;这个抽象类是表示字节输出流的所有类的超类子类名特点&#xff1a;子类名称都是以其父类名作为子类名的后缀 4.1 IO流概述和分类 IO流概述&#xff1a; …