浅谈Metaspace内存溢出原因及JVM参数设置
浅谈Metaspace内存溢出原因及JVM参数设置
1.Metaspace内存溢出(oom)
日志
原因分析
从Java8开始,Java中的内存模型引入了一个称为元空间(Metaspace)的新内存区域,并删除了Permgen。一般如 类的名称和字段、带有方法字节码的类的方法、常量池、访问限制等都会存在于元空间中。
metaspace空间增长大部分是由于反射类加载、动态代理生成的类加载等导致,也就是说Metaspace的大小和加载类的数据有关系,加载的类越多metaspace占用的内存也就越大那么引起Metaspace内存溢出就可以从以上几种数据源头进行分析。
常见的溢出情况:
- 迭代引入监控、分析类过多。比如项目上线时,经过评估设置MaxMetaspaceSize为128M,后续由于添加了各类监控、分析等功能,项目启动即接近了128M,后续自然会导致空间不足。
- 某个业务场景的访问量暴增,导致Metaspace内存溢出。
- JVM参数配置错误。这个就藏的有点深了,首先要判断反射对象是否被SoftReference软引用修饰的,如果是,则需要查看XX:SoftRefLRUPolicyMSPerMB的参数配置。SoftRefLRUPolicyMSPerMB参数大概意思是每1M空闲空间可保持的SoftReference对象的生存时长(单位是ms毫秒),JVM默认是1000ms,如果被设置为0,就会导致软引用对象马上被回收掉,进而会导致频繁的反射生成新的类,达不到复用的效果,而导致Metaspace激增。
- 类加载器泄漏。这个更头疼。首先要对堆转储的Dump文件进行分析,堆应该在至少一个ClassLoader实例泄漏后转储生成dump文件,这样才可以分析泄漏实例的引用,从而防止它被垃圾收集。可以添加-XX:+HeapDumpOnOutOfMemoryError JVM参数,然后运行并重新部署应用程序,直到它崩溃java.lang.OutOfMemoryError错误,崩溃前会自动生成堆转储dump文件。文件名类似于java_pid18148.hprof,.hprof文件位于应用程序服务器的启动目录中,也可以通过-XX:HeapDumpPath=/directory参数指定目录。解析.hprof文件最好使用工具吧,每个工具使用都不一样,最终通过查找引用并找到不需要的引用,可以找到导致泄漏的原因,从而防止类装入器被垃圾收集。此引用可能在业务代码、第三方库、应用程序服务器或JVM中。
解决方案
正常情况下的解决方案也很简单:
- 如果应用程序耗尽内存中的元空间区域,评估后重新加大元空间的配置即可。如将128M改为256M。
- 还可以删除MaxMetaspaceSizes配置参数,完全取消对元空间大小的限制,但这个不解决根本问题,只是临时取消了OOM的出现,留出一定的时间来检查和定位问题。
- 如果是-XX:SoftRefLRUPolicyMSPerMB导致的,则将其设为1000(1s)即可。
工具
- Arthas诊断工具(Java在线诊断利器之Arthas)
- 原始的 jmap和jhat
- MAT(内存分析器工具)
2.JVM参数设置
JVM各参数值大小的设置,根据应用程序的内存大小进行比例设置,针对个别具体的值,可微调,也可默认。
堆设置
-Xms 初始堆大小
-Xmx 最大堆大小
-Xmn 年轻代大小
-Xss 每个线程的堆栈大小
-XX:NewRatio=n 年轻代和年老代的比值。
-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值。
-XX:MaxPermSize=n 持久代大小
-XX:MaxTenuringThreshold=0 垃圾最大年龄
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
收集器设置
-XX:+UseSerialGC 串行收集器
-XX:+UseParallelGC 并行收集器
-XX:ParallelGCThreads 并行收集器收集时使用的CPU数。并行收集线程数
-XX:+UseParalledlOldGC 并行年老代收集器
-XX:MaxGCPauseMillis 每次年轻代垃圾回收的最长时间
-XX:+UseAdaptiveSizePolicy 并行收集器调优
-XX:+UseConcMarkSweepGC 年老代为并发收集,与-XX:NewRatio不同时设置
-XX:+UseParNewGC 年轻代为并行收集,JVM自行设置,无需配置。
-XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100-XX:+UseAdaptiveSizePolicys -XX:+UseConcMarkSweepGC
垃圾回收统计信息
命令行参数,一些打印信息,调试时使用
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
浅谈Metaspace内存溢出原因及JVM参数设置相关推荐
- 浅谈java内存分配和回收策略
一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配 ...
- 浅谈主流内存发展历史
浅谈主流内存发展历史 申屠志刚2018329621200 信息学院 计算机科学与技术18(3) 摘 要:计算机必然包含运算器.控制器.存储器和输入输出设备等五个重要部分,其中作为内存储器的内存条在PC ...
- JVM内存溢出分析-实战JVM(二)
为什么80%的码农都做不了架构师?>>> JVM规范规定,除了程序计数器,虚拟机其他内存区域均会发生内存溢出的可能,OutOfMemoryError(OOM) 原文地址:htt ...
- Flink批处理metaspace内存溢出问题
问题 早上过来发现定时任务出现告警,Flink Jobs运行失败,登录Flinkweb后台一看,所有jobs都没了,slot也为0. 查看Flink日志,有以下错误异常: 2022-12-07 08: ...
- java方法区对象类型_浅谈Java内存区域与对象创建过程
一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...
- jmeter(二十二)内存溢出原因及解决方法
jmeter(二十二)内存溢出原因及解决方法 参考文章: (1)jmeter(二十二)内存溢出原因及解决方法 (2)https://www.cnblogs.com/imyalost/p/7901064 ...
- android 存储空间监控,浅谈 Android 内存监控(中)
前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...
- 浅谈Java内存模型、并发、多线程
浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...
- 浅谈iPhone和iPad开发中的图标设置
浅谈iPhone和iPad开发中的图标设置 图标大小问题 我们的辛辛苦苦做出来的应用程序在iPhone上的表示仅仅是一个图标,对这个图标不可以不谨慎对待,不能因为大小不对头这些小问题而失真啊什么的. ...
最新文章
- [原创]关于javax.servlet.ServletException: File [/loginController/getVerifCode.jsp] not found异常 解决方案
- CCNA学习笔记--静态路由
- Oracle:管理 date类型 interval 动态变化的分区:查询、删除
- input高级限制级用法
- Python---利用蒙特.卡罗方法计算圆周率近似值
- java 注解 方法 参数_java在注解中绑定方法参数的解决方案
- 数字证书注册审批机构(RA)
- 打车软件是不是一个市场泡沫?
- oracle sql详细教程下载,Oracle SQL 实用基础教程 PPT
- ezcad旋转轴标刻参数_激光打标机软件ezcad中地球仪标刻使用方法教程详解
- 探索另类圆环图的做法
- [读书笔记]金融市场基础笔记
- 任务3 非接触红外测温MLX90614(arduino程序)
- Python如何使用Continue语句?用法示例
- 文献阅读笔记 | Reconstructing commuters network using machine learning and urban indicators
- 使用PowerPhotos for Mac查找重复项似乎缺少一些重复的照片的解决办法
- Adobe是什么软件?
- 用html做完整网页效果
- PAT 乙级真题 1032 挖掘机技术哪家强 (附测试点2)
- numpy python取表格的前几行前几列 某行某列