专栏首页FREE SOLO如何监控和诊断JVM堆内和堆外内存使用?

如何监控和诊断JVM堆内和堆外内存使用?

可以使用综合性的图形化工具,如JConsole、 VisualVM(注意,从Oracle JDK 9开始, VisualVM已经不再包含在JDK安装包中)等。这些工具具体使用起来相对比较直观,直接连接到Java进程,然后就可以在图形化界面里掌握内存使用情况。 以JConsole为例,其内存页面可以显示常见的堆内存和各种堆外部分使用状态。

也可以使用命令行工具进行运行时查询,如jstat和jmap等工具都提供了一些选项,可以查看堆、方法区等使用数据。 或者,也可以使用jmap等提供的命令,生成堆转储(Heap Dump)文件,然后利用jhat或Eclipse MAT等堆转储分析工具进行详细分析。 如果你使用的是Tomcat、 Weblogic等Java EE服务器,这些服务器同样提供了内存管理相关的功能。 另外,从某种程度上来说, GC日志等输出,同样包含着丰富的信息。

堆内部是什么结构?

按照通常的GC年代方式划分, Java堆内分为:

新生代

新生代是大部分对象创建和销毁的区域,在通常的Java应用中,绝大部分对象生命周期都是很短暂的。其内部又分为Eden区域,作为对象初始分配的区域;两个Survivor,有时候也叫from、 to区域,被用来放置从Minor GC中保留下来的对象。

JVM会随意选取一个Survivor区域作为“to”,然后会在GC过程中进行区域间拷贝,也就是将Eden中存活下来的对象和from区域的对象,拷贝到这个“to”区域。这种设计主要是为了防止内存的碎片化,并进一步清理无用对象。

从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分, Hotspot JVM还有一个概念叫做(TLAB)。这是JVM为每个线程分配的一个私有缓存区域,否则,多线程同时分配内存时,为避免操作同一地址,可能需要使用加锁等机制,进而影响分配速度,TLAB仍然在堆上,它是分配在Eden区域内的。其内部结构比较直观易懂, start、 end就是起始地址, top(指针)则表示已经分配到哪里了。所以我们分配新对象, JVM就会移动top,当top和end相遇时,即表示该缓存已满, JVM会试图再从Eden里分配一块儿。

老年代

放置长生命周期的对象,通常都是从Survivor区域拷贝过来的对象。当然,也有特殊情况,我们知道普通的对象会被分配在TLAB上;如果对象较大, JVM会试图直接分配在Eden其他位置上;如果对象太大,完全无法在新生代找到足够长的连续空闲空间, JVM就会直接分配到老年代。

永久代

这部分就是早期Hotspot JVM的方法区实现方式了,储存Java类元数据、常量池、 Intern字符串缓存,在JDK 8之后就不存在永久代这块儿了。 利用JVM参数,直接影响堆和内部区域的大小

最大堆体积:-Xmx value
初始的最小堆体积:-Xms value
老年代和新生代的比例:-XX:NewRatio=value。默认情况下,这个数值是3,意味着老年代是新生代的3倍大;换句话说,新生代是堆大小的1/4。

也可以不用比例的方式调整新生代的大小,直接-XX:NewSize=value参数,设定具体的内存大小数值。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 试估算中国K12课外英语辅导的市场,请至少使用2种不同的方案来估算,以便能够交叉验证。

    试估算中国K12课外英语辅导的市场(K12:kindergarten through twelfth grade的简写,是指从幼儿园(Kindergarten,...

    葆宁
  • 说说JDBC中PreparedStatement相比Statement的好处

    葆宁
  • HTML图片标签学习

    葆宁
  • Dubbo 与 Istio 共生

    当下,越来越多的应用迁入了容器集群。“享受着”云原生带来的便利。mesh 也越来越被广大程序员所接受。

    谢正伟
  • Dubbo 与 Istio 共生

    当下,越来越多的应用迁入了容器集群。“享受着”云原生带来的便利。mesh 也越来越被广大程序员所接受。

    谢正伟
  • Golang中Interface类型详解

    本文章翻译自《Let's learn Go》的“Interfaces: the awesomesauce of Go”一节 原文地址:http://go-boo...

    李海彬
  • Golang中Interface类型详解

    本文章翻译自《Let's learn Go》的“Interfaces: the awesomesauce of Go”一节 原文地址:http://go-bo...

    李海彬
  • Golang中Interface类型详解

    文 | Zuozuohao 共 14470 字,阅读需 36 分钟 本文章翻译自《Let's learn Go》的“Interfaces: the awesom...

    李海彬
  • ansible自动化部署工具

    Ansible是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible适用于管理企业IT基础设施,从具有少...

    yuezhimi
  • php遍历目录&删除指定文件中指定内容

    现在正坐在安静的寝室里,寒假俨然已经离我而去了……今天发的是我寒假里搞的最后一次学习,之后的时间就一直在看海贼王了。

    phith0n

扫码关注云+社区

领取腾讯云代金券