More Related Content Similar to Jvm memory(20) Jvm memory1. JVM Memory
2013.4.19 Xuefeng.Wu
Benewu(at)gmail.com
2. Agenda
• JVM Memory Layout with flag and OOM
• GC
• Debug tools
http://docs.oracle.com/javase/specs/
Run-Time Data Areas
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5
11. Java Object Heap
• -Xmx,-Xms,-Xmn
• Eden, Survivor Space
• -XX:NewRatio =80%, -XX:Survivor
• Old Generation --- Long live, Big Object
• Demo:BigObject.java
12. Perm Space
• -XX:MaxPermSize=128m
• Classes, method
• String pools
14. Socket Buffer
• Revieve ~37K
• Send ~25k
• Java.lang.StackOverflowError
• Demo: SocketBuffer.java
• Too many open files
15. Thread stack
• -Xss
• Each thread has a separate memory space
• Default value dependence on OS
• Demo: ThreadAllocation.java
16. Direct Memory Space
• Map memory outside the java object heap
• Java.nio.ByteBuffer.allocateDirect
• -XX:MaxDirectMemorySize=<value>
32. JVM parameters in Java
http://javarevisited.blogspot.com/2011/11/hotspot-jvm-options-java-
examples.html
35. jps(Java Virtual Machine
Process Status Tool)
• 用来查看基于HotSpot JVM里面所有进程的具体状态, 包
括进程ID,进程启动的路径等等。
• jps [ options ] [ hostid ]
37. jstat(Java Virtual Machine
Statistics Monitoring Tool)
• Jstat是JDK自带的一个轻量级小工具。利用JVM内建的指
令对Java应用程序的资源和性能进行实时的命令行的监
控,包括了对Heap size和垃圾回收状况的监控。
• jstat [ generalOption | outputOptions vmid [interval
[s|ms] [count]] ]
38. jmap(Java Memory Map)
• 打印出某个java进程(使用pid)内存内的,所有‘对象’的
情况(如:产生那些对象,及其数量)。
• jmap -J-d64 -heap pid
• jmap -dump:format=b,file=test.bin 4939
39. jhat(Java Heap Analyse To
ol)
• jhat是一个Java堆复制浏览器。这个工具分析Java堆复
制文件(例如,由上面的"jmap -dump"所产生的)。
Jhat启动一个允许堆中的对象在web浏览器中进行分析
的web服务器。
• jhat -J-mx768m -port <端口号:默认为7000>
heap.dmp
45. JMSMonitor
-Dcom.sun.management.jmxremote.port=3333 -
Dcom.sun.management.jmxremote.ssl=false -
Dcom.sun.management.jmxremote.authenticate=false -
Djava.rmi.server.hostname=10.112.37.92
JMXServiceURL url = new
JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:3333/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
MBeanServerConnection serverConn =
jmxConnector.getMBeanServerConnection();
MBeanServerConnection serverConn =
jmxConnector.getMBeanServerConnection();
Demo:JMSMonitor.java
Println(memoryMXBean.getHeapMemoryUsage().getUsed());
Editor's Notes http://avricot.com/blog/index.php?post/2010/05/03/Get-started-with-java-JVM-memory-(heap%2C-stack%2C-xss-xms-xmx-xmn...) http://www.wilsonmar.com/1javagc.htm the stack is the area of memory where local variables (including method parameters) are stored.http://marakana.com/bookshelf/java_fundamentals_tutorial/object_oriented.html http://www.researchbeta.com/?p=334其中黄色的是线程共享的,白色是线程私有的。我们每个部分分析过来。程序计数器(program counter register)这个可以认为是一个运行指针,指向下一个要运行的命令。用来实现循环、判断、线程切换等功能。Java虚拟机栈(java stack)这个就是大家经常说的堆栈中的栈了,用来存放函数运行状态,比如函数的变量、返回值类型、动态链接等。每个函数开始运行,就会创建一个栈帧。然后随着函数返回,而消亡。本地方法栈(native method stack)用来存放native函数的栈,和java stack功能差不多堆(Heap)这个就是存放几乎所有object的地方了,是一块非常大的内存区域,可以不连续。然后,这是GC的主战场。方法区(method area)这部分是存放类的类型数据,比如一个class的子父类、接口等。以及常量和静态变量。这部分比较少变化,有人称他为永久代。GC也会在这里做一些收集,但是效果一般。 http://www.slideshare.net/gengmao/inside-the-jvm-memory-management-and-troubleshooting http://www.slideshare.net/jaxconf/understanding-java-garbage-collection-and-what-you-can-do-about-it-gil-tene http://chaoticjava.com/posts/how-does-garbage-collection-work/ http://lory-yang.com/2012/09/04/jvm/Java采用了根搜索方法GC,一般是从GC根开始全部搜索一边,所有没有被搜到的,都是垃圾,可以被清理。这个算法可以消除循环引用造成的影响。也就是循环引用的对象依然会被GC。GC root包括以下四种:栈中的变量引用的对象方法区中的静态属性引用的对象方法区中的常量引用的对象JNI引用的对象 将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。 收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。 综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。 http://exceptioneye.iteye.com/blog/1535081 -XX:+UseParallelGC:这是JDK5 -server的默认值。策略为:年轻代:暂停应用程序,多个垃圾收集线程并行的复制收集,线程数默认为CPU个数,CPU很多时,可用-XX:ParallelGCThreads= 设定线程数。年老代:暂停应用程序,与串行收集器一样,单垃圾收集线程标记整理。如上可知该收集器需要2+的CPU时才会优于串行收集器,适用于后台处理,科学计算。可以使用-XX:MaxGCPauseMillis= 和 -XX:GCTimeRatio来调整GC的时间。 -XX:+UseConcMarkSweepGC:这是以上两种策略的升级版,策略为:年轻代:同样是暂停应用程序,多个垃圾收集线程并行的复制收集。年老代:则只有两次短暂停,其他时间应用程序与收集线程并发的清除。若要采用标记整理算法,则可以通过设置参数实现; 虽然CMS收集算法在最为耗时的内存区域遍历时采用多线程并发操作,但对于服务器CPU资源不够的情况下,其实对性能是没有提升的,反而会导致系统吞吐量的下降,为了尽量避免这种情况的出现,就有了增量CMS收集算法,就是在并发标记、清理的时候让GC线程、用户线程交叉运行,尽量减少GC线程的全程独占式执行; http://www.slideshare.net/kensipe/debugging-your-production-jvm http://blog.csdn.net/fenglibing/archive/2011/05/11/6411932.aspx3、常用参数说明-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。-v 输出传给JVM的参数。4、使用示例fenglibin@libin:~$ jps11644 Main1947 12843 Jps fenglibin@libin:~$ jps -v11644 Main -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:43467 -Dfile.encoding=GBK1947 -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m12858 Jps -Denv.class.path=/home/fenglibin/java6/lib/dt.jar:/home/fenglibin/java6/lib/tools.jar::/usr/bin/libtool:/usr/bin/autoconf:/usr/local/BerkeleyDB.4.8/lib -Dapplication.home=/home/fenglibin/java6 -Xms8mfenglibin@libin:~$ jps -l11644 com.alibaba.china.webww.core.Main12870 sun.tools.jps.Jps1947 http://blog.csdn.net/fenglibing/archive/2011/05/11/6411940.aspx如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。jstack [ option ] pidjstack [ option ] executable corejstack [ option ] [server-id@]remote-hostname-or-IP3、常用参数说明1)、options: executable Java executable from which the core dump was produced.(可能是产生core dump的java可执行程序)core 将被打印信息的core dump文件remote-hostname-or-IP 远程debug服务的主机名或ipserver-id 唯一id,假如一台主机上多个远程debug服务 2)、基本参数:-F当’jstack [-l] pid’没有相应的时候强制打印栈信息-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.-m打印java和native c/c++框架的所有栈信息.-h | -help打印帮助信息pid 需要被打印配置信息的java进程id,可以用jps查询. http://blog.csdn.net/fenglibing/article/details/64119513、参数说明1)、generalOption:单个的常用的命令行选项,如-help, -options, 或 -version。2)、outputOptions:一个或多个输出选项,由单个的statOption选项组件,可以-t, -h, and -J选项配合使用。statOption: -class Option -compiler Option -gc Option -gccapacity Option -gccause Option -gcnew Option -gcnewcapacity Option -gcold Option -gcoldcapacity Option -gcpermcapacity Option -gcutil Option -printcompilation Option注:其中最常用的就是-gcutil选项了,因为他能够给我们展示大致的GC信息。Option:指的是vmid、显示间隔时间及间隔次数等vmid — VM的进程号,即当前运行的java进程号interval– 间隔时间,单位为秒或者毫秒count — 打印次数,如果缺省则打印无数次3)、jstat命令输出参数说明S0 — Heap上的 Survivor space 0 区已使用空间的百分比S0C:S0当前容量的大小S0U:S0已经使用的大小S1 — Heap上的 Survivor space 1 区已使用空间的百分比S1C:S1当前容量的大小S1U:S1已经使用的大小E — Heap上的 Eden space 区已使用空间的百分比EC:Eden space当前容量的大小EU:Eden space已经使用的大小O — Heap上的 Old space 区已使用空间的百分比OC:Old space当前容量的大小OU:Old space已经使用的大小P — Perm space 区已使用空间的百分比OC:Perm space当前容量的大小OU:Perm space已经使用的大小YGC — 从应用程序启动到采样时发生 Young GC 的次数YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)FGC — 从应用程序启动到采样时发生 Full GC 的次数FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC http://blog.csdn.net/fenglibing/art可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool),使用参见:http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。64位机上使用需要使用如下方式:jmap -J-d64 -heap pid2、命令格式SYNOPSIS jmap [ option ] pid jmap [ option ] executable core jmap [ option ] [server-id@]remote-hostname-or-IP3、参数说明1)、options: executable Java executable from which the core dump was produced.(可能是产生core dump的java可执行程序)core 将被打印信息的core dump文件remote-hostname-or-IP 远程debug服务的主机名或ipserver-id 唯一id,假如一台主机上多个远程debug服务 2)、基本参数:-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. -finalizerinfo 打印正等候回收的对象的信息.-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. -permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来. -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效. -h | -help 打印辅助信息 -J 传递参数给jmap启动的jvm. pid 需要被打印配相信息的java进程id,创业与打工的区别 - 博文预览,可以用jps查问.4、使用示例1)、[fenglb@ccbu-156-5 ~]$ jmap -histo 4939[输出较多这里不贴了]2)、[fenglb@ccbu-156-5 ~]$ jmap -dump:format=b,file=test.bin 4939Dumping heap to /home/fenglb/test.bin ...Heap dump file createdicle/details/6411953 http://piotrnowicki.com/2012/05/btrace-a-simple-way-to-instrument-running-java-applications/ http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html