jvm
jvm
JVM虚拟机
JVM管理的内存段可分为两大类:线程共享内存和线程私有内存
线程共享内存:
方法区:存储jvm加载的class,常量,静态变量,即时编译器编译后的代码等
Java堆:存储java的所有对象实例,数组等
线程私有内存:
程序计数寄存器:每个线程都有自己的计数寄存器,存储当前线程执行字节码的地址;
jvm栈:jvm会为每个运行线程分配一个栈区,线程调用方法时和方法返回时会进行入栈和出栈操作;
本地方法栈区:与jvm stack类似,只不过此区域是为调用本地方法服务
JVM HEAP内存空间:
新生代:
新生区:Dden:初创对象
存活区:survivor:步入成熟区的初创对象:
ss1:
ss2:
老年代:
mark(先标记)---->compact
持久代:
垃圾回收器:
新生代回收:Minor GC
老年代回收:Major GC (Full GC)
堆内存空间的调整参数:
-Xmx:新生代和老年代总共可用的最大空间;
-Xms:二者初始空间之和;
-XX:NewSize:新生代初始空间;
-XX:MaxNewSize:新生代的最大空间;
-XX:MaxPermSize:持久代最大空间;
-XX:PermSize:持久代初始空间;
tomcat而言:
Catalina.sh中有两个环境变量:
CATALINA_OPTS:仅对启动运行tomcat实例的java虚拟机有限;
JAVA_OPTS:对本机上所有的Java虚拟机有限;
##############################################
性能监控工具:
问题:
OutOfMemoryError:内存不足:
内存泄漏:
线程锁死:
锁竞争:Lock Contention
java消耗过多的CPU
jps:java virtual machine process status tool 监控jvm进程状态信息
jps [options] [hostid]
-m:输出传入main方法的参数;
-l:显示main类或jar的完全限定名称;
-v:显示为jvm虚拟机指定的参数;
---------------------------------------
jstack:查看某个java进程内的线程堆栈信息
jstack [options] pid
选项:
-l long strings:输出完成的锁信息;
-m :混合模式:即会输出java堆栈及C/C++堆栈信息;
---------------------------------------
jmap 和jhat:
jmap:jvm memory map:查看堆内存使用情况;
jhat:java heap analysis tool :heap堆分析工具
jmap [options] pid
-heap:详细堆内存空间使用状态信息
-histo[:live]:查看堆内存中的对象数目,大小统计结果
# jmap -dump:live,format=b,file=outfile pid 指定live选项,那么只输出活的对象到文件
# jmap -dump:format=b,file=/tmp/outfile pid
使用hprof二进制形式,输出jvm的heap内容到文件
dump出来的文件可以用MAT、VisualVM等工具查看,或用jhat查看
注意:如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat,然后在浏览器输入主机:9998查看了
# jmap -head java_pid
查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
using parallel threads in the new generation. #新生代采用的是并行线程处理方式
using thread-local object allocation.
Concurrent Mark-Sweep GC #同步并行垃圾回收
Heap Configuration: #堆配置情况
MinHeapFreeRatio = 40 #最小堆使用比例
MaxHeapFreeRatio = 70 #最大堆可用比例
MaxHeapSize = 2147483648 (2048.0MB) #最大堆空间大小
NewSize = 268435456 (256.0MB) #新生代分配大小
MaxNewSize = 268435456 (256.0MB) #最大可新生代分配大小
OldSize = 5439488 (5.1875MB) #老生代大小
NewRatio = 2 #新生代比例
SurvivorRatio = 8 #新生代与suvivor的比例
PermSize = 134217728 (128.0MB) #perm区大小
MaxPermSize = 134217728 (128.0MB) #最大可分配perm区大小
Heap Usage: ##堆使用情况
New Generation (Eden + 1 Survivor Space): #新生代(伊甸区 + survior空间)
capacity = 241631232 (230.4375MB) #伊甸区容量
used = 77776272 (74.17323303222656MB) #已经使用大小
free = 163854960 (156.26426696777344MB) #剩余容量
32.188004570534986% used ##使用比例
Eden Space: ##伊甸区
capacity = 214827008 (204.875MB) ##伊甸区容量
used = 74442288 (70.99369812011719MB) #伊甸区使用
free = 140384720 (133.8813018798828MB) #伊甸区当前剩余容量
34.65220164496263% used #伊甸区使用情况
From Space: ##survior1区
capacity = 26804224 (25.5625MB) #survior1区容量
used = 3333984 (3.179534912109375MB) #surviror1区已使用情况
free = 23470240 (22.382965087890625MB) #surviror1区剩余容量
12.43827838477995% used ##survior1区使用比例
To Space: ##survior2 区
capacity = 26804224 (25.5625MB) #survior2区容量
used = 0 (0.0MB) #survior2区已使用情况
free = 26804224 (25.5625MB) #survior2区剩余容量
0.0% used ## survior2区使用比例
concurrent mark-sweep generation: #老生代使用情况
capacity = 1879048192 (1792.0MB) #老生代容量
used = 30847928 (29.41887664794922MB) #老生代已使用容量
free = 1848200264 (1762.5811233520508MB) #老生代剩余容量
1.6416783843721663% used #老生代使用比例
Perm Generation: #perm区使用情况
capacity = 134217728 (128.0MB) #perm区容量
used = 47303016 (45.111671447753906MB) #perm区已使用容量
free = 86914712 (82.8883285522461MB) #perm区剩余容量
35.24349331855774% used #perm区使用比例
#jmap -histo[:live] java_pid
查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
num #instances #bytes class name
----------------------------------------------
1: 41909 8247920 [C
2: 14409 5753912 [B
3: 5428 1246440 [I
4: 39973 959352 java.lang.String
5: 20718 662976 java.util.HashMap$Node
6: 5242 461296 java.lang.reflect.Method
7: 6990 423744 [Ljava.lang.Object;
注:class name是对象类型
B byte C char D double F float I int J long Z boolean [ 数组,如[I表示int[] [L+类名 其他对象
----------------------------------------
jstat:jvm统计监控工具
jstat -<options> [-t] [-h<lines>] <vmid> [<interal> [<count>]]
其中option为必须提供的选项,所有可用选项可用jstat -option列出
-class
-compile
-gc
-gccapacity
-gccaus
......
字段意义:
S0C,S1C,S0U,S1U:C表示容量,U表示已用量;
EC,EU:Eden区域的容量和已用量;
OC,OU:
PC,PU:
YGC,YGT:新生代的GC次数和耗时;
FGC,FGCT:Full GC 次数和耗时;
GCT:GC总耗时;
两个GUI工具:jconsole,jvisualvm