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
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
《深入理解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 86323、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
- JVM
- jvm
- JVM
- JVM
- JVM
- JVM
- jvm
- jvm
- jvm
- JVM
- JVM
- jvm
- JVM
- JVM
- jvm
- jvm
- jvm
- JVM
- 架构师是做什么的呢
- 常用的数据类型转换
- ListView设置监听器
- Android RxJava/RxAndroid结合Retrofit使用
- gdb debuginfo
- jvm
- C1001:二分查找
- hdu 2881(简单dp)
- Linux内核开发者峰会照的全家福-070911
- 循环(1)
- csdn乱码
- 一次向svn中增加所有新增文件 svn add all new files
- VB
- 使用Mysql新版驱动的ReplicationDriver实现MySQL读写分离