jvm


jvmJVM虚拟机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 - [-t] [-h] [ []] 其中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