博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java命令--jmap命令使用
阅读量:6326 次
发布时间:2019-06-22

本文共 3060 字,大约阅读时间需要 10 分钟。

jdk安装后会自带一些小工具,jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。

jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。可以使用jmap生成Heap Dump。

java memory = direct memory(直接内存) + jvm memory(MaxPermSize +Xmx)

  1. )直接内存跟堆

直接内存则是一块由程序本身管理的一块内存空间,它的效率要比标准内存池要高,主要用于存放网络通信时数据缓冲和磁盘数据交换时的数据缓冲。

DirectMemory容量可以通过 -XX:MaxDirectMemorySize指定,如果不指定,则默认为与Java堆的最大值(-Xmx指定)一样。但是,在OSX上的最新版本的 JVM,对直接内存的默认大小进行修订,改为“在不指定直接内存大小的时默认分配的直接内存大小为64MB”,可以通过 -XX:MaxMemorySize来显示指定直接内存的大小。

  1. 堆(Heap)和非堆(Non-heap)内存

按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。

可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,
所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

  1. 栈与堆
    栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。

Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类 型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

  1. 线程占用大小在MaxPermSize中进行内存申请和分配
[root@izm5e5xf4ylewnqwanhz1mz ~]# jmap -heap 19518Attaching to process ID 19518, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.171-b11using thread-local object allocation.Mark Sweep Compact GCHeap Configuration:   MinHeapFreeRatio         = 40   MaxHeapFreeRatio         = 70   MaxHeapSize              = 262144000 (250.0MB)   NewSize                  = 5570560 (5.3125MB)   MaxNewSize               = 87359488 (83.3125MB)   OldSize                  = 11206656 (10.6875MB)   NewRatio                 = 2   SurvivorRatio            = 8   MetaspaceSize            = 21807104 (20.796875MB)   CompressedClassSpaceSize = 1073741824 (1024.0MB)   MaxMetaspaceSize         = 17592186044415 MB   G1HeapRegionSize         = 0 (0.0MB)Heap Usage:New Generation (Eden + 1 Survivor Space):   capacity = 72548352 (69.1875MB)   used     = 15588880 (14.866714477539062MB)   free     = 56959472 (54.32078552246094MB)   21.487572867265133% usedEden Space:   capacity = 64487424 (61.5MB)   used     = 11725224 (11.182044982910156MB)   free     = 52762200 (50.317955017089844MB)   18.182186964081556% usedFrom Space:   capacity = 8060928 (7.6875MB)   used     = 3863656 (3.6846694946289062MB)   free     = 4197272 (4.002830505371094MB)   47.93066009273374% usedTo Space:   capacity = 8060928 (7.6875MB)   used     = 0 (0.0MB)   free     = 8060928 (7.6875MB)   0.0% usedtenured generation:   capacity = 161054720 (153.59375MB)   used     = 116503616 (111.10650634765625MB)   free     = 44551104 (42.48724365234375MB)   72.33790850712106% used32330 interned Strings occupying 3738080 bytes.[root@izm5e5xf4ylewnqwanhz1mz ~]#

转载于:https://blog.51cto.com/357712148/2308164

你可能感兴趣的文章
poj_2553 强连通分支&出度为0的点
查看>>
protocol buffer
查看>>
【php】使用gdb调试php程序
查看>>
使用jquery+一般处理程序异步载入信息
查看>>
JSP指令与动作元素
查看>>
《荣枯鉴》明鉴卷六
查看>>
(转)
查看>>
小儿低热咳喘案
查看>>
命令拷屏之系统性能监测
查看>>
Apache Spark简单介绍、安装及使用
查看>>
poj2894
查看>>
SocketChannel / ServerSocketChannel / Selector
查看>>
android 开发 @override 编译错误 解决办法(转载)
查看>>
C# 的关键字系列 (3 of n)
查看>>
pku 1703(种类并查集)
查看>>
Join方法把阵列转为字符串
查看>>
《从设计到模式》——设计模式视频教程
查看>>
验证码 禁止输入中文
查看>>
为MyEclipse加入自己定义凝视
查看>>
Go语言中Socket通信TCP服务端
查看>>