当前位置: 首页 > news >正文

JVM 调优篇7 调优案例2-元空间的优化解决

一  元空间

1.1 功能概述

方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、即时编译器编译后的代码等数据。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

垃圾收集行为在这个区域是比较少出现的,其内存回收目标主要是针对常量池的回收和对类型的卸载。当方法区无法满足内存分配需求时,将抛出 OutOfMemoryError 异常。

二  案例实操优化

2.1 代码

2.2 参数设置

1.参数:

-XX:+PrintGCDetails -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=60m -Xss512K -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=e:/heapdumpMeta.hprof  -XX:SurvivorRatio=8 -Xms60M  -Xmx60M -Xloggc:e:/gc-oomMeta.log

2.3 启动

2.4 通过vm分析

2.4.1 实时查看

1.通过命令 jstat 查看堆变化:  设置的元空间60m,已经几乎用尽。

 查看堆内存变化

2.4.2 离线分析

读取dump文件

1.基本信息

2.oom信息

查看对象信息: 

1.运行期间生成了大量的代理类,导致方法区被撑爆,无法卸载

2. 应用长时间运行,没有重启

3. 元空间内存设置过小

2.4.3 优化解决

优化代码:将相同对象,就不再通过invoke,反射机制进行创建,放到缓存中。

查看结果

没有报oom异常,所以没有dump文件

查看堆动态变化:jstat -gc 4656 1000 5

查看vm

2.5 原因以及解决方案*

原因:

1.运行期间生成了大量的代理类,导致方法区被撑爆,无法卸载

2. 应用长时间运行,没有重启

3. 元空间内存设置过小

解决办法:

1. 检查是否永久代空间或者元空间设置的过小

2. 检查代码中是否存在大量的反射操作

3. dump之后通过mat检查是否存在大量由于反射生成的代理类


http://www.mrgr.cn/news/27249.html

相关文章:

  • 第十一章 【后端】商品分类管理微服务(11.1)——创建父工程
  • Android应用性能优化
  • Java Exception 异常相关总结
  • 音视频开发常见的开源项目汇总
  • uniapp中使用picker-view选择时间
  • Linux vi常用命令
  • JavaScript性能:使网站快速响应
  • LeetCode题练习与总结:基本计算器 Ⅱ--227
  • 语言的布尔类型
  • leetcode 难度【简单模式】标签【数据库】题型整理大全
  • OpenCV-Python笔记(上)
  • 中间件之RocketMQ
  • Python Logging 限制文件大小
  • 2024年汉字小达人区级自由报名备考冲刺:往年真题练一练
  • [数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别
  • 【洛谷】P2880 [USACO07JAN] Balanced Lineup G 的题解
  • C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(3)
  • JVM 调优篇7 调优案例1-堆空间的优化解决
  • 打印自身的程序
  • 光伏选址和设计离不开气象分析!