JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌

摘要:
Java进程的内存使用量=JVM内存+Java堆的最大内存大小(Xmx)+Java堆外的内存大小+堆栈区域(线程数*X)。需要注意的最重要的一点是,您应该关闭服务器上的SWAP(在内存充足的情况下)。有关详细信息,请参阅我的其他https:

JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌第1张

 服务器的JAVA进程使用的内存是否正常

 服务器中,JAVA进程的内存占用= JVM内存+ JAVA堆最大内存大小(Xmx)+JAVA堆外内存大小+栈区( 线程数* Xss)

最需要关注:

1., 服务器内存是否够JAVA进程开销

坑点: 每次JAVA的启动,只是检查当前linux的RES内存, 并不会检查申请的内存大小。

如, 服务器内存16G ,JAVA进程A的最大堆内存10G, JAVA服务B最大堆内存也是10G, 两个服务都能正常运行,但一段时间后会被服务器kill掉

详情见我另一篇 https://my.oschina.net/u/867417/blog/817866 

2, 是否用到了服务器的SWAP

坑点:如果JAVA进程的垃圾回收用到了SWAP,将导致GC时间异常久,服务器上建议关掉SWAP(保证内存够用情况下)

详情见我另一篇 https://my.oschina.net/u/867417/blog/820626 

GC是否正常

在启动JAVA时,注意配置:

JAVA的垃圾回收日志及地址

-XX:+PrintGCDetails -Xloggc:/data/log/gclog/web_gc_log.txt

JAVA崩溃快照以及地址配置

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/dump/

关注GC频率是否正常 

GC 的回收频率和内存大小挂钩,一般正常情况下很少FGC。可以结合参数配置 GC垃圾回收日志分析

用 jstat -gc pid 观察FGC的次数

是否产生了FGC

上次FGC产生的原因 

 jstat  -gccause

FGC产生的原因:

堆外内存对象大小,回收是system.gc. 是否禁用(引起FGC) 
堆的碎片过多造成FGC(可以增加每次GC后整理参数) 
OC的内存不够用 
promotion failed引起FGC ( 对象晋升失败)
concurrent mode failure引起FGC(对象晋升时,正在CMS) 

持久代大小不够( jmap -permstat ) 
堆的碎片过多造成FGC (碎片整理, -XX:CMSFullGCsBeforeCompaction=1 设置多少次full gc后进行内存压缩) 
堆外内存对象大小,回收是system.gc. 是否禁用(-XX:-+DisableExplicitGC) 


JVM内存关注点 

监控JAVA进程   年轻代(edu):年老代:(ou) 持久代(G1元): 堆外内存大小

总览

jstat -gc / -gcutil   pid

jmap -heap

(这样没有堆外内存大小,对外内存如果超过阀值也会调用system.gc进行造成FGC,所以也需要关注. 这个就需要JMX)

时刻掌握自己系统中的具体内存使用情况,是哪些对象在消耗内存,不要等泄漏再来看

jmap -histo pid , 查看存活对象

查看perm:  jmap -permstat 

dump内存分析

jmap -dump:format=b,file=dump  dump整个内存

时刻关注内存的异常

内存泄漏排查:

当发生了内存泄漏时进行内存快照分析排查

详情案例见我另一篇 https://my.oschina.net/u/867417/blog/828199 

堆外内存的回收是调用system.gc. 是否禁用(引起FGC) 

-XX:-+DisableExplicitGC

这里也有个问题,如果用到了堆外内存(特别注意开源项目如netty),是否禁用了System.gc, 如果禁用。非堆内存会内存泄漏

我遇到过的坑分享

1,inter()的使用造成 (如fastjson) 引起的YGC时间越来越久

2, RPC调用用BIO做, 接收对象太大,结果并发上来,造成的GC

3, 半夜预约任务,然后产生了大对象引起的GC,造成了调用服务的TIMEOUT

 先到这,还有堆外内存(主要netty)和finalize的两块研究先预留欠账,后续加上

最后:

养成时常关注系统的GC频率,和dump出快照分析是哪些对象在使用了我们的内存,而不是等内存溢出才去分析。

作为个程序员需要对自己系统的每块内存做到了如指掌

欢迎关注我的公众号,重现线上各种BUG, 一起来构建我们的知识体系

JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌第2张

免责声明:文章转载自《JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Rotate Matrix 旋转矩阵性质分析MySQL数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Redis入门 – Jedis存储Java对象

Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)   原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 - 转载请保留该原文链接)   07/19/12 03:08:05 PM   在Jedis开发中,我们很多时候希望直接把一个对象放到Redis中,然后在...

浅析前端常见文件下载的9种场景:Blob基础知识/组成/Blob URL、a标签下载、showSaveFilePicker API下载(兼容性差)、FileSaver.js库下载、Zip下载(JSZip库)、附件形式下载(设置Content-Disposition)、base64格式下载(需转为blob)、分块传输下载、HTTP范围请求下载、大文件分块并行下载

  一般在我们工作中,主要会涉及到 9 种文件下载的场景,每一种场景背后都使用不同的技术,其中也有很多细节需要我们额外注意。   在浏览器端处理文件的时候,我们经常会用到 Blob 。比如图片本地预览、图片压缩、大文件分块上传及文件下载。在浏览器端文件下载的场景中,比如我们今天要讲到的 a 标签下载、showSaveFilePicker API 下载、Z...

Unity你用过哪些设计模式?你熟悉的设计模式有哪几种呢?

以前写过几篇设计模式的详细解释,今天在这里不详细介绍,有兴趣了解的可以去看前几篇随笔,今天就简单的介绍我们常用的设计模式. (1)工厂模式 简单工厂模式解决的问题是如何去实例化一个合适的对象. 简单工厂模式的核心思想就是:有一个专门的类来负责实例过程,范式出现大量产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建,比如说写技能是一系列类,那么...

TableView的使用

            项目现在基本出了一个版本,虽然做的是边缘工作,但是用到的东西还是整理一下吧,毕竟也算学了一点点东西。首先是TableView的使用。RWT是SWT的子集,因此,RWT中可能没有完全实现SWT的全部接口,也没有SWT那么完善。两者的架构不同,表现在显示形式,界面也不尽相同,但是基本的控件的时候还是相同的。这里首先通过SWT来学习一些常...

[转载]java中Statement详细用法

1、创建 Statement 对象建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段中所示:Connection con = DriverManager.getConnection(url, "sunny", "");Statement...

MFC- socket 编程

一、CAsyncSocket类 CAsyncSocket属于异步非阻塞类。 CAsyncSocket类采用了windows socket中的WSAAsyncSelect模型。CAsyncSocket 类是在很低的层次上对windows socket API进行了封装,它的成员函数和winsock API的函数调用直接对应,一个CAsyncSocket对象代...