服务器的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的两块研究先预留欠账,后续加上

最后:

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

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

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

  1. 读书笔记一 Java程序员的基本修养(数组及其内存管理)

    1.1 数组初始化 1.1.1 java数组是静态的 java数组被初始化之后,该数组所占的内存空间.数组长度都是不可变的. java程序中的数组必须经过初始化才可使用. 数组的初始化有两种方式: 1 ...

  2. Java进阶之路——从初级程序员到架构师,从小工到专家

    原创文章 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到 ...

  3. Java程序性能分析工具Java VisualVM(Visual GC)—程序员必备利器

    VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回收 ...

  4. 极客时间-左耳听风-程序员攻略-Linux系统、内存和网络

    程序员练级攻略:Linux系统.内存和网络 Linux 系统相关 Red Hat Enterprise Linux 文档 . Linux Insides ,GitHub 上的一个开源电子书,其中讲述了 ...

  5. [置顶] think in java interview番外篇-谈程序员如何修练英语

    一.程序员对英语能力的重视度和能力要求应该是在各行各业中排在比较靠前的 这样说吧,英语程度的好坏直接影响着一个程序员的编程.开发.创新能力. 道理很简单: 1. 计算机和软件是用英语创造出来的 2. ...

  6. 后端程序员之路 8、一种内存kv数据库的实现

    键值(Key-Value)存储数据库,这是一种NoSQL(非关系型数据库)模型,其数据按照键值对的形式进行组织.索引和存储.KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘 ...

  7. 【译】x86程序员手册12-4.2系统指令

    4.2 Systems Instructions 系统指令 Systems instructions deal with such functions as: 系统指令具有以下功能: Verifica ...

  8. 【译】x86程序员手册11- 4.1系统寄存器

    4.1 Systems Registers 系统寄存器 The registers designed for use by systems programmers fall into these cl ...

  9. JAVA程序员面试宝典

    程序员面试之葵花宝典 面向对象的特征有哪些方面    1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题 ...

随机推荐

  1. [Unity Physics]Physics - Rigidbody、Collider

    什么是Collider 碰撞器组件在Unity引擎中触发物理碰撞的最基本的条件. 可以这样说,假如一个游戏中没有物理碰撞系统是不可能的. 什么是Rigidbody 通过物理模拟的控制对象的位置. Ri ...

  2. UNITY3D中的文件存储管理

    使用Path对象判断路径的完整性和正确性 using System; using System.IO; class Test { public static void Main() { string ...

  3. input有许多,点击按钮使用form传递文本框的值

    input有许多,点击按钮使用form传递文本框的值 <form name="form1" method="post" action="< ...

  4. P3197 [HNOI2008]越狱

    题目描述 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 输入输出格式 输入 ...

  5. js函数——setinterval和setTimeout

    1.window.setTimeout方法 该方法可以延时执行一个函数,例如: <script language="JavaScript" type="text/j ...

  6. R Student Companion(R语言初学指南)的源代码_数据_插图

    下载内容见附件:http://files.cnblogs.com/files/ml-cv/data_And_R_script.zip.

  7. WCF不用证书实现验证(messageheader)

    上文WCF进阶:将消息正文Base64编码中介绍了实现自定义MessageInspector来记录消息和实现自定义Formatter来改写消息,本文介绍一下在WCF中使用SoapHeader进行验证的 ...

  8. diff命令参数

    diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文件 目标文件 描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - ...

  9. 可用于Windows Server 2008 R2的Xbox One手柄、接收器驱动

    让客厅里的Gen8可以玩FC和PS1游戏,折腾了半天,终于将Xbox One手柄驱动弄好: http://www.drvsky.com/Microsoft/Xbox_One.htm http://ww ...

  10. shell sed

      匹配 sed -n '/pattern/p' file_name |sed -n 7,12p #pattern是你要查的内容 #file_name是你要查的文件 以上实现:打印出匹配结果中的7-1 ...