赞
踩
了解什么是JVM,以及JVM的作用、结构、算法、启动流程、配置参数、监控命令和工具等。
如果你目前对Java一无所知,请先进行Java基础入门,从Java基础环境安装开始。
针对Java虚拟机的实现有专门的《Java虚拟机规范》,在这一规范下有多种不同的虚拟机实现。
Java SE默认使用的是HotSpot版本的虚拟机。所以通常情况下,我们所讲的java虚拟机指的是HotSpot的版本。
本文讲解内容基于版本:Java8。
JVM是Java Virtual Machine的缩写,即Java虚拟机。
Java虚拟机只要有两方面作用:
线程私有内存:橘色块为线程私有内存。
线程共享内存:
Java堆:存放Java对象实例,存放字符串常量。这里是GC的主要区域。
元空间:类元信息(klass)、字段、静态属性、方法、常量,还有运行时常量池等。
线程共享内存存放的数据可以通过ThreadLocal转换为线程私有。
了解垃圾回收之前,先要了解JVM怎么分配内存,然后识别哪些内存是垃圾,需要回收。最后才是用什么方式回收。
Java与C、C++不同,C、C++每次申请内存都要调用malloc进行系统调用,这需要一定的开销。Java虚拟机是一次性申请一块较大的空间,除非需要进行内存扩展,否则都是在这一块内存中由虚拟机进行分配和释放。
这样减少了系统调用次数,节省了一定的开销,我们可以把这一块内存称作内存池。
但缺点也是显而易见的,Java进程不论实际用到了多少内存都要先占用一块较大的内存空间(这也是Java通常被诟病的地方),而且还要为虚拟机的内存管理单独制定算法。
垃圾回收器要完成两件事:检测出垃圾、回收垃圾。
垃圾检测法有引用计数法和可达性算法。我们这里只讲解Java虚拟机采用的可达性算法。
可达性算法:以根集对象为起点进行搜索,如果有对象不可达,即为垃圾对象。
根集对象包括:
GC主要分二类,新生代GC,老年代GC;
新生代GC包括:串行GC、并行GC、并行回收GC;
老年代GC包括:串行GC、并行GC、CMS;
G1比较特殊,同时支持新生代和老年代。
例子:
jmap -histo <pid> # 打印对象统计信息
例子:
jmap -dump:format=b,file=<file-path> <pid> # 打印对象统计信息
例子:
可配合watch命令一起使用
watch jmap -heap <pid> # 打印堆信息
结果:
Attaching to process ID 25419, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 using thread-local object allocation. Parallel GC with 4 thread(s) 堆配置 Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 2051014656 (1956.0MB) NewSize = 42991616 (41.0MB) MaxNewSize = 683671552 (652.0MB) 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 = 341835776 (326.0MB) used = 326467304 (311.3434829711914MB) free = 15368472 (14.656517028808594MB) 95.50413588073356% used From Space: capacity = 48234496 (46.0MB) used = 14614528 (13.9375MB) free = 33619968 (32.0625MB) 30.29891304347826% used To Space: capacity = 45613056 (43.5MB) used = 0 (0.0MB) free = 45613056 (43.5MB) 0.0% used PS Old Generation capacity = 181403648 (173.0MB) used = 116113280 (110.7342529296875MB) free = 65290368 (62.2657470703125MB) 64.00823868768063% used 17633 interned Strings occupying 1610056 bytes.
例子:
jstat -gc <pid> 250 4
结果:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
44544.0 47104.0 0.0 14272.0 333824.0 324577.7 177152.0 113391.9 51160.0 48283.5 6656.0 6139.5 13 0.543 3 0.901 1.444
44544.0 47104.0 0.0 14272.0 333824.0 324577.7 177152.0 113391.9 51160.0 48283.5 6656.0 6139.5 13 0.543 3 0.901 1.444
44544.0 47104.0 0.0 14272.0 333824.0 324577.7 177152.0 113391.9 51160.0 48283.5 6656.0 6139.5 13 0.543 3 0.901 1.444
44544.0 47104.0 0.0 14272.0 333824.0 324577.7 177152.0 113391.9 51160.0 48283.5 6656.0 6139.5 13 0.543 3 0.901 1.444
字段描述:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。