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

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

上一讲我介绍了 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(25)

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

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

    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 这是我看这边文章也有的疑问,通过查阅资料理解的,希望可以帮到其他同学

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

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

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

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

    作者回复: 是的

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

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

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

    作者回复: 不错

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

    作者回复: 是的

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

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

    8
  • ethan
    jar包发生冲突,如何定位是哪些jar包发生问题

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

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

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

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