jvm

来源:互联网 发布:用织梦cms做仿站 编辑:程序博客网 时间:2024/05/29 03:39
keywords:java oom   内存泄漏内存溢出   基本参数Xms Xmx等配置   查看内存
《深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版)》



一、java历史
1991年 P28 JAVA前身  能够在各种电子产品(冰箱、收音机)上运行的架构 Oak(橡树)
1995年 改名JAVA
1996年 jdk1.0发布,提供Sun Classic VM
1999年 P29 Hotspot虚拟机发布,最初是小公司开发,后被sun收购
2006年 sun宣布java开源,建立了OpenJDK(P46)组织
2009年 oracle收购sun、bea


java -version
Sun Classic VM P33  第一款商用java虚拟机,现已淘汰
hotspot P34
BEA JRockit   IBM J9 VM P36 
Microsoft JVM P38 微软曾是java铁杆粉丝,但是sun控告它垄断等




二、内存区域
java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。


运行时数据区:方法区 虚拟机栈 本地方法栈 堆 程序计数器
1、程序计数器 当前线程锁执行的字节码的行号指示器,用于取下一条执行,分支、循环、线程恢复等。唯一不会oom的区域
2、java栈 stack(虚拟机栈、本地方法栈) 存储局部变量表、动态链接、方法出口、对象引用等 -Xss
3、java堆 heap 存对象实例和数组   Xmx Xms   
新生代和老年代,Eden、FromSurvivor、ToSurvivor 。。
4、方法区 存储已被虚拟机加载的类信息、常量、静态变量 -XX:MaxPermSize 
俗称永久代,Permanent Generation
5、运行时常量池 隶属于方法区
6、直接内存 DirectMemory 用于NIO


三、OOM实战 
-XX:+HeapDumpOnOutOfMemoryError 让虚拟机oom时dump出当前内存堆转储快照


1、堆溢出  -Xms -Xmx
oom Java heap space    P74
内存泄漏(存在GC roots引用链),内存溢出(内存中对象确实都还需活着,应检查堆参数)
2、栈溢出  -Xss
单线程 stackOverFlow P76  oom:unable to create new thread P78
3、方法区和常量池 -XX:PermSize -XX:MaxPermSize 永久代
String.intern()  从常量池返回String对象包含的字符串,没有则创建
PermGen space(jdk1.6及之前)  
P79不停的添加常量 P81不停的生成动态类
4、本机直接内存溢出 -XX:MaxDirectMemorySize 默认与-Xmx一样
p82




http://longdick.iteye.com/blog/468368
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html


四、垃圾收集
可达性分析算法 P87
垃圾回收算法 复制算法 P93
分代收集算法 P95
垃圾收集器 P98






五、jdk命令行分析工具
http://blog.csdn.net/fenglibing/article/details/6411958




1、jps 查看所有虚拟机进程
jps -v


2、jinfo 查看虚拟机的配置信息
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jinfo.html

jinfo -flag MaxPermSize 4448

tomcat 默认 MaxPermSize  是 85983232 ,85983232/1024/1024=82MB

jinfo -flag MaxDirectMemorySize 8632




3、jstat 查看虚拟机的运行数据
jstat -gcutil 4448 1000 20
jstat -gccause 1936 1000 20
百分数只是基于当前分配大小 并非基于最大可申请大小
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstat.html
http://blog.163.com/yangshuo_qq/blog/static/2554680201272871350110/


4、jmap 查看虚拟机的内存转储快照
jmap -dump:live,format=b,file=xxx.bin -F 1936    导出文件可以用MemoryAnalyzer分析内存对象
jmap -heap 21256   ????  显示堆详细信息,如参数配置
jmap -histo 21256   显示堆中对象统计信息,包括类、实例数量、合计容量
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html


5、jhat 分析heapdump  除非手上没有工具否则不会用此工具
jhat xxx.bin
http://localhost:7000/


6、jstack 查看虚拟机的线程快照
jstack -F 4448 正常输出请求不被响应时,强制输出
jstack -l 21256 除堆栈外,显示关于锁的附加信息
jstack -m 21256 如果调用到本地方法,可以显示c/c++的堆栈




7、jconsole


8、jvisualvm



0 0
原创粉丝点击