java visualvm远程监控_如何监控和诊断堆外内存使用
如何监控和诊断堆外内存使用
- 可以使用综合性的图形化工具,如 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远程监控_如何监控和诊断堆外内存使用相关推荐
- java nio 李林峰_Netty堆外内存泄漏排查,这一篇全讲清楚了
上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...
- java使用ByteBuffer.allocateDirect分配的堆外内存大小查看方法
一.问题 在java开发中,可以使用ByteBuffer.allocateDirect分配的堆外内存,那么对一个java程序来说,如何实时查看进程的堆外内存大小呢? 二.本机进程 1.使用Jvisua ...
- java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...
- java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露
Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据. NMT介绍 工欲 ...
- 2、小米监控_服务监控Open-Falcon环境准备
服务监控Open-Falcon环境准备 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战( ...
- 一文探讨堆外内存的监控与回收
引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...
- java 堆外内存 查看_超干货!Cassandra Java堆外内存排查经历全记录
背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...
- java 堆外内存_详解Java堆外内存
临近春节,最近有点时间,准备顺着上篇专栏的思路写下去,建议先阅读: juejin.im/post/684490- 武汉那几个吃野味的傻[],请藏好你们的妈 正文开始 在运行Java程序时,java虚拟 ...
- java堆外内存6_Java堆外内存排查小结
简介 JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路.之前的文章排版太乱,现在整理重发一下,内容是一样的. 通过本文,你应该了解: pmap 命令 gdb 命令 per ...
最新文章
- python 字符串去重且相同字符最多出现2次_Python实现计算字符串中出现次数最多的字符示例...
- 数据库监控框架 oneproxy-monitor 开源了
- VMware发布虚拟云网络创新技术,连接和保护分布式多云企业
- Emacs配置文件(备份用)
- 【空间统计】0 空间统计基础理论
- java 编译器和 jvm_java编译器和JVM有什么区别
- influxdb数据过期_influxdb 清空数据库
- editormd html 转义,Markdown(editormd)语法解析成html(示例代码)
- 自定义input单选框样式
- 崔云php_佘家村里的“茉莉香”
- 〔王鹰教程五〕和弦的分类记忆法
- Python全栈开发-Mysql知识点总结(中)
- 目标跟踪:Deepsort--卡尔曼滤波、匈牙利匹配、马氏距离、欧氏距离、级联匹配、reid
- tomcat7的下载和安装配置
- cosx等价无穷小_等价无穷小替换注意事项
- Slurm作业启动原理
- 【160313 18:00】四则运算 2 的单元测试
- 机器学习项目是如何开发和部署的?
- 对论文写作专栏文章的简单归纳总结和心得体会
- 网络市场与群体练习题
热门文章
- Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结
- Jquery学习总结(6)——JQuery万能代码段
- crash工具解析_crash工具和x86-64汇编基础
- 高级网络配置:Bond网络接口、Team网络接口和网桥
- js 字符串转换成数字(转)
- 在linux下编译android下的opencv,使用cmake的方法
- 一个好用的导出excel数据为protobuf的工具
- freeswitch订阅会议相关通知
- OpenSCAD设计的3D打印智能路由器盒子(V1.1)
- Node.js新手教程——怎样实现文件上传功能