JVM

JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

JAVA内存区域及使用分配

1、程序计数器
程序计数器(Program CounterRegister)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。此内存区域是唯一一个在Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

2、Java 虚拟机栈
每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

3、本地方法栈
本地方法栈(Native MethodStacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。

4、Java 堆
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配,不是“绝对”的。
Java堆是垃圾收集器管理的主要区域,按照分代收集算法的划分,堆内存空间可以继续细分为年轻代,老年代。年轻代又可以划分为较大的Eden区,两个同等大小的From Survivor,To Survivor区。默认的Eden区和Survivor区的大小比例为8:1:1,这个比例可以调节。在为新创建的对象分配内存的时候先将对象分配到Eden区和From Survivor区,在立即回收时,会将Eden区和Survivor区还存活的对象复制到To Survivor区中,如果To Survivor区的大小不能容纳存活的对象,会把存活的对象分配到老年区。总体来说,新创建的小对象会放在年轻代,年轻代的对象大多在下一次垃圾回收时被回收,老年代存储大的对象和存活时间长的对象。

  • 永久代(Perm):主要保存class,method,field等对象,该空间大小,取决于系统启动加载类的数量,一般该区域内存溢出均是启动时溢出。java.lang.OutOfMemoryError: PermGen space
  • 老年代(Old):一般是经过多次垃圾回收(GC)没有被回收掉的对象
  • 新生代(Eden):新创建的对象,
  • 新生代(Survivor0):经过垃圾回收(GC)后,没有被回收掉的对象
  • 新生代(Survivor1):同Survivor0相同,大小空间也相同,同一时刻Survivor0和Survivor1只有一个在用,一个为空

JVM堆的配置

1. JVM运行时堆的大小   
-Xms堆的最小值   
-Xmx堆空间的最大值
2. 新生代堆空间大小调整   
-XX:NewSize新生代的最小值   
-XX:MaxNewSize新生代的最大值   
-XX:NewRatio设置新生代与老年代在堆空间的大小
-XX:SurvivorRatio新生代中Eden所占区域的大小
3. 永久代大小调整   
-XX:MaxPermSize
4. 其他  
-XX:MaxTenuringThreshold,设置将新生代对象转到老年代时需要经过多少次垃圾回收,但是仍然没有被回收

5、方法区(非堆)
方法区(Method Area)与Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

6、直接内存
直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError 异常出现,所以我们放到这里一起讲解。
在JDK 1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java 堆和Native 堆中来回复制数据。

GC的三种收集算法的原理和特点,用途,优化思路

三种垃圾收集算法:复制算法,标记-清除算法、标记-整理算法

标记-清除算法:首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象。缺点:标记和清除两个过程效率都不高;标记清楚后会产生空间碎片,空间碎片导致分配较大对象时可能提前出发垃圾回收。

复制算法:将可用内存分为两个区域,每次只使用其中一块,当使用的那一块内存用完时,将还存活的对象复制到另外一块内存中,然后把已使用过的内存空间一次清理掉。优点:解决的空间碎片问题,实现简单。缺点:将内存缩小为两块,内存使用率不高。复制操作频繁效率变低。

标记-整理算法:可回收对象标记后,让所有存活的对象向一端移动,然后清理掉边界以外的内存。优点:不会产生空间碎片,比复制算法提高了内存空间利用率。

复制算法用在年轻代的垃圾回收中,标记整理和标记清除算法用在老年代垃圾回收的收集器中

类加载过程:加载、验证、准备、解析、初始化

虚拟机的类加载机制就是把描述类的数据从Class文件(或者其他途径)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

加载
1.通过一个类的全限定名获取定义此类的二进制字节流
2、将这个字节流所戴晓的静态结构转化为方法区的运行时数据结构
3、在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。

验证
1、文件格式验证,保证输入的字节流在格式上符合Class文件的格式规范,保证输入的字节流能正确的解析,只有通过这个验证,字节流才会存储在方法区之内
2、元数据验证,对类的元数据进行语义校验,保证类描述的信息符合Java语言规范。比如验证类的是否实现了父类或者接口中的方法等
3、字节码验证,通过数据流和控制流的分析,确保类的方法符合逻辑,不会在运行时对虚拟机产生危害
4、符号引用校验,发生在解析阶段,确保解析阶段将符号引用转化为直接饮用的正常执行。

准备:正式为类变量(static)分配内存,并设置类变量初始值(数据类型的零值),这些变量所使用的内存在方法区中分配。

解析:虚拟机将常量池内的符号引用转化为直接饮用,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

初始化:初始化阶段才真正执行类中定义的Java代码,初始化阶段是执行类构造器<init>方法的过程。<init>方法(类构造器)是由编译器自动收集类中的静态变量和静态代码块合并产生的。子类和父类的初始化过程优先级为:父类类构造器->子类类构造器->父类对象构造函数->子类对象构造函数。类中静态类变量和静态代码块是按照在类中定义的顺序执行的。

jstat 命令查看jvm的GC情况

语法结构:

Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数解释:
Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次


S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)

S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

其它参数:
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制

jmap


can@can:~$ jmap 28836
Attaching to process ID 28836, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:163)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:278)
    at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
    at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)
    at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)
    at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
    at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
    at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
    at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.tools.jmap.JMap.runTool(JMap.java:201)
    at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$100(LinuxDebuggerLocal.java:62)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1AttachTask.doit(LinuxDebuggerLocal.java:269)
    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

解决方法:

sudo vi /etc/sysctl.d/10-ptrace.conf

将1改为0

重启机器

jmap 命令

can@can:~$ jmap -help
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

参数:

option:选项参数,不可同时使用多个选项参数

pid:java进程id,命令ps -ef | grep java获取

executable:产生核心dump的java可执行文件

core:需要打印配置信息的核心文件

remote-hostname-or-ip:远程调试的主机名或ip

server-id:可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器

-heap

打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况

can@can:~$ jmap -heap 3242
Attaching to process ID 3242, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.45-b02

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2071986176 (1976.0MB)
   NewSize                  = 42991616 (41.0MB)
   MaxNewSize               = 690487296 (658.5MB)
   OldSize                  = 87031808 (83.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 25165824 (24.0MB)
   used     = 12917560 (12.319145202636719MB)
   free     = 12248264 (11.680854797363281MB)
   51.32977167765299% used
From Space:
   capacity = 7864320 (7.5MB)
   used     = 5162376 (4.923225402832031MB)
   free     = 2701944 (2.5767745971679688MB)
   65.64300537109375% used
To Space:
   capacity = 7864320 (7.5MB)
   used     = 0 (0.0MB)
   free     = 7864320 (7.5MB)
   0.0% used
PS Old Generation
   capacity = 81264640 (77.5MB)
   used     = 46204896 (44.064422607421875MB)
   free     = 35059744 (33.435577392578125MB)
   56.857319493447584% used

27082 interned Strings occupying 3185616 bytes.

-finalizerinfo

打印等待回收的对象信息

can@can:~$ jmap -finalizerinfo 3242
Attaching to process ID 3242, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.45-b02
Number of objects pending for finalization: 0

-histo

打印堆的对象统计,包括对象数、内存大小等等。jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

can@can:~$ jmap -histo 3242

 num     #instances         #bytes  class name
----------------------------------------------
   1:        150706       16495616  [C
   2:         12399        7894472  [B
   3:          9547        4026712  [I
   4:        144438        3466512  java.lang.String
   5:         31008        1806344  [Ljava.lang.Object;
   6:         18012        1585056  java.lang.reflect.Method
   7:         11921        1325616  java.lang.Class
   8:         41307        1321824  java.util.concurrent.ConcurrentHashMap$Node
   9:         11489        1255536  [Ljava.util.HashMap$Node;
  10:         13356         854784  com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty
  11:         24369         779808  java.util.HashMap$Node
  12:         21112         675584  java.util.Hashtable$Entry
  13:         25152         603648  java.util.ArrayList
  14:         13340         533600  java.util.LinkedHashMap$Entry
  15:         13974         447168  java.util.concurrent.locks.ReentrantLock$NonfairSync
  16:          9099         436752  java.util.HashMap
  17:           251         436288  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  18:         18118         434832  com.ule.tools.kafka.admin.core.models.ConsumerSummary
  19:         24919         398704  java.lang.Object
  20:          6535         365960  java.util.LinkedHashMap
  21:           149         334704  [Ljava.nio.ByteBuffer;
  22:          4664         298496  com.mysql.jdbc.ConnectionPropertiesImpl$StringConnectionProperty
  23:         13551         297352  [Ljava.lang.Class;
  24:         11986         287664  java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
  25:          6767         270680  java.lang.ref.Finalizer
  26:          5099         231136  [Ljava.lang.String;
  27:           619         208424  [Ljava.util.Hashtable$Entry;
  28:          3180         203520  com.mysql.jdbc.ConnectionPropertiesImpl$IntegerConnectionProperty
  29:          6325         202400  java.lang.ref.WeakReference
  30:         12629         202064  java.util.concurrent.locks.ReentrantLock
  31:         12400         198400  java.util.concurrent.atomic.AtomicInteger
  32:          2325         186000  [Ljava.util.concurrent.RunnableScheduledFuture;
  33:          4642         185680  com.google.common.util.concurrent.ThreadFactoryBuilder$1
  34:          2321         185680  java.util.concurrent.ScheduledThreadPoolExecutor
  35:          4548         181920  java.lang.ref.SoftReference
  36:          7467         179208  org.springframework.core.MethodClassKey
  37:          2330         167760  java.util.concurrent.ThreadPoolExecutor
  38:           106         129744  com.mysql.jdbc.JDBC4Connection
  39:          1595         127600  java.lang.reflect.Constructor
  40:          5173         124152  java.util.concurrent.atomic.AtomicLong
  41:          2383         114384  java.util.concurrent.LinkedBlockingQueue
  42:          2003         112168  org.codehaus.groovy.runtime.metaclass.MetaMethodIndex$Entry
  43:          4643         111432  java.util.concurrent.Executors$DefaultThreadFactory
  44:          4390         105360  java.beans.MethodRef
  45:          1097         105312  org.springframework.beans.GenericTypeAwarePropertyDescriptor
  46:          2976          95232  java.util.LinkedList
  47:          1289          92808  java.lang.reflect.Field
  48:          5773          92368  java.util.HashSet
  49:          2251          90040  java.util.TreeMap$Entry
  50:          2792          89344  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
  51:          2682          85824  java.io.FileDescriptor
  52:          5237          83792  java.util.HashMap$KeySet
  53:          2325          74400  java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
  54:          4643          74288  org.apache.curator.utils.ThreadUtils$1
  55:          3090          74160  java.util.LinkedList$Node
  56:          1850          74000  java.util.HashMap$KeyIterator
  57:          1509          72432  java.nio.HeapByteBuffer
  58:          2228          71296  java.io.FileInputStream
  59:          1248          69888  java.beans.MethodDescriptor
  60:          1171          65576  org.codehaus.groovy.reflection.GeneratedMetaMethod$Proxy
  61:          2453          58872  java.util.concurrent.LinkedBlockingQueue$Node
  62:           815          58680  org.springframework.core.annotation.AnnotationAttributes
  63:          3362          53792  java.lang.Integer
  64:           660          52800  com.google.common.cache.LocalCache$Segment
  65:           814          52096  org.springframework.core.MethodParameter
  66:          1247          49880  java.util.WeakHashMap$Entry
  67:           129          48504  java.lang.Thread
  68:          1492          47744  com.sun.org.apache.xerces.internal.xni.QName
  69:          1459          46688  java.lang.ref.ReferenceQueue
  70:          2823          45168  java.util.LinkedHashSet
  71:           919          44112  org.apache.tomcat.util.modeler.AttributeInfo
  72:          1793          43032  java.util.jar.Attributes$Name
  73:           376          42112  java.net.SocksSocketImpl
  74:           751          42056  java.lang.Package
  75:           283          42032  [Lorg.codehaus.groovy.util.ComplexKeyHashMap$Entry;
  76:           651          41664  java.util.concurrent.ConcurrentHashMap
  77:           613          39232  org.codehaus.groovy.reflection.CachedMethod
  78:          2319          37104  java.util.concurrent.Executors$FinalizableDelegatedExecutorService
  79:          1472          35328  sun.reflect.generics.tree.SimpleClassTypeSignature
  80:          1103          35296  java.lang.ThreadLocal$ThreadLocalMap$Entry
  81:           869          34760  javax.servlet.jsp.tagext.TagAttributeInfo
  82:           474          34128  java.beans.PropertyDescriptor
  83:           848          33920  sun.misc.Cleaner
  84:           576          33416  [Z
  85:           519          33216  com.mysql.jdbc.PreparedStatement$ParseInfo
  86:           293          33072  [Ljava.util.WeakHashMap$Entry;
  87:           688          33024  ch.qos.logback.classic.Logger
  88:           292          32704  java.util.GregorianCalendar
  89:            58          32096  [[C
  90:           632          30336  org.springframework.util.ConcurrentReferenceHashMap$SoftEntryReference
  91:          1847          29552  java.util.LinkedHashMap$LinkedKeySet
  92:           603          28944  org.codehaus.groovy.util.ReferenceType$SoftRef
  93:           300          28800  sun.util.calendar.Gregorian$Date
  94:           889          28448  org.codehaus.groovy.util.SingleKeyHashMap$Entry
  95:           695          27800  java.math.BigInteger
  96:           579          27792  java.nio.HeapCharBuffer
  97:          1472          27328  [Lsun.reflect.generics.tree.TypeArgument;
  98:           162          27216  org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition
  99:           422          27008  java.net.URL
 100:          1679          26864  org.springframework.core.annotation.AnnotationUtils$DefaultValueHolder
 101:            13          26832  [Lorg.apache.ibatis.ognl.internal.Entry;
 102:           826          26432  java.nio.DirectByteBuffer$Deallocator
 103:           466          26096  java.util.zip.ZipFile$ZipFileInputStream
 104:           465          26040  java.util.zip.ZipFile$ZipFileInflaterInputStream
 105:           812          25984  sun.security.util.DerInputBuffer
 106:           812          25984  sun.security.util.DerValue
 107:          1185          25808  [Ljava.lang.reflect.Type;
 .
 .
 .
  • jmap输出中class name非自定义类的说明:
BaseType Character Type Interpretation
B byte signed byte
C char Unicode character
D double double-precision floating-point value
F float single-precision floating-point value
I int integer
J long long integer
L; reference an instance of class
S short signed short
Z boolean true or false
[ reference one array dimension,[I表示int[]
can@can:~$ jmap -dump:format=b,file=***.dat 2911
Dumping heap to /home/can/kafkaAdmin.dat ...
Heap dump file created

使用jhat辅助查看

can@can:~$ jhat -help
Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

    -J<flag>          Pass <flag> directly to the runtime system. For
              example, -J-mx512m to use a maximum heap size of 512MB
    -stack false:     Turn off tracking object allocation call stack.
    -refs false:      Turn off tracking of references to objects
    -port <port>:     Set the port for the HTTP server.  Defaults to 7000
    -exclude <file>:  Specify a file that lists data members that should
              be excluded from the reachableFrom query.
    -baseline <file>: Specify a baseline object dump.  Objects in
              both heap dumps with the same ID and same class will
              be marked as not being "new".
    -debug <int>:     Set debug level.
                0:  No debug output
                1:  Debug hprof file parsing
                2:  Debug hprof file parsing, no server
    -version          Report version number
    -h|-help          Print this help and exit
    <file>            The file to read

For a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#<number>" to the file name, i.e. "foo.hprof#3".

All boolean options default to "true"
can@can:~$ jhat -port 7000 ***.dat 
Reading from kafkaAdmin.dat...
Dump file created Tue Feb 27 15:46:26 CST 2018
Snapshot read, resolving...
Resolving 5371763 objects...
Chasing references, expect 1074 dots..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Eliminating duplicate references..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

然后浏览器输入:localhost:7000/ 访问

QQ截图20180227155450.png
QQ截图20180227155505.png

Jstack/Jmap .... 有时间更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 1.一些概念 1.1.数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始...
    落落落落大大方方阅读 4,524评论 4 86
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,954评论 2 31
  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 2,493评论 2 26
  • 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器...
    jemmm阅读 2,227评论 0 9
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 732评论 0 1