【应用软件】JVM学习

【应用软件】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]

你可能感兴趣的:(【应用软件】JVM学习)