Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?

NMT特性对JVM进行分析
JMC或JConsole的内存管理界面
利用JVM参数影响堆和内部区域大小
永久代
老年代
新生代
使用特定工具或特性定位内存区域
理解JVM内部结构
Eclipse MAT
jhat
jmap
jstat
VisualVM
JConsole
用程序的方式监控Java内存使用的技术
堆外内存
堆内部结构
内存监控与诊断
考察基本能力
JDK的Native Memory Tracking(NMT)特性
GC日志
服务器提供的功能
堆转储分析工具
命令行工具
图形化工具
堆外部分
堆内存
一课一练
知识扩展
考点分析
特殊部分:堆外内存中的直接内存
监控和诊断方法
JVM内存区域划分
如何监控和诊断JVM堆内和堆外内存使用

该思维导图由 AI 生成,仅供参考

上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数、工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分。
今天我要问你的问题是,如何监控和诊断 JVM 堆内和堆外内存使用?

典型回答

了解 JVM 内存的方法有很多,具体能力范围也有区别,简单总结如下:
可以使用综合性的图形化工具,如 JConsole、VisualVM(注意,从 Oracle JDK 9 开始,VisualVM 已经不再包含在 JDK 安装包中)等。这些工具具体使用起来相对比较直观,直接连接到 Java 进程,然后就可以在图形化界面里掌握内存使用情况。
以 JConsole 为例,其内存页面可以显示常见的堆内存各种堆外部分使用状态。
也可以使用命令行工具进行运行时查询,如 jstat 和 jmap 等工具都提供了一些选项,可以查看堆、方法区等使用数据。
或者,也可以使用 jmap 等提供的命令,生成堆转储(Heap Dump)文件,然后利用 jhat 或 Eclipse MAT 等堆转储分析工具进行详细分析。
如果你使用的是 Tomcat、Weblogic 等 Java EE 服务器,这些服务器同样提供了内存管理相关的功能。
另外,从某种程度上来说,GC 日志等输出,同样包含着丰富的信息。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JVM内存监控与诊断方法详解 本文深入介绍了监控和诊断JVM堆内和堆外内存使用的方法,包括常见工具和命令行工具的使用,以及堆内存结构和堆外内存的详细分析。作者通过介绍JVM参数和特性,系统地分析了堆内和堆外内存结构,为读者提供了对JVM内存管理的基础实践和相关工具的了解。 文章内容涵盖了堆内存的结构、堆外内存的包括内容、NMT特性对JVM的分析以及JVM参数对内存大小的影响等方面。通过本文的阅读,读者可以深入了解JVM内存结构,对定制Java运行时或处理OOM等问题有更清晰的思路。 本文的亮点在于深入剖析了JVM内存监控和诊断的方法,涵盖了堆内和堆外内存的结构、相关工具的使用以及对JVM参数和特性的分析。读者通过阅读本文可以获得对JVM内存管理的基础实践和相关工具的了解,为定制Java运行时或处理OOM等问题提供了清晰的思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • Loading...
    今天阿里面试官问了我一个问题,我想了很久没想通,希望得到解答。为什么在标记垃圾的时候,需要stop the world

    作者回复: 对方问得有点含糊,不知道是否故意的,以cms为例,它有不同的mark: initial mark,conc mark, remark;conc时候不需要stw;其他需要短暂stw,这样引用关系才不变,另外效率也高

    2018-07-05
    12
    58
  • 小文同学
    班门弄斧,为老师补充一些关于Eden、两个Survivor的细节。 1、大部分对象创建都是在Eden的,除了个别大对象外。 2、Minor GC开始前,to-survivor是空的,from-survivor是由对象的。 3、Minor GC后,Eden的存活对象都copy到to-survivor中,from-survivor的存活对象也复制to-survivor中。其中所有对象的年龄+1 4、from-survivor清空,成为新的to-survivor,带有对象的to-survivor变成新的from-survivor。重复回到步骤2 这是我看这边文章也有的疑问,通过查阅资料理解的,希望可以帮到其他同学

    作者回复: 非常感谢,下一章有配图详解,受制于一章的篇幅限制

    2018-07-07
    3
    55
  • 铁拳阿牛
    -XX:NewRatio=value 默认是2 这里说是3面试官还说我记错了😣

    作者回复: 是我记错了,非常抱歉

    2018-07-18
    2
    21
  • 北溟鱼汤
    java.lang.Runtime类有freeMemory()、totalMemory()等方法可以获取到jvm内存情况,看了一下是本地方法。

    作者回复: 是的

    2018-07-05
    19
  • xhkk
    老师,请问如何判断是否有内存泄露

    作者回复: 泄露可以对比不同时间点内存分配,一般看用户类型的分配情况,什么在增加。具体,比如用jmap -histo:live 多次快照,然后对比差异,或者用jmc之类profiling工具,都可以进行,对比会更加流畅一些

    2018-07-24
    14
  • clz1341521
    java.lang.Runtime类有freeMemory()、totalMemory()等方法可以获取到jvm内存情况,看了一下是本地方法。 另外看到有同学说jmc,jconsole在linux上用不了的问题,其实1可以远程连接,2可以使用xshell

    作者回复: 不错

    2018-08-09
    12
  • L.B.Q.Y
    jmx可以做到通过代码而不是工具去监控,其实jdk安装包的工具也是对jmx的一个薄层的封装。

    作者回复: 是的

    2018-07-05
    10
  • 陈道恒
    当然,也有特殊情况,我们知道普通的对象会被分配在 TLAB 上;如果对象较大,JVM 会试图直接分配在 Eden 其他位置上;如果对象太大,完全无法在新生代找到足够长的连续空闲空间,JVM 就会直接分配到老年代。 杨老师你好,大对象直接分配到老年代,这里是指多大?有没什么衡量标准?

    作者回复: 这个要看具体什么GC,如果cms是PretenureSizeThreshold,G1本身就有homongous object的概念,region大小的一半

    2018-08-15
    9
  • ethan
    jar包发生冲突,如何定位是哪些jar包发生问题

    作者回复: 出错信息应该包含具体类的名字等信息;mvn依赖树

    2018-07-09
    6
  • 李二木
    还有一个就是jstat,可以实时查看gc信息,这个也还是没有工具直观,

    作者回复: 是的,文中简单提了下

    2018-07-05
    4
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部