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/ 访问