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

  • 可以使用综合性的图形化工具,如 JConsole、VisualVM ,这些工具比较直观,直接连接到 Java 进程,图形化界面。
  • 可以使用命令工具进行查询,如 jstat 和jmap 工具,查看堆、方法区等使用数据。
  • 使用 jmap 提供的命令, 生产 Heap Dump 文件,然后利用 Jhat 和 Eclipse MAT 进行分析。
  • GC 日志输出,也能包含很多有用的信息。

Java 堆内存

新生代、老年代、永久代,具体不说了。

JVM TLAB

JVM 还有个 Thread Local Allocation Buffer (TLAB)的概念。JVM 为每个线程分配一个私有的缓存区域,多个线程分配内存时,为避免操作同一个地址,会需要使用加锁机制,进而影响分配速度。TLAB 分配仍然在堆上,是分配在Eden 区域内的。

  • TLAB 结构

start 、 end 是起止地址, top 表示已经分配到哪 , JVM 会移动到 top, 当 top 和 end 相遇的时候,表示缓存满了。

堆外内存

堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存

  • Java 开发者经常用 java.nio.DirectByteBuffer 对象进行堆外内存的管理和使用, 该类会在创建对象时就分配堆外内存。
  • JDK1.8 取消了方法区, 由MetaSpace(元空间)代替。-XX:MaxPermSize由 -XX:MetaspaceSize, -XX:MaxMetaspaceSize 等代替
  • 对堆外内存的申请主要是通过成员变量unsafe来操作
DirectByteBuffer(int cap) {                   // package-private 私有包super(-1, 0, cap, cap);// 是否为页对齐的内存boolean pa = VM.isDirectMemoryPageAligned();// 获取页尺寸int ps = Bits.pageSize();long size = Math.max(1L, (long)cap + (pa ? ps : 0));// 保留内存Bits.reserveMemory(size, cap);long base = 0;try {// 分配内存base = unsafe.allocateMemory(size);} catch (OutOfMemoryError x) {// 如果内存溢出就去除保留内存Bits.unreserveMemory(size, cap);throw x;}// 设置内存unsafe.setMemory(base, size, (byte) 0);if (pa && (base % ps != 0)) {// Round up to page boundary 向上取整至页面边缘address = base + ps - (base & (ps - 1));} else {address = base;}cleaner = Cleaner.create(this, new Deallocator(base, size, cap));att = null;}

JConssole 查看 内存,可以看到 Metaspace 这个就是堆外内存

使用堆外内存的优点

  • 减少了垃圾回收机制(GC 会暂停其他的工作)
  • 加快了复制的速度
  • 堆内在flush到远程时, 会先复制到直接内存(非堆内存), 然后再发送。而堆外内存(本身就是物理机内存)几乎省略了该步骤。

使用堆外内存的缺点

  • 内存难以控制,使用了堆外内存就间接失去了JVM管理内存的可行性,改由自己来管理,当发生内存溢出时排查起来非常困难。

欢迎关注公众号:程序员开发者社区

java visualvm远程监控_如何监控和诊断堆外内存使用相关推荐

  1. java nio 李林峰_Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  2. java使用ByteBuffer.allocateDirect分配的堆外内存大小查看方法

    一.问题 在java开发中,可以使用ByteBuffer.allocateDirect分配的堆外内存,那么对一个java程序来说,如何实时查看进程的堆外内存大小呢? 二.本机进程 1.使用Jvisua ...

  3. java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?

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

  4. java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露

    Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据. NMT介绍 工欲 ...

  5. 2、小米监控_服务监控Open-Falcon环境准备

    服务监控Open-Falcon环境准备 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战( ...

  6. 一文探讨堆外内存的监控与回收

    引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...

  7. java 堆外内存 查看_超干货!Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  8. java 堆外内存_详解Java堆外内存

    临近春节,最近有点时间,准备顺着上篇专栏的思路写下去,建议先阅读: juejin.im/post/684490- 武汉那几个吃野味的傻[],请藏好你们的妈 正文开始 在运行Java程序时,java虚拟 ...

  9. java堆外内存6_Java堆外内存排查小结

    简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路.之前的文章排版太乱,现在整理重发一下,内容是一样的. 通过本文,你应该了解: pmap 命令 gdb 命令 per ...

最新文章

  1. python 字符串去重且相同字符最多出现2次_Python实现计算字符串中出现次数最多的字符示例...
  2. 数据库监控框架 oneproxy-monitor 开源了
  3. VMware发布虚拟云网络创新技术,连接和保护分布式多云企业
  4. Emacs配置文件(备份用)
  5. 【空间统计】0 空间统计基础理论
  6. java 编译器和 jvm_java编译器和JVM有什么区别
  7. influxdb数据过期_influxdb 清空数据库
  8. editormd html 转义,Markdown(editormd)语法解析成html(示例代码)
  9. 自定义input单选框样式
  10. 崔云php_佘家村里的“茉莉香”
  11. 〔王鹰教程五〕和弦的分类记忆法
  12. Python全栈开发-Mysql知识点总结(中)
  13. 目标跟踪:Deepsort--卡尔曼滤波、匈牙利匹配、马氏距离、欧氏距离、级联匹配、reid
  14. tomcat7的下载和安装配置
  15. cosx等价无穷小_等价无穷小替换注意事项
  16. Slurm作业启动原理
  17. 【160313 18:00】四则运算 2 的单元测试
  18. 机器学习项目是如何开发和部署的?
  19. 对论文写作专栏文章的简单归纳总结和心得体会
  20. 网络市场与群体练习题

热门文章

  1. Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结
  2. Jquery学习总结(6)——JQuery万能代码段
  3. crash工具解析_crash工具和x86-64汇编基础
  4. 高级网络配置:Bond网络接口、Team网络接口和网桥
  5. js 字符串转换成数字(转)
  6. 在linux下编译android下的opencv,使用cmake的方法
  7. 一个好用的导出excel数据为protobuf的工具
  8. freeswitch订阅会议相关通知
  9. OpenSCAD设计的3D打印智能路由器盒子(V1.1)
  10. Node.js新手教程——怎样实现文件上传功能