Deep Java Library_java atomicinteger

Deep Java Library_java atomicintegerjava有NativeMemoryTracking帮助我们查看jvm带来的内存分配问题,这个只能看jvm带来的,如果是jni的调用申请的内存,那这个工具是没有用的。那大家可能疑惑了,那这个工具也没想象的那么有用,java各种分区,堆的,非堆的,还有直接内存的值jmx都有,想排查是否是jvm带来的似乎也可以做到。那NativeMemoryTracking的作用是什么呢?对比现有的工具查看内存数据的工…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

java有NativeMemoryTracking帮助我们查看jvm带来的内存分配问题,这个只能看jvm带来的,如果是jni的调用申请的内存,那这个工具是没有用的。那大家可能疑惑了,那这个工具也没想象的那么有用,java各种分区,堆的,非堆的,还有直接内存的值jmx都有,想排查是否是jvm带来的似乎也可以做到。那NativeMemoryTracking的作用是什么呢?

对比现有的工具

查看内存数据的工具其实很多,我们通过NativeMemoryTracking和他们进行一下比较。

jstat

NativeMemoryTracking

jmx是否支持命令行观察

支持

支持

不支持

是否支持直接内存

不支持

支持

支持

是否支持unsafe的分配

不支持

支持

不支持

对比的最后一项,很多人可能就要提出疑问,直接内存不就是利用unsafe分配的吗,那这里怎么还写了jmx不支持呢。

直接内存的使用其实是DirectByteBuffer自己维护的内存计数。也就是这个直接内存的数据其实是java code自己维护出来的,只要跳过这些,直接拿他的底层实现方式unsafe.allocateMemory(size);那这个数据是不会被直接内存统计到的,但是nmt可以。

对比之下,我们可以了解nmt的功能和优势,他提供了一种,非图形化界面,而且可以和top配合,快速区分内存占用的到底是谁的问题,如果nmt的数据没有增长,但是top的res涨了说明大概率是jni的调用导致的,如果是jvm的内存增长,我们可以通过detail来查看。

上手使用nmt

我们就拿一个直接内存的demo测试。

public class Malloc {

public static void main(String[] args) {

new Thread(()->{

int i=0;

List s= new LinkedList();

while (i<10){

ByteBuffer buffer = ByteBuffer.allocateDirect(1024*1024*100);

s.add(buffer);

System.out.println(“malloc”);

i++;

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

new Thread(()->{

int i=0;

while (i<10){

byte[] bytes =new byte[1024*1024*10];

}

}).start();

}

}

启动nmt功能。

-XX:NativeMemoryTracking=detail

开启baseline功能。

jcmd pid VM.native_memory baseline

开启了baseline,我们可以更直观的看到数据增长,打印出的数据会有+号。

我们先查看summary信息,先看看谁在增长

jcmd pid VM.native_memory summary.diff

(malloc=123KB #536 +1)

(mmap: reserved=249600KB, committed=2536KB)

– GC (reserved=165933KB, committed=155689KB)

(malloc=12689KB #138)

(mmap: reserved=153244KB, committed=143000KB)

– Compiler (reserved=133KB, committed=133KB)

(malloc=2KB #32)

(arena=131KB #7)

– Internal (reserved=1035599KB +307200KB, committed=1035599KB +307200KB)

(malloc=1035567KB +307200KB #2102 +3)

(mmap: reserved=32KB, committed=32KB)

目前测试使用的是java8,用unsafe申请的内存会在Internal中。

然后使用detail.diff来查看到底是谁导致的。

我们依据summary的分区的数据,找到我们关注的是Internal。然后基于这个再看diff

[0x000000010cf8638b] Unsafe_AllocateMemory+0x78

[0x0000000110d99667]

(malloc=1024000KB type=Internal +307200KB #10 +3)

这里我们就只看type为Internal的,可以看到这里是unsafe分配的。

小结

通过nmt,我们可以快速的区别出问题到底是是不是来自jvm分配,不是话,就使用native的查找泄漏的方式查看,如果是的话,可以先通过summary查看到底是那个区域,然后利用detail.diff查看具体区域的分配。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203540.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 开源 网管 工具_智和网管平台激活成功教程版

    开源 网管 工具_智和网管平台激活成功教程版http://network.51cto.com/art/200906/129490.htm 转载于:https://blog.51cto.com/zhengj3/168618

    2022年10月5日
    1
  • 简单工厂和策略模式_21680002工厂模式

    简单工厂和策略模式_21680002工厂模式简单工厂加策略模式的应用

    2022年9月12日
    1
  • python-louvain_louvin算法

    python-louvain_louvin算法本发明涉及数据挖掘技术领域,尤其涉及一种基于Louvain算法的社区发现方法及一种基于Louvain算法的社区发现系统背景技术:随着信息化技术的发展,信息系统中保存着大量用户的信息特征,用户与用户之间也存在着某种关联性。用户的特征具有多维度,且多关联性。社区发现能帮助人们更有效地了解网络的结构特征,从而提供更有效、更具个性化的服务。当前,许多研究通过分析网络的结构来发现社区。其中,Blondel等…

    2025年6月24日
    0
  • SpringCloud(四)—Ribbon负载均衡算法及配置

    SpringCloud(四)—Ribbon负载均衡算法及配置

    2020年11月12日
    206
  • 虚拟机ifconfig或ip addr不显示ip地址「建议收藏」

    虚拟机ifconfig或ip addr不显示ip地址「建议收藏」虚拟机ifconfig或ipaddr不显示ip地址报错图片:一直查不到ip地址,有重新启动很多次解决方法(1)命令查看配置文件:vi/etc/sysconfig/network-scripts/ifcfg-ens33ens33注意看这个修改的文件后缀把ONBOOT的状态no改为yes然后重启,应该就没问题了。(2):还有一种可能是因为虚拟网卡没有正常连接,解决方法是开启虚拟网卡的服务:打开任务管理器,选择服务标签,为了保险,开启所有的和vmware有关的服务检

    2022年7月27日
    3
  • 网络层传输层(计算机网络传输层大题)

    概述传输层的意义网络层可以把数据从一个主机传送到另一个主机,但是没有和进程建立联系。传输层就是讲进程和收到的数据联系到一起,使数据能够为应用服务所以说传输层是主机才有的层次传输层的两个协议传输层的寻址和端口端口号只用于计算机分辨本地进程,总共有2^16=65536种端口号,端口号有很多种,不能随便使用常见的应用程序端口号UDP协议UDP概述注释:因为UDP一次发送一个完整报文不会分片,所以需要应用层传输过来的数据不要太大,否则网络层分片任务就很重,但是也不能太小,不然效率较低

    2022年4月11日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号