JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
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 堆中来回复制数据。
三种垃圾收集算法:复制算法,标记-清除算法、标记-整理算法
标记-清除算法:首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象。缺点:标记和清除两个过程效率都不高;标记清楚后会产生空间碎片,空间碎片导致分配较大对象时可能提前出发垃圾回收。
复制算法:将可用内存分为两个区域,每次只使用其中一块,当使用的那一块内存用完时,将还存活的对象复制到另外一块内存中,然后把已使用过的内存空间一次清理掉。优点:解决的空间碎片问题,实现简单。缺点:将内存缩小为两块,内存使用率不高。复制操作频繁效率变低。
标记-整理算法:可回收对象标记后,让所有存活的对象向一端移动,然后清理掉边界以外的内存。优点:不会产生空间碎片,比复制算法提高了内存空间利用率。
复制算法用在年轻代的垃圾回收中,标记整理和标记清除算法用在老年代垃圾回收的收集器中。
虚拟机的类加载机制就是把描述类的数据从Class文件(或者其他途径)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
加载:
1.通过一个类的全限定名获取定义此类的二进制字节流
2、将这个字节流所戴晓的静态结构转化为方法区的运行时数据结构
3、在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。
验证:
1、文件格式验证,保证输入的字节流在格式上符合Class文件的格式规范,保证输入的字节流能正确的解析,只有通过这个验证,字节流才会存储在方法区之内
2、元数据验证,对类的元数据进行语义校验,保证类描述的信息符合Java语言规范。比如验证类的是否实现了父类或者接口中的方法等
3、字节码验证,通过数据流和控制流的分析,确保类的方法符合逻辑,不会在运行时对虚拟机产生危害
4、符号引用校验,发生在解析阶段,确保解析阶段将符号引用转化为直接饮用的正常执行。
准备:正式为类变量(static)分配内存,并设置类变量初始值(数据类型的零值),这些变量所使用的内存在方法区中分配。
解析:虚拟机将常量池内的符号引用转化为直接饮用,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。
初始化:初始化阶段才真正执行类中定义的Java代码,初始化阶段是执行类构造器<init>方法的过程。<init>方法(类构造器)是由编译器自动收集类中的静态变量和静态代码块合并产生的。子类和父类的初始化过程优先级为:父类类构造器->子类类构造器->父类对象构造函数->子类对象构造函数。类中静态类变量和静态代码块是按照在类中定义的顺序执行的。
语法结构:
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 : 最大持有次数限制
can@can:~$ jmap 28836Attaching 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
重启机器
can@can:~$ jmap -helpUsage: 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的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
can@can:~$ jmap -heap 3242Attaching to process ID 3242, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.45-b02using 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% used27082 interned Strings occupying 3185616 bytes.
打印等待回收的对象信息
can@can:~$ jmap -finalizerinfo 3242Attaching 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
打印堆的对象统计,包括对象数、内存大小等等。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 2911Dumping 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 2018Snapshot read, resolving... Resolving 5371763 objects... Chasing references, expect 1074 dots.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. Eliminating duplicate references.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. Snapshot resolved. Started HTTP server on port 7000Server is ready.
然后浏览器输入:localhost:7000/ 访问

QQ截图20180227155450.png

QQ截图20180227155505.png
作者:全能程序猿
链接:https://www.jianshu.com/p/9f4dc50fe965
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1354/viewspace-2819189/ ,如需转载,请注明出处,否则将追究法律责任。