精华内容
下载资源
问答
  • JVM通过java代码查看初始堆内存大小与最大堆内存大小
    千次阅读
    2020-01-11 15:24:19

    如下的jvm代码, 可以查看并打印初始化的堆内存大小和试图使用的最大堆内存大小

    public class QueryJVM {
        public static void main(String[] args){
            //返回java虚拟机中的内存总量
            long totalMemory = Runtime.getRuntime().totalMemory();
            //返回java虚拟机试图使用的最大内存量
            long maxMemory = Runtime.getRuntime().maxMemory();
            System.out.println("Total_Memory(-Xms ) =  "+ totalMemory + " 字节  " + (totalMemory / (double)1024/1024)+"MB");
            System.out.println("Max_Memory(-Xmx ) =  "+ maxMemory + " 字节  " + (maxMemory / (double)1024/1024)+"MB");
        }
    }
    

    运行后打印的结果如下

    Total_Memory(-Xms ) =  192937984 字节  184.0MB
    Max_Memory(-Xmx ) =  2837446656 字节  2706.0MB
    

    由于我的机器是12GB内存, 可以看到初始化堆内存为184M, 大约为机器内存大小的1/64 . 最大堆内存大小约为机器内存大小的1/4.

    更多相关内容
  • Java堆内存排查小结

    千次阅读 2021-03-09 20:05:40
    简介JVM内存难排查但经常会出现问题,这可能是目前最全的JVM内存排查思路。通过本文,你应该了解:pmap 命令gdb 命令perf 命令内存 RSS、VSZ的区别java NMT起因这几天遇到一个比较奇怪的问题,觉得有必要和...

    1660937585.jpeg

    简介

    JVM堆外内存难排查但经常会出现问题,这可能是目前最全的JVM堆外内存排查思路。

    通过本文,你应该了解:

    pmap 命令

    gdb 命令

    perf 命令

    内存 RSS、VSZ的区别

    java NMT

    起因

    这几天遇到一个比较奇怪的问题,觉得有必要和大家分享一下。我们的一个服务,运行在docker上,在某个版本之后,占用的内存开始增长,直到docker分配的内存上限,但是并不会OOM。版本的更改如下:

    升级了基础软件的版本

    将docker的内存上限由4GB扩展到8GB

    上上个版本的一项变动是使用了EhCache的Heap缓存

    没有读文件,也没有mmap操作

    使用jps 查看启动参数,发现分配了大约3GB的堆内存

    [root]$ jps -v

    75 Bootstrap -Xmx3000m -Xms3000m -verbose:gc -Xloggc:/home/logs/gc.log -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:MaxTenuringThreshold=10 -XX:MaxPermSize=128M -XX:SurvivorRatio=3 -XX:NewRatio=2 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

    使用ps查看进程使用的内存和虚拟内存 ( Linux内存管理 )。除了虚拟内存比较高达到17GB以外,实际使用的内存RSS也夸张的达到了7GB,远远超过了-Xmx的设定。

    [root]$ ps -p 75 -o rss,vsz

    RSS VSZ 7152568 17485844

    排查过程

    明显的,是有堆外内存的使用,不太可能是由于EhCache引起的(因为我们使用了heap方式)。了解到基础软件的升级涉及到netty版本升级,netty会用到一些DirectByteBuffer,第一轮排查我们采用如下方式:

    jmap -dump:format=b,file=75.dump 75 通过分析堆内存找到DirectByteBuffer的引用和大小

    部署一个升级基础软件之前的版本,持续观察

    部署另一个版本,更改EhCache限制其大小到1024M

    考虑到可能由Docker的内存分配机制引起,部署一实例到实体机

    结果4个环境中的服务,无一例外的都出现了内存超用的问题。问题很奇怪,宝宝睡不着觉。

    pmap

    为了进一步分析问题,我们使用pmap查看进程的内存分配,通过RSS升序序排列。结果发现除了地址000000073c800000上分配的3GB堆以外,还有数量非常多的64M一块的内存段,还有巨量小的物理内存块映射到不同的虚拟内存段上。但到现在为止,我们不知道里面的内容是什么,是通过什么产生的。

    [root]$ pmap -x 75 | sort -n -k3

    .....省略N行

    0000000040626000 55488 55484 55484 rwx-- [ anon ]

    00007fa07c000000 65536 55820 55820 rwx-- [ anon ]

    00007fa044000000 65536 55896 55896 rwx-- [ anon ]

    00007fa0c0000000 65536 56304 56304 rwx-- [ anon ]

    00007f9db8000000 65536 56360 56360 rwx-- [ anon ]

    00007fa0b8000000 65536 56836 56836 rwx-- [ anon ]

    00007fa084000000 65536 57916 57916 rwx-- [ anon ]

    00007f9ec4000000 65532 59752 59752 rwx-- [ anon ]

    00007fa008000000 65536 60012 60012 rwx-- [ anon ]

    00007f9e58000000 65536 61608 61608 rwx-- [ anon ]

    00007f9f18000000 65532 61732 61732 rwx-- [ anon ]

    00007fa018000000 65532 61928 61928 rwx-- [ anon ]

    00007fa088000000 65536 62336 62336 rwx-- [ anon ]

    00007fa020000000 65536 62428 62428 rwx-- [ anon ]

    00007f9e44000000 65536 64352 64352 rwx-- [ anon ]

    00007f9ec0000000 65528 64928 64928 rwx-- [ anon ]

    00007fa050000000 65532 65424 65424 rwx-- [ anon ]

    00007f9e08000000 65512 65472 65472 rwx-- [ anon ]

    00007f9de0000000 65524 65512 65512 rwx-- [ anon ]

    00007f9dec000000 65532 65532 65532 rwx-- [ anon ]

    00007f9dac000000 65536 65536 65536 rwx-- [ anon ]

    00007f9dc8000000 65536 65536 65536 rwx-- [ anon ]

    00007f9e30000000 65536 65536 65536 rwx-- [ anon ]

    00007f9eb4000000 65536 65536 65536 rwx-- [ anon ]

    00007fa030000000 65536 65536 65536 rwx-- [ anon ]

    00007fa0b0000000 65536 65536 65536 rwx-- [ anon ]

    000000073c800000 3119140 2488596 2487228 rwx-- [ anon ]

    total kB 17629516 7384476 7377520

    通过google,找到以下资料 Linux glibc >= 2.10 (RHEL 6) malloc may show excessive virtual memory usage)

    文章指出造成应用程序大量申请64M大内存块的原因是由Glibc的一个版本升级引起的,通过export MALLOC_ARENA_MAX=4可以解决VSZ占用过高的问题。虽然这也是一个问题,但却不是我们想要的,因为我们增长的是物理内存,而不是虚拟内存。

    NMT

    幸运的是 JDK1.8有Native Memory Tracker可以帮助定位。通过在启动参数上加入-XX:NativeMemoryTracking=detail就可以启用。在命令行执行jcmd可查看内存分配。

    #jcmd 75 VM.native_memory summary

    Native Memory Tracking: Total: reserved=5074027KB, committed=3798707KB - Java Heap (reserved=3072000KB, committed=3072000KB) (mmap: reserved=3072000KB, committed=3072000KB) - Class (reserved=1075949KB, committed=28973KB) (classes #4819) (malloc=749KB #13158) (mmap: reserved=1075200KB, committed=28224KB) - Thread (reserved=484222KB, committed=484222KB) (thread #470) (stack: reserved=482132KB, committed=482132KB) (malloc=1541KB #2371) (arena=550KB #938) - Code (reserved=253414KB, committed=25070KB) (malloc=3814KB #5593) (mmap: reserved=249600KB, committed=21256KB) - GC (reserved=64102KB, committed=64102KB) (malloc=54094KB #255) (mmap: reserved=10008KB, committed=10008KB) - Compiler (reserved=542KB, committed=542KB) (malloc=411KB #543) (arena=131KB #3) - Internal (reserved=50582KB, committed=50582KB) (malloc=50550KB #13713) (mmap: reserved=32KB, committed=32KB) - Symbol (reserved=6384KB, committed=6384KB) (malloc=4266KB #31727) (arena=2118KB #1) - Native Memory Tracking (reserved=1325KB, committed=1325KB) (malloc=208KB #3083) (tracking overhead=1117KB) - Arena Chunk (reserved=231KB, committed=231KB) (malloc=231KB) - Unknown (reserved=65276KB, committed=65276KB) (mmap: reserved=65276KB, committed=65276KB)

    虽然pmap得到的内存地址和NMT大体能对的上,但仍然有不少内存去向成谜。虽然是个好工具但问题并不能解决。

    gdb

    非常好奇64M或者其他小内存块中是什么内容,接下来通过gdbdump出来。读取/proc目录下的maps文件,能精准的知晓目前进程的内存分布。

    以下脚本通过传入进程id,能够将所关联的内存全部dump到文件中(会影响服务,慎用)。

    grep rw-p /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done

    更多时候,推荐之dump一部分内存。(再次提醒操作会影响服务,注意dump的内存块大小,慎用)。

    gdb --batch --pid 75 -ex "dump memory a.dump 0x7f2bceda1000 0x7f2bcef2b000

    [root]$ du -h *

    dump 4.0K

    55-00600000-00601000.dump 400K

    55-00eb7000-00f1b000.dump 0

    55-704800000-7c0352000.dump 47M

    55-7f2840000000-7f2842eb8000.dump 53M

    55-7f2848000000-7f284b467000.dump 64M

    55-7f284c000000-7f284fffa000.dump 64M

    55-7f2854000000-7f2857fff000.dump 64M

    55-7f285c000000-7f2860000000.dump 64M

    55-7f2864000000-7f2867ffd000.dump 1016K

    55-7f286a024000-7f286a122000.dump 1016K

    55-7f286a62a000-7f286a728000.dump 1016K

    55-7f286d559000-7f286d657000.dump

    是时候查看里面的内容了

    [root]$ view 55-7f284c000000-7f284fffa000.dump

    ^@^@X+^?^@^@^@^@^@d(^?^@^@^@ ÿ^C^@^@^@^@^@ ÿ^C^@^@^@^@^@^@^@^@^@^@^@^@±<97>p^C^@^@^@^@ 8^^Z+^?^@^@ ^@^@d(^?^@^@ 8^^Z+^?^@^@ ^@^@d(^?^@^@

    achine":524993642,"timeSecond":1460272569,"inc":2145712868,"new":false},"device":{"client":"android","uid":"xxxxx","version":881},"

    device_android":{"BootSerialno":"xxxxx","CpuInfo":"0-7","MacInfo":"2c:5b:b8:b0:d5:10","RAMSize":"4027212","SdcardInfo":"xxxx","Serialno":"xxxx",

    "android_id":"488aedba19097476","buildnumber":"KTU84P/1416486236","device_ip":"0.0.0.0","mac":"2c:5b:b8:b0:d5:10","market_source":"12","model":"OPPO ...more

    纳尼?这些内容不应该在堆里面么?为何还会使用额外的内存进行分配?上面已经排查netty申请directbuffer的原因了,那么还有什么地方在分配堆外内存呢?

    perf

    传统工具失灵,快到了黔驴技穷的时候了,是时候祭出神器perf了。

    使用 perf record -g -p 55 开启监控栈函数调用。运行一段时间后Ctrl+C结束,会生成一个文件perf.data。

    执行perf report -i perf.data查看报告。

    535739367.jpeg

    如图,进程大量执行bzip相关函数。搜索zip,结果如下:

    113103878.jpeg

    -.-!

    进程调用了Java_java_util_zip_Inflater_inflatBytes() 申请了内存,仅有一小部分调用Deflater释放内存。与pmap内存地址相比对,确实是bzip在搞鬼。

    解决

    java项目搜索zip定位到代码,发现确实有相关bzip压缩解压操作,而且GZIPInputStream有个地方没有close。

    GZIPInputStream使用Inflater申请堆外内存,Deflater释放内存,调用close()方法来主动释放。如果忘记关闭,Inflater对象的生命会延续到下一次GC。在此过程中,堆外内存会一直增长。

    原代码:

    public byte[] decompress ( byte[] input) throws IOException {

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    IOUtils.copy(new GZIPInputStream(new ByteArrayInputStream(input)), out);

    return out.toByteArray();

    }

    修改后:

    public byte[] decompress(byte[] input) throws IOException {

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(input));

    IOUtils.copy(gzip, out);

    gzip.close();

    return out.toByteArray();

    }

    经观察,问题解决。

    qrcode_for_gh_183eb256f8af_1280.jpg 

    订阅微信公众号,小姐姐,教你玩架构~

    展开全文
  • 查看java内存情况的几个常用命令

    千次阅读 2021-02-12 16:18:32
    1、jinfojinfo:的用处比较简单,就是能输出并修改运行时的...2、jps显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),不过jps...

    1、jinfo

    jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt pid 如:查看52606的MaxPerm大小可以用 jinfo -flag MaxPermSize 52606。

    8ccdb7dc393aa0ca1a5d0797e754b553.png

    2、jps

    显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),不过jps有个缺点是只能显示当前用户的进程id,要显示其他用户的还只能用linux的ps命令。

    9d3eb64e50625b2486a429d3ff819edc.png

    执行jps命令,会列出所有正在运行的java进程,其中jps命令也是一个java程序,前面的数字就是对应的进程id,这个id的作用非常大,后面会有相关介绍。

    jps -help:

    fb2ff5a1f351e4b2bd1f1db599cd92ae.png

    jps -l :

    b83d30e304f5c727a11d96659f1d8aab.png

    输出应用程序main.class的完整package名或者应用程序jar文件完整路径名

    jps -v: 输出传递给JVM的参数

    128d4ed83bf9683ebaf457088aed2e0a.png

    jps失效

    我们在定位问题过程会遇到这样一种情况,用jps查看不到进程id,用ps -ef | grep java却能看到启动的java进程。

    要解释这种现象,先来了解下jps的实现机制:

    java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,文件名就是java进程的pid,因此jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。

    我们来思考下:如果由于磁盘满了,无法创建这些文件,或者用户对这些文件没有读的权限。又或者因为某种原因这些文件或者目录被清除,出现以上这些情况,就会导致jps命令失效。

    如果jps命令失效,而我们又要获取pid,还可以使用以下两种方法:

    1、top | grep java

    2、ps -ef |grep java

    3、jstat

    jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。

    jstat -class pid:显示加载class的数量,及所占空间等信息。

    jstat -compiler pid:显示VM实时编译的数量等信息。

    jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

    jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。

    jstat -gcnew pid:new对象的信息。

    jstat -gcnewcapacity pid:new对象的信息及其占用量。

    jstat -gcold pid:old对象的信息。

    jstat -gcoldcapacity pid:old对象的信息及其占用量。

    jstat -gcpermcapacity pid: perm对象的信息及其占用量。

    jstat -util pid:统计gc信息统计。

    jstat -printcompilation pid:当前VM执行的信息。

    除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 260 6是每260毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

    4、jmap

    主要用于打印指定java进程的共享对象内存映射或堆内存细节。

    堆Dump是反映堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。一般在内存不足,GC异常等情况下,我们会去怀疑内存泄漏,这个时候就会去打印堆Dump。

    jmap的用法:

    1a64062ea6e64ca3a93435649f5852e1.png

    jmap pid

    b67c4ff2b3c71ed3678565006a3614c0.png

    打印的信息分别为:共享对象的起始地址、映射大小、共享对象路径的全程。

    jmap -heap pid:查看堆使用情况

    93082295ef3d3c80d6fa2ad9ff400ab6.png

    map -histo pid:查看堆中对象数量和大小

    016037b35d150a49604fed40098cf032.png

    打印的信息分别是:序列号、Class实例的数量、内存的占用、类限定名

    如果是内部类,类名的开头会加上*,如果加上live子参数的话,如jmap -histo:live pid,这个命名会触发一次FUll GC,只统计存活对象

    展开全文
  • 浅谈Java栈内存和堆内存

    千次阅读 2022-03-22 10:22:50
    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过...

    介绍Java语言有关内存分配的知识。Java语言把内存分为两种:栈内存堆内存

    栈内存

    在方法中定义的一些基本类型的变量对象的引用变量都在方法的栈内存中分配,当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立刻被另作他用。


    堆内存

    堆内存用来存放由 new 运算符创建的数组或对象,在堆中分配的内存,由Java虚拟机的垃圾回收器来自动管理。在堆中创建了一个数组或对象后,同时还在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。

    引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。引用变量就相当于是为数组或对象起的一个名称。而数组或对象本身在堆内存中分配,即使程序运行到使用 new 运算符创建数组或对象的语句所在的代码块之外,数组或对象本身所占据的内存也不会被释放,数组或对象在没有引用变量指向它时,会变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器收走(释放掉),这也是Java比较占内存的原因。

    Java有一个特殊的引用型常量null,如果将一个引用变量赋值为null,则表示该引用变量不指向(引用)任何对象。


    下面通过一个数组案例进行演示,以对栈内存和堆内存有更深的了解。

    一维数组是最简单的数组,其逻辑结构是线性表。要使用一维数组,需要先声明数组;分配空间;创建数组元素并赋值。

    数据类型 [] 数组名;             //声明一维数组
    
    数组名 = new 数据类型[个数];    //分配内存给数组
    

    在数组的声明格式里,“数据类型”是声明数组元素的数据类型,可以是Java语言中任意的数据类型,包括基本类型和引用类型。

    与C/C++语言不同,Java语言在数组的定义中并不为数组元素分配内存,因此“[]”中不用给出数组中元素的个数(即数组的长度),但必须在为它分配内存空间后才可使用。

    数组声明之后,接下来就要分配数组所需的内存,这时必须用运算符new,利用new运算符为数组元素分配内存空间的方式称为动态内存分配方式

    int [] x;    //声明名称为x的int型数组
    x = new int[10]; //x数组中包含有10个元素,并为这10元素分配内存空间
    

    在声明数组时,也可以将两个语句合并成一行,格式如下:

    数据类型 [] 数组名 = new 数据类型[个数];
    int [] x = new int[10];
    

    等号左边的 “int [] x ”相当于定义了一个特殊的变量x,x的数据类型是一个对 int 型数组对象的引用,x就是一个数组的引用变量,其引用的数组元素个数不定。等号右边的 “new int[10]” 就是在堆内存中创建一个具有10个int型变量的数组对象。其意义就是将右边的数组对象赋值给左边的数组引用变量。

    这里我们先声明一个数组,例如:

    int [] x;  //定义了一个数组x
    

    这条语句执行完成后的内存状态如图下所示。

    这时只声明了数组,而没有对其分配内存空间。现在我们为数组元素分配内存空间。

    x = new int[10];  //初始化数组
    

    这条语句执行完后的内存状态如图下所示。

    声明数组并分配相应的内存空间,引用变量指向数组对象

    执行“x=new int[10];”后,在堆内存里创建了一个数组对象,为这个数组对象分配了10个整数单元,并将数组对象赋给了数组引用变量x。引用变量就相当于C语言中的指针变量,而数组对象就是指针变量指向的那个内存块。所以在Java内部还是有指针,只是把指针的概念对用户隐藏起来了,而用户所使用的是引用变量。

    用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象。要想让x不指向任何数组对象,只需要将常量null赋给x即可。如执行“x = null;”语句后的内存状态如图下所示。

    执行完“x = null;”语句后,原来通过new int[10]产生的数组对象不再被任何引用变量所引用,变成了所谓的“垃圾”,直到垃圾回收器来将它释放掉。


    感谢大家的耐心阅读,如有建议请私信或评论留言

    展开全文
  • 很多时候,我们运行的Java程序并没有设定堆的内存限制参数,正常来说可以有两个参数来指定初始分配的堆内存堆内存的最大值,分别为: -Xmx 用来设置你的应用程序(不是JVM)能够使用的最大内存数(相当于 -XX:...
  • java 非堆 内存

    千次阅读 2016-06-14 22:30:45
    ”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;堆就是JVM留给自己用
  • Java堆内存初始大小

    千次阅读 2019-06-28 10:08:19
    Java堆内存初始大小 大厂面试题: 1、JVM垃圾回收时候如何确定垃圾?是否知道什么是GC Roots 2、你说你做过JVM参数调优和参数配置,请问如何盘点查看JVM系统默认值 3、你平时工作中用过的JVM常用基本配置参数有...
  • 查看Java进程的堆内存: [root@~]# jmap -heap 21945 Attaching to process ID 21945, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 ...
  • Java直接内存和堆内存的性能比较

    千次阅读 2016-09-08 11:17:06
    它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。 这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数
  • Java堆内存泄露分析

    千次阅读 2019-02-28 16:12:10
    查看堆内存占用正常,jvm垃圾回收也没有异常。而top出来显示java占用内存是几个G,那么可能想到了是堆外内存泄漏。 需要安装google-perftools工具进行分析 1.先安装g++ 不然编译会报错:g++: comma...
  • Java内存机制和内存地址

    千次阅读 2021-02-12 20:49:43
    //true 由于以上问题让我含糊不清,于是特地搜集了一些有关java内存分配的资料,以下是网摘: Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用...
  • Java堆内存设置

    万次阅读 2018-07-12 22:41:24
    堆内存设置原理JVM堆内存分为2块:永久空间和堆空间。永久即持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。Heap = {Old + NEW = {Eden,from,to}},Old即...
  • 它显示一个应用内存使用量的实时图表,让您可以捕获转储、强制执行垃圾回收以及跟踪内存分配。要打开 Memory Profiler,请按以下步骤操作:点击 View &gt; Tool Windows &gt; Android Profiler(也可以...
  • Java堆内存Heap与堆内存Non-Heap概要

    千次阅读 2017-10-20 10:16:28
    JAVA虚拟机内存结构分为以下5部分:程序计数器,虚拟机栈,本地方法栈,方法区,堆。...堆内存又可以分为新生代、年老代、永久代,具体垃圾回收机制查看另一篇文章Java虚拟机:Java垃圾回收(GC)机制详解。
  • JAVA直接内存内存

    千次阅读 2019-03-25 13:57:05
    内存介绍
  • 解决办法:如果是内存泄漏,课进一步通过工具查看泄漏对象到GC Roots 的引用链。于是就能找到泄漏对象是通过的路径与GC Roots 相关链并导致垃圾收集器无法自动回收它们的。掌握了泄漏对象的类型信息,以及GC Roots...
  • Java堆内存:堆外内存回收方法

    千次阅读 2019-10-24 17:36:17
    一、JVM内存的分配及垃圾回收  对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下:  新生代:一般来说新创建的对象都分配在这里。  年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面...
  • JAVA7、JAVA8的堆内存有啥变化

    万次阅读 多人点赞 2016-07-12 16:50:15
    OK,华为面试官的又一个考倒我的问题。回来找了下资料,总结如下。  快速过一遍JVM的内存结构,...是的——都怪new操作符,是它把你的Java堆都占满了的!它由所有线程共享当堆耗尽的时候,JVM会抛出java.lang.OutOfMe
  • Java生成堆内存dump

    万次阅读 2018-11-28 00:10:37
    在处理压力测试问题的时候,经常遇到OOM的情况,这时候我们需要去记录内存实时的情况,一般会打出一个dump文件,而后再使用MAT等内存分析工具去查看哪些对象一直占用了大量内存,最终分析出代码需要优化的地方。...
  • 浅析Java堆内存和栈内存的区别

    万次阅读 2018-03-06 09:36:55
    参考 堆内存:https://baike.baidu.com/item/%E5%A0%86%E5%86%85%E5%AD%98/7270805?fr=aladdin ...Java把内存划分成两种:一种是栈内存,一种是堆内存。 一、栈内存 存放基本类型的变量,对象的引用和方...
  • Java堆内存使用

    千次阅读 2018-10-24 21:49:21
    JVM内部会把所有内存分成Java使用的堆内存和Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了时,如果Java堆又有空闲内存,这时Native会重新向Jvm申请,而不是直接使用Java堆内存。...
  • NIO详解(六):Java堆内存

    千次阅读 2019-03-20 21:52:30
    内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存。那么内存就是存在于JVM管控之外的一块内存区域...
  • Linux java 内存与堆栈信息查看

    千次阅读 2018-08-21 14:49:15
    ./jstack -l pid 命令查看当前java进程的堆栈状态 ./jmap -histo pid | grep activemq.command activemq所占内存空间 ./jmap -histo 5585 | head -n100
  • java堆内存和栈内存的区别

    千次阅读 2018-04-22 17:02:11
    总结:1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等2 堆:为成员分配和释放,由程序员自己申请、自己释放。...Java堆内存堆内存在Java运行时被使用来为对象和JRE类分配内存。不论什...
  • 分析Java堆内存溢出的原因

    千次阅读 2020-10-21 15:39:39
    1、堆溢出   一般来说,绝大部分Java的内存溢出都属于堆溢出。原因是因为大量对象占据了堆空间,这些对象都持有强引用...直接内存的申请速度一般比堆内存慢,但是访问速度快于堆内存。 对于那些可复用的,并且会被经
  • JVM堆内存非堆内存(heap)官方详解

    千次阅读 2019-04-02 14:48:10
    JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。 先看下JAVA堆内存是如何划分的,如图: Java堆内存又溢出了!教你一招...
  • Java分配的非空对象都是由java虚拟机的垃圾收集器管理的,这一部分称为内存,虚拟机会定期对垃圾内存进行回收,在某些特定的时间点,它会进行一次彻底的回收(full gc)。彻底回收时,垃圾收集器...
  • 1.查看当前java进程的pid pgrep -lf java 2.查看java堆的详细信息 jmap -heap PID

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 452,023
精华内容 180,809
关键字:

java查看非堆内存

java 订阅
友情链接: GPS_SDR_CONSOLE.rar