您的位置:首页 > 其它

JVM原理(只是简单描述,但知识点全面)

2016-05-22 13:02 274 查看
PS:下面的内容是来自“深入JVM内核—原理、诊断与优化”视频教程,只是简单整理,详细内容可以看回视频和PPT

 

1. JVM运行机制

1  JVM启动流程



2  JVM基本结构



3  内存模型



4  编译和解释运行的概念

解释运行

a)        解释执行以解释方式运行字节码

b)        解释执行的意思是:读一句执行一句

编译运行(JIT)

c)        将字节码编译成机器码

d)        直接执行机器码

e)        运行时编译

f)         编译后性能有数量级的提升

2. 常用JVM配置参数

1  Trace跟踪参数

2  堆的分配参数

3  栈的分配参数

-Xss

1  通常只有几百K

2  决定了函数调用的深度

3  每个线程都有独立的栈空间

4  局部变量、参数 分配在栈上

3. GC 算法与种类

1  GC的概念

                   GarbageCollection 垃圾收集

                   1960年 List 使用了GC

                   Java中,GC的对象是堆空间和永久区

2  GC算法

                   引用计数法(没有被Java采用)

                            老牌垃圾回收算法

                            通过引用计算来回收垃圾

                            使用者

                                      COM

                                     ActionScript3

                                     Python

                   标记清除

                            标记-清除算法是现代垃圾回收算法的思想基础。

                   标记压缩

                            标记-压缩算法适合用于存活对象较多的场合,如老年代。

                   复制算法

                            与标记-清除算法相比,复制算法是一种相对高效的回收方法

 

3  可触及性

4  Stop-The-World

                   Java中一种全局暂停的现象

                   全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互

                   多半由于GC引起

                            Dump线程

                            死锁检查

                            堆Dump

4. GC参数

1  堆的回顾

2  串行收集器

                   最古老,最稳定

                   效率高

                   可能会产生较长的停顿

                   -XX:+UseSerialGC

                            新生代、老年代使用串行回收

                            新生代复制算法

                            老年代标记-压缩

3  并行收集器

                   1)ParNew

                            -XX:+UseParNewGC

                                     新生代并行

                                     老年代串行

                            Serial收集器新生代的并行版本

                            复制算法

                            多线程,需要多核支持

                            -XX:ParallelGCThreads限制线程数量

                   2)Parallel收集器

                            类似ParNew

                            新生代复制算法

                            老年代 标记-压缩

                            更加关注吞吐量

                            -XX:+UseParallelGC

                                     使用Parallel收集器+ 老年代串行

                            -XX:+UseParallelOldGC

                                     使用Parallel收集器+ 并行老年代

 

                            -XX:MaxGCPauseMills

                                     最大停顿时间,单位毫秒

                                     GC尽力保证回收时间不超过设定值

                            -XX:GCTimeRatio

                                     0-100的取值范围

                                      垃圾收集时间占总时间的比

                                     默认99,即最大允许1%时间做GC

                            这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优

        

4  CMS收集器

                   ConcurrentMark Sweep 并发标记清除

                   标记-清除算法

                   与标记-压缩相比

                   并发阶段会降低吞吐量

                   老年代收集器(新生代使用ParNew)

                   -XX:+UseConcMarkSweepGC

5  Tomcat实例演示

5. 类装载器

 1  class装载验证流程

                   1)加载

                   2)链接

                            1.验证

                            2.准备(例如:分配内存)

                            3.解析(例如:符号引用替换为直接引用)

                   3)初始化

 

 2  什么是类装载器ClassLoader

                   ClassLoader是一个抽象类

                   ClassLoader的实例将读入Java字节码将类装载到JVM中

                   ClassLoader可以定制,满足不同的字节码流获取方式

                   ClassLoader负责类装载过程中的加载阶段

3  JDK中ClassLoader默认设计模式

                   BootStrapClassLoader (启动ClassLoader)

                   ExtensionClassLoader (扩展ClassLoader)

                   AppClassLoader (应用ClassLoader/系统ClassLoader)

                   CustomClassLoader(自定义ClassLoader)

 

                   每个ClassLoader都有一个Parent作为父亲

4  打破常规模式

5  热替换

                   当一个class被替换后,系统无需重启,替换的类立即生效

6. 1)系统性能监控

1  linux性能监控工具:

           1. sysstat(需要安装yum installsysstat)

 

2  windwos性能监控工具:

           1. 任务管理(windwos自带)

           2. perfmon(windwos自带)

           3. process explorer(需要安装)

           4. pslist 命令行工具(需要安装)

6. 2)Java自带的工具

         1.jps 列出java进程,类似于ps命令

         2.jinfo 可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数

         3.jmap 生成java应用程序的堆快照和对象的统计信息

         4.dump 把堆信息导出到文件,命令:jmap -dump:format=b,file=c:\heap.hprof 2972

         5.jstack 打印线程dump,jstack 120 >>C:\a.txt

         6.jconsole 图形化监控工具

         7.visual vm

7. Java堆分析

1  堆、永久区、线程栈、直接内存都会引起内存溢出(OOM)

2  使用MAT和Visual VM工具分析内存溢出(OOM)的原因

8. 锁

         1)线程安全

         2)对象头Mark

 

         1)偏向锁

         2)轻量级锁

         3)自旋锁

 

         1)减少锁持有时间

         2)减小锁粒度

         3)锁分离

         4)锁粗化

         5)锁消除

         6)无锁

 

         不是Java语言层面的锁优化方法

         内置于JVM中的获取锁的优化方法和获取锁的步骤:

                1)偏向锁可用会先尝试偏向锁

                2)轻量级锁可用会先尝试轻量级锁

                3)以上都失败,尝试自旋锁

                4)再失败,尝试普通锁,使用OS互斥量在操作系统层挂起

9. Class文件结构

1     语言无关性

2     文件结构

                   1)魔数

                   2)版本     

                   3)常量池

                   4)访问符

                   5)类、超类、接口

                   6)字段

                   7)方法

                   8)属性

10. JVM字节码执行

1  javap

2  简单的字节码执行过程

3  常用的字节码

4  使用ASM生成Java字节码

5  JIT及其相关参数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm