【应用软件】JVM学习
By Leo
JAVA及JDK介绍
1、概述
Java不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式终端、移
动终端、企业服务器和大型机等各种场合。
2、JAVA技术体系(Sun官方定义)
Java程序设计语言
各个硬件平台上的Java虚拟机
Class文件格式
Java API类库
来自商业机构和开源社区的第三方类库
JAVA及JDK介绍
3、JDK(Java Development Environment )
JDK是用于支持java程序开发的最小环境,包括Java程序设计语言,Java虚拟机、Java API类库。
4、JRE(java Runtime Environment)
JRE,是支持Java运行的标准环境,包括Java API类库中Java SE API子集和Java虚拟机 。
5、Java Card、Java ME、Java SE、 Java EE
JAVA及JDK介绍
6、Java (JDK)发展
具体参考:
http://en.wikipedia.org/wiki/Java_version_history#cite_note-48
7、JDK最新版本
j2sdk-1.4.2-19
jdk-1_5_0_22
jdk-6u29
jdk-7u1
JDK有多少?
主要的Java虚拟机
Oracle HotSpot
Oracle JRocket(BEA)
IBM J9
Apache Harmony (IBM & Intel,间接催生Dalvik 虚拟机)
当然还有开源的OpenJDK
还有很多
如不做特别说明,本ppt中均指Hotspot JVM。
JVM 架构
JVM 内存结构
1、PC Register,看作是当前线程所执行的字节码的行号指示器
线程切换后恢复到正确位置,每条线程都需要有一个独立的PC Register
2、Java 虚拟机栈,也是线程私有的,描述Java方法执行的内存模型:每个方法被执行时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等。
3、本地方法栈,为native方法服务。HotSpot VM中把本地方法栈和虚拟机栈合二为一。
"A native method is a Java method whose implementation is provided by non-java code."
JVM 内存结构
4、Java 堆,是Java VM管理的内存中最大的一块,是被所有线程共享的内存区域,在VM启动时创建。
The heap is the runtime data area from which memory for all class instances and arrays is allocated.
5、Method Area,各个线程共享的内存区域,用于存储已经被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据。
(HotSpot 中又称为”永久代”Permanent Generation)
6、直接内存(对外内存)
Hotspot 内存管理
C (malloc / free)
C++ (new / delete)
Java (new / gc) (Garbage Collection是自动的)
对象生命周期
大部分对象的生命周期都很短,IBM研究显示:
• 98%的对象都是都是临时的,Hotspot采用的分代的方式管理内存
Heap 堆
概念介绍
GC:garbage collection(垃圾收集)
infant mortality:对象分配以后很快成为垃圾,就称该对象
具有“infant mortality”
minor collection:较小收集,指发生在young generation的GC
major collection:较大收集,指发生在older generation的GC
older generation:年老代,在1.4.2版本之后改称为tenured generation
概念介绍
permanent generation:永久代,又称为永久域,方法区
young generation:新生代
survivor spaces:生存空间
Eden:新对象分配的地方
Hotspot 内存分配
1、对象优先在新生代Eden区分配
当Eden区空间不够时,发起一次Minor GC.
2、大对象直接进入 Old Generation (只对Serial 和 ParNew收集器有效)
-XX:PreTenureSizeThreshold
3、长期存活的对象进入 Old Generation
-XX:MaxTenuringThreshold
Hotspot 内存回收
垃圾回收(Garbage Collection GC)
1、哪些内存需要回收
2、什么时候回收
3、如何回收
Hotspot 内存回收
GC 就是回收堆中的那些“dead”的对象,怎样判断对象是否存活?
1、引用计数法(很难解决对象之间相互循环引用的问题)
2、根搜索算法
Java和C#等,都是使用根搜索算法(GC Roots Tracing)判定对象是否存活的。从“GC Roots”对象作为起始点,从这些节点向下搜索,搜索过的路径称为引用链
(Reference Chain),当一个对象到GC Roots没有任何引用链相连(即不可达)时,就证明该对象是不可用的。
Hotspot 内存回收
回收方法区(永久代)
1、主要回收废弃常量和无用的类
2、是否对方法区回收:-Xnoclassgc
-verbose:class
–XX:+TraceClassLoading
-XX:+TraceClassUnLoading
Hotspot 内存回收
垃圾收集算法
1、标记-清除(Mark-Sweep)
2、复制算法
3、标记-整理 (Mark-Compact)
4、分代
串行 和 并行
Stop the world 和 concurrent
压缩和不压缩
Hotspot 内存回收
垃圾收集器
JDK 1.6
update12
分代内存回收使用算法比较
常用分析工具
1、jps 显示运行的HotSpot虚拟机进程
jps –v
2、jstat 收集HotSpot VM的运行数据
jstat -gcutil <pid>
jstat -class <pid>
3、jstack 线程快照
jstack -l <pid>
JVM常用分析工具
4、jmap 生成heapdump
jmap -histo:live <pid>
jmap -histo <pid>
jmap -dump:live,file=heap.out,format=b <pid>
5、jinfo 查看配置信息
6、jhat 分析heapdump
JVM常用分析工具 jps
JVM常用分析工具 jstat
GUI工具
1、 Eclipse MAT (Memory Analyzer Tool)
2、 VisualVM
Open Source All-in-One Java Troubleshooting tool
3、 Jconsole
4、 BTrace 是VisualVM的一个插件,是在不停止目标程序的情况下,通过HotSpot虚拟机的HotSwap技术动态加入原本不存在的调试代码
Hotspot JVM 参数说明
1 、-D 系统参数
2、 -X non-standard 参数,不保证对所有VM都生效
3、 -XX options have specific system requirements for correct operations use.
-X 和 –XX both are subject to change without notice.
Hotspot JVM 参数说明
参考地址:
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
通用参数
-server -client
-Xms -Xmx -Xmn -Xss
-XX:NewSize -XX:MaxNewSize
-XX:NewRatio -XX:SurvivorRatio
-Xnoclassgc
Hotspot JVM 参数说明
收集器参数
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:ParallelGCThreads
-XX:+UseParallelOldGC
-XX:MaxGCPauseMillis
-XX:+UseAdaptiveSizePolicy
Hotspot JVM 参数说明
并发 收集器参数
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSIncrementalMode(single CPU)
-XX:CMSFullGCsBeforeCompaction
-XX:CMSInitiatingOccupancyFraction
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+DisableExplicitGC(禁止system.gc())
Hotspot JVM 参数说明
调试参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
-XX:OnError=
java -XX:OnError="pmap %p" MyApplication
java -XX:OnError="cat hs_err_pid%p.log|mail [email protected]" \ MyApplication
-XX:ErrorFile=filename
-XX:+PrintClassHistogram
-XX:+PrintGCDetails and -XX:+PrintGCTimeStamps
JVM简单调优
调优的目的:
1、提高吞吐量 throughput (Parallel Scavenge)
用户代码运行时间/(运行用户代码时间 + 垃圾回收时间)
高吞吐量可以有效地利用CPU时间,尽快地完成程序的运算任务, 主要适合在后台运算而不需要太多交互的任务。
2、尽可能地缩短GC时用户线程的停顿时间 (CMS)
时间越短就越适合需要与用户交互的程序,可以提升用户体验
3、GC 的频率
常见的JVM异常
1、Java.lang.OutOfMemoryError:Java heap space
常见错误,heap空间不足导致,minor GC后仍然不足抛此异常
2、Java.lang.StackOverflowError :
如果虚拟机请求的栈深度大于虚拟机所允许的最大深度,则抛出此异常
3、Java.lang.OutOfMemoryError:Perm space
加载类,进行full gc后permGen空间还不足抛此异常
4、Java.lang.OutOfMemoryError
JVM简单调优
1、-Xms与-Xmx 最好一样大
2、调试时多打印GC信息PrintClassHistogram 、PrintGCDetails、PrintGCDateStamps
3、 (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction)/100>=Xmn遇到promotion failed 可以按照上面这个公式配置
4、-Xnoclassgc禁用类垃圾回收,性能会高一点
5、-XX:+DisableExplicitGC禁止System.gc(),免得程序员误调用gc方法影响性能
6、-XX:+UseParNewGC,对年轻代采用多线程并行回收
7、定位具体问题的原因,不要一味认为是JVM的问题
JVM简单调优(经验)
1、如果JVM在80%的时间都用于GC并且可用的HeapSize不足2%时就会导致产生OutOfMemoryError;
2、HeapSize最大不要超过物理内存的80%,一般设置-xms和-xmx相同,-xmn为-xmx的1/4;
3、JVM初始分配的内存由-xms决定,默认为物理内存的1/64,-xmx默认为物理内存的1/4,如果空余堆内存小于40%时,JVM就会增大堆直到-xmx指定的大小限制,如果空余堆内存大于70%时,JVM就
会减小堆-xms指定的大小,因此服务器一般设置-xms和-xmx相同,避免每次GC后调整堆大小。
JVM 排错案例
JVM
1、业务使用 resin
2、分析典型个JVM参数配置
-Xms3g -Xmx3g -Xmn512m -Xss1000k
–XX:MaxPermSize=120m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=80
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps
JVM 进程管理GC监控
JVM 进程管理GC监控
JMX监控配置
-Dcom.sun.management.jmxremote.port=43
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
JVM 监控
java应用线程监控
配图原文地址:http://user.qzone.qq.com/1780551083/blog/1323426981
本文原创自无线技术运营空间: http://wireless.qzone.qq.com 及 http://blog.csdn.net/wireless_tech (专注无线技术运营——无线技术(操作系统/数据库/WEB前端/负载均衡/系统容灾/系统安全/短信接入/WAP接入/3G等)、无线业务运营、无线开放平台、统计分析(用户行为分析/数据挖掘)、CP合作,联系我们:[email protected])