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

lt;JVM调优gt;为什么内存过大?

首先推荐一本书《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》,应该多读几遍。

然后分享一些这段时间我查看的一些资料 :

深入理解JVM之自动内存管理

Linux与JVM的内存关系分析

GC 优化的一些总结

关键业务系统的JVM参数推荐(2016热冬版)

另外因为JVM8的内存模型发生了变化,移除了永久代添了metaSpace 。也查看了这些方面相关的文章。推荐你假笨这篇文章JVM源码分析之Metaspace解密

有了上述相关的知识储备就开始分析 门店宝Service 内存占用过大的问题。

命令 :

jps -l

显示所有的 Java 进程ID 以及启动类,通过启动类可以可容易的看出 Service 的PID 是 7600。JDK的大部分命令都需要使用到PID这个参数,用于界定所需要显示的数据到底来源于哪个进程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xwaKnX4M-1661989353399)(http://wiki.hualala.com/download/attachments/2805016/image2016-12-7%2017%3A2%3A16.png?version=1&modificationDate=1481063656026&api=v2 “李 辰辰 > 2016/12/06 > JVM调优的一些知识 > image2016-12-7 17:2:16.png”)]

jstat -gc

Jstat 命令用于查看堆内存各部分的使用情况,命令的参数很多,具体可以参考这篇文章Jstat命令使用。

-gc 参数用于查看Java内存分布以及GC信息。

下面的图是在生成上获取的门店宝Service内存和GC信息。

字段名称意义如下:

S0C — Heap上的 Survivor space 0 区分配的大小
S0U — Heap上的 Survivor space 0 区已使用的大小

其他的类似,
E — Heap上的 Eden space 区
O — Heap上的 Old space 区
M — meta space 区

CCS ——压缩类

YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

第二个图是在第一个图三天后的数据 , 新生代的内存使用是没问题的,old generation 的内存使用量很低但是也不至于影响使用,不过在以后我们可以对这两块的内存进行相应的调节。

另外一个很明显的问题就是GC发生的频率是非常低的。首先就是线上的数据太少,其次也是因为目前在门店宝Service上我们并没有对JVM参数做任何修改,所以默认的JVM的内存将会自我扩展,直至利用到系统所有的内存信息,所以这也就产生了随着系统运行时间变长,服务占用的内存越来越大的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X4e4PrZg-1661989353400)(http://wiki.hualala.com/download/attachments/2805016/image2016-12-8%2015%3A6%3A59.png?version=1&modificationDate=1481134042537&api=v2 “李 辰辰 > 2016/12/06 > JVM调优的一些知识 > image2016-12-8 15:6:59.png”)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRSyit58-1661989353400)(http://wiki.hualala.com/download/attachments/2805016/image2016-12-8%2015%3A7%3A18.png?version=1&modificationDate=1481134061224&api=v2 “李 辰辰 > 2016/12/06 > JVM调优的一些知识 > image2016-12-8 15:7:18.png”)]

jmap -dump:format=b,file=文件名 [pid]

dump当前系统,根据dump文件我们可以分析当前系统中存在的内存问题。

分析dump文件的工具很多,JDK自带的Jhat,Eclipse也有相关的插件。

我使用的是Eclipse Memory Analyzer,功能很强大,能够生成各种报表,另外可以在不同的时间生成不同的dump,然后通过工具分析两个dump的内存变化。

我仅仅使用了其中一个功能,查看dominator_tree,就是一个内存分配的树形结构。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5HyWHeD6-1661989353401)(http://wiki.hualala.com/download/attachments/2805016/image2016-12-7%2020%3A0%3A51.png?version=1&modificationDate=1481065271915&api=v2 “李 辰辰 > 2016/12/06 > JVM调优的一些知识 > image2016-12-7 20:0:51.png”)]

很明显的就可以发现GRPC生成的类消耗了大量的内存。

因为在门店宝Service中,我们将方法和Bean都写在一个proto文件内,而且一个服务里写了很多的请求,这就导致了grpc生成的类很大。但是实际上我们这是只用了其中一个内部类,所以这样产生了不少无意义的内存使用。如果看完了上面的文章也可以发现,JVM 的GC对 存活时间短,但是内存占用大的类是很不友好的。所以以后尽量使用小方法,小类,这样对于系统性能的提升还是比较明显的。

图形化工具 :

相比较命令,图形化的工具使用起来更直观。

推荐两个JDK自带的工具jvisualvm 和的JMC。不过理论上JMC是不能用于商业途径的。

jvisualvm有一些功能强大的插件,比如直接查看GC情况,自动执行Btrace脚本等等。

工具点开即用,使用方法十分简单,但是涉及到具体问题分析的时候,等到以后有机会学习到了,再和各位分享。

图形工具很厉害的一点在于我们可以远程事实的监测环境的JVM运行情况,不过鉴于我们现在使用到了docker,远程使用Visual VM或者 JMC相对麻烦一些。一下的两篇文章可以作为远程链接的参考。

How to connect VisualVM to Docker

How do I attach VisualVM to a simple Java process running in a Docker container

)

相关文章:

  • InputMismatchException异常
  • 定时器及案例
  • 代谢组学研究的十大误区——误区十
  • 微服务项目:尚融宝(8)(后端接口:积分等级CRUD)
  • 《用Go语言自制解释器》之第4章 扩展解释器
  • SQL每日一练(牛客新题库)——第9天:检索数据
  • JQuery系列之事件切换
  • 【第5天】SQL快速入门-必会的常用函数(SQL 小虚竹)
  • Java日志系列——概述,JUL
  • 猿创征文 |简单入门 redis6【基础命令】
  • L2-008 最长对称子串/【力扣5】 最长回文子串
  • 【Lua 入门基础篇(八)】元表
  • 创新案例分享 | 建设医院绩效管理系统,促进医院健康良性发展
  • 检查或复位状态[ feof()函数、ferror()函数和clearerr()函数 ]
  • GOLANG SLICE 切片扩容
  • 【5+】跨webview多页面 触发事件(二)
  • canvas 绘制双线技巧
  • flutter的key在widget list的作用以及必要性
  • github从入门到放弃(1)
  • gulp 教程
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • spark本地环境的搭建到运行第一个spark程序
  • Spring核心 Bean的高级装配
  • text-decoration与color属性
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聚簇索引和非聚簇索引
  • 前言-如何学习区块链
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用API自动生成工具优化前端工作流
  • 优化 Vue 项目编译文件大小
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 数据库巡检项
  • ​flutter 代码混淆
  • #Z2294. 打印树的直径
  • #微信小程序:微信小程序常见的配置传值
  • (1)(1.9) MSP (version 4.2)
  • (1)Android开发优化---------UI优化
  • (10)STL算法之搜索(二) 二分查找
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)SpringBoot3---尚硅谷总结
  • *p++,*(p++),*++p,(*p)++区别?
  • *上位机的定义
  • .naturalWidth 和naturalHeight属性,
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 设置默认首页
  • .NET建议使用的大小写命名原则
  • .net快速开发框架源码分享
  • .NET中 MVC 工厂模式浅析