第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

強(qiáng)大的nmt

標(biāo)簽:
Java

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查看具体区域的分配。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
1.6萬
獲贊與收藏
380

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消