springboot jar启动的服务宕机了!——记一次JVM调优

测试突然告诉我,请求报404,我一想,没关服务啊?

上服务器一看,服务挂了,生成了两个没见过的文件
在这里插入图片描述
看到文件名,猜测两个都是错误信息的相关文件,一个是日志,另一个文件比较大,应该是数据相关的

具体的日志文件各项参数释义,我参考了这篇博客:

https://blog.csdn.net/chenssy/article/details/78271744

日志头部分

#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1349616 bytes for Chunk::new
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (allocation.cpp:390), pid=14884, tid=20960
#
# JRE version: Java(TM) SE Runtime Environment (8.0_77-b03) (build 1.8.0_77-b03)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.77-b03 mixed mode windows-amd64 compressed oops)
# Core dump written. Default location: D:\****\start\hs_err_pid14884.mdmp
#

日志的开始部分介绍了本次jvm宕机的原因,以及一些可行的建议
这里面就是 关于启动堆栈,ReservedCodeCacheSize,java线程,等等的一些建议
当然具体的还要在往下看,找出真正的原因

--------------- T H R E A D ---------------

该部分是记录了导致出错的线程信息

---------------  T H R E A D  ---------------

Current thread (0x000000001c47b800):  JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=20960, stack(0x000000001dd70000,0x000000001de70000)]

Stack: [0x000000001dd70000,0x000000001de70000]
[error occurred during error reporting (printing stack bounds), id 0xc0000005]

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)


Current CompileTask:
C2:2329577 19219       4       com.fasterxml.jackson.databind.SerializerProvider::findValueSerializer (68 bytes)

堆栈及堆外内存

Heap:
 PSYoungGen      total 1352704K, used 1156756K [0x000000076ab00000, 0x00000007c0000000, 0x00000007c0000000) 
  eden space 1326080K, 87% used [0x000000076ab00000,0x00000007b14a51e8,0x00000007bba00000) 
  from space 26624K, 0% used [0x00000007bba00000,0x00000007bba00000,0x00000007bd400000)  
  to   space 38400K, 0% used [0x00000007bda80000,0x00000007bda80000,0x00000007c0000000)
 ParOldGen       total 271360K, used 80217K [0x00000006c0000000, 0x00000006d0900000, 0x000000076ab00000)
  object space 271360K, 29% used [0x00000006c0000000,0x00000006c4e56538,0x00000006d0900000)
 Metaspace       used 114910K, capacity 120592K, committed 120664K, reserved 1155072K
  class space    used 13233K, capacity 14164K, committed 14208K, reserved 1048576K

Card table byte_map: [0x0000000010b20000,0x0000000011330000] byte_map_base: 0x000000000d520000

Marking Bits: (ParMarkBitMap*) 0x000000006b8c0600
 Begin Bits: [0x00000000122d0000, 0x00000000162d0000)
 End Bits:   [0x00000000162d0000, 0x000000001a2d0000)

Polling page: 0x0000000000130000

CodeCache: size=245760Kb used=52260Kb max_used=52260Kb free=193499Kb
 bounds [0x0000000001760000, 0x0000000004ad0000, 0x0000000010760000]
 total_blobs=15776 nmethods=15028 adapters=657
 compilation: enabled

从上面的对信息中分析,能看出 Metaspace元空间提交内存大于使用内存

元空间Metaspace

这里补充下Metaspace元空间知识
参考链接:深入理解堆外内存Metaspace

从jdk7开始着手废除永久代PermGen,
jdk8工作完成,彻底用Metaspace代替了PermGen

Metaspace 区域位于堆外,所以它的最大内存大小取决于系统内存,而不是堆大小,我们可以指定 MaxMetaspaceSize 参数来限定它的最大内存。

参考链接:JVM学习——元空间(Metaspace)

为什么要用Metaspace替代方法区
随着动态类加载的情况越来越多,这块内存变得不太可控,如果设置小了,系统运行过程中就容易出现内存溢出,设置大了又浪费内存。

解决问题

从上面的元空间知识,可以得出猜测,本次的服务挂掉,是由于元空间内存占用过多,导致的宕机.

所以我们可以进行jvm启动参数设置,来避免这个问题.

-XX:MetaspaceSize=2048m 
-XX:MaxMetaspaceSize=2048m

详细参数可以参考:JVM启动参数参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qlanto

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值