JVM-GC日志

这篇具有很好参考价值的文章主要介绍了JVM-GC日志。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先提出问题?为什么有时候发现 内存用了很多了,但是没有被回收。手动触发GC后,才回收了很多内存。

JVM设置如下参数:

1. 堆设置2g

2. 新生代设置1g,那么老年代自然也是1g

3. 设置打印GC信息,并输出到 gc.log 文件

-Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/gc.log

堆信息如下:

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 1073741824 (1024.0MB)
   MaxNewSize               = 1073741824 (1024.0MB)
   OldSize                  = 1073741824 (1024.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB) 

应用启动后gc日志:

CommandLine flags: -XX:InitialHeapSize=2147483648 -XX:MaxHeapSize=2147483648 -XX:MaxNewSize=1073741824 -XX:NewSize=1073741824 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
2023-06-21T14:27:22.324+0800: 1.914: [GC (Metadata GC Threshold) [PSYoungGen: 534779K->13945K(917504K)] 534779K->14033K(1966080K), 0.0344142 secs] [Times: user=0.08 sys=0.00, real=0.04 secs] 
2023-06-21T14:27:22.359+0800: 1.948: [Full GC (Metadata GC Threshold) [PSYoungGen: 13945K->0K(917504K)] [ParOldGen: 88K->13799K(1048576K)] 14033K->13799K(1966080K), [Metaspace: 20532K->20532K(1067008K)], 0.0357165 secs] [Times: user=0.21 sys=0.02, real=0.03 secs] 
2023-06-21T14:27:24.014+0800: 3.603: [GC (Metadata GC Threshold) [PSYoungGen: 690461K->27760K(917504K)] 704261K->41567K(1966080K), 0.0691493 secs] [Times: user=0.21 sys=0.01, real=0.07 secs] 
2023-06-21T14:27:24.083+0800: 3.673: [Full GC (Metadata GC Threshold) [PSYoungGen: 27760K->0K(917504K)] [ParOldGen: 13807K->33241K(1048576K)] 41567K->33241K(1966080K), [Metaspace: 34133K->34133K(1079296K)], 0.0660470 secs] [Times: user=0.46 sys=0.01, real=0.07 secs] 
2023-06-21T14:27:27.152+0800: 6.741: [GC (Allocation Failure) [PSYoungGen: 786432K->27067K(917504K)] 819673K->60317K(1966080K), 0.0530390 secs] [Times: user=0.11 sys=0.01, real=0.05 secs] 
2023-06-21T14:27:33.056+0800: 12.645: [GC (Metadata GC Threshold) [PSYoungGen: 114700K->12304K(917504K)] 147949K->45561K(1966080K), 0.0118059 secs] [Times: user=0.04 sys=0.00, real=0.02 secs] 
2023-06-21T14:27:33.068+0800: 12.658: [Full GC (Metadata GC Threshold) [PSYoungGen: 12304K->0K(917504K)] [ParOldGen: 33257K->21336K(1048576K)] 45561K->21336K(1966080K), [Metaspace: 56024K->56024K(1101824K)], 0.1189569 secs] [Times: user=0.54 sys=0.02, real=0.12 secs] 
2023-06-21T14:28:10.725+0800: 50.314: [GC (Allocation Failure) [PSYoungGen: 786432K->5783K(917504K)] 807768K->27128K(1966080K), 0.0070404 secs] [Times: user=0.01 sys=0.01, real=0.01 secs] 

 一般gc日志格式如下:

GC|Full GC (原因) [年轻代:回收前->回收后(空间总大小)]  [老年代:回收前->回收后(空间总大小)]  回收前 -> 回收后(堆空间大小) [其他空间]耗时 

每个空间用 [] 扩起来,不同空间用 ,分割

第一行:因为 Metadata GC Threshold 引发的GC,年轻代 空间进行了GC

第二行:因为 Metadata GC Threshold 引发的 Full GC,年轻代、老年代、元空间 都进行GC

发现总共进行了3次Full GC,元空间 再变大。

由于JVM 元空间默认值21M,所以 配置 -XX:MetaspaceSize=128m,再此启动应用:

2023-06-21T15:18:18.336+0800: 2.364: [GC (Allocation Failure) [PSYoungGen: 786432K->19872K(917504K)] 786432K->19960K(1966080K), 0.0583594 secs] [Times: user=0.14 sys=0.01, real=0.06 secs] 
2023-06-21T15:18:21.316+0800: 5.344: [GC (Allocation Failure) [PSYoungGen: 806304K->43337K(917504K)] 806392K->43457K(1966080K), 0.1278580 secs] [Times: user=0.70 sys=0.04, real=0.13 secs] 

没有Full GC了,原来是因为 元空间太小,触发了 Full GC。

通过GC日志,可以看出来,每次GC 后面括号里都有原因,像 Allocation Failure。这就是 GC的触发原因,当分配空间失败,也就是 当前内存不足了,就会触发GC。那么 当 内存空间足够分配新对象,即使之前的 对象已经die了,也不随便GC。文章来源地址https://www.toymoban.com/news/detail-497347.html

到了这里,关于JVM-GC日志的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM执行引擎——为什么Java是半编译半解释语言

            起初设计者的初衷是将字节码文件翻译为机器语言的指令来执行即可,就诞生了解释器。但是采用一行行来解释的 效率比较低 ,JIT编译器会将编译后的机器码做一个缓存的操作,放在方法区的JIT代码缓存中,是否需要启用JIT编译器直接将字节码编译为机器码,则

    2024年02月15日
    浏览(49)
  • 为什么SQL日志文件很大,该如何处理?

    SQL Server 日志文件是记录所有数据库事务和修改的事务日志文件。用 SQL 术语来说,此日志文件记录对数据库执行的所有 INSERT 、 UPDATE 和 DELETE查询操作。 如果数据库联机或恢复时日志已满,SQL Server 通常会发出 9002 错误。在这种情况下,数据库只能读取而不能更新。此篇文章

    2024年02月06日
    浏览(65)
  • JVM 配置GC日志

    开启GC日志 多种方法都能开启GC的日志功能,其中包括:使用-verbose:gc或-XX:+PrintGC这两个标志中的任意一个能创建基本的GC日志 (这两个日志标志实际上互为别名,默认情况下的GC日志功能是关闭的) 使用-XX:+PrintGCDetails标志会创建更详细的GC日志 推荐使用-XX:+PrintGCDetails标志(

    2024年02月15日
    浏览(46)
  • java的springboot框架中使用logback日志框架使用RabbitHandler注解为什么获取不到消费的traceId信息?

    当使用 Logback 日志框架和 RabbitMQ 的 @RabbitHandler 注解时,如果无法获取消费的 traceId 信息,可能是因为在处理 RabbitMQ 消息时,没有正确地将 traceId 传递到日志中。 为了将 traceId 传递到日志中,你可以利用 MDC(Mapped Diagnostic Context)机制。MDC 是一个线程绑定的上下文容器,允许

    2024年02月09日
    浏览(44)
  • 为什么现在原生家庭的问题这么严重?

    匿名用户 191 人赞同了该回答 换一个玄学的角度来看这个问题,之前看b站,有一个up主说,中国有历史记载的人口数一直都很稳定,7-8千万到1亿左右,明朝2亿,清朝到民国算是增长比较多的,有4亿,但是从开国到现在增长了10亿,从轮回的角度来讲,哪来那么多的人来转世

    2024年02月13日
    浏览(63)
  • “为什么是三次握手”与“为什么是三次握手,却是四次挥手”其实是不同的问题

    “为什么是三次握手?” 这个问题言下之意其实在问:“为什么不是0次、1次、2次、4次甚至更多次握手”。 确保双方的 发送能力 和 接收能力 都是好的 。 该回答下的一评论:其实很简单, 1.a-b, 这个时候没有任何状态, 2. b-a, b给a发东西, 说明收到了a的东西, 证明了a的

    2024年02月10日
    浏览(47)
  • 0-1背包问题思路分析,重点解释一维dp数组的01背包问题为什么要倒序遍历背包,以及为什么不能先遍历背包,只能先遍历物品

    对0-1背包问题的二维dp数组以及一维dp数组的思路分析 来源:代码随想录 link 本文是我对01背包问题的理解 ,在本文中具体分析dp数组的形成过程,最核心的地方就是我对每种情况下的01背包问题给出了代码运行结果,便于读者理解。 重点解释了为什么一维dp数组的01背包问题

    2024年02月03日
    浏览(86)
  • 两级同步为什么能解决亚稳态问题?

    前言 不知道大家有没有一个疑惑,为什么两级同步电路结构能够解决亚稳态问题,之前一直疑惑的地方在于,当第一级DFF发生亚稳态时,他的输出呈现不确定性,会出现0或者1任意一个值。若输入是1,第一级DFF亚稳态之后稳定到了0,那么第二级采样的话不就错了吗?这个问

    2024年02月12日
    浏览(42)
  • Mybatis为什么需要预编译等一系列问题

    SQL 预编译是一种提高数据库访问效率的技术,它通过将 SQL 语句预编译并存储在数据库中,减少每次执行时需要进行解析和编译的开销,从而提高数据库访问的效率。 在预编译阶段,SQL 语句会被解析并转换为可执行的二进制代码,然后存储在数据库中。当需要执行该 SQL 语句

    2024年02月10日
    浏览(43)
  • 再谈StringBuilder为什么线程不安全以及带来的问题

    比较有意思的是,学习锁消除的过程中,有人讲到StringBuffer在方法内构建,不会被其他方法引用时,StringBuffer的锁会被消除, 于是,顺便看了一下同源的StringBuidler为什么线程不安全,以及为什么多线程不安全,和带来的问题, 有了这篇文章,分享出来,帮助读者轻松应对知

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包