JVM学习笔记

第一章内容


1、JVM是虚拟机Java Virtual Machinede 的简称,简单成为java虚拟机。

(1)虚拟机,是指通过软件模拟的具有完整硬件系统功能的,运行在一个完全隔离的环境中的完整计算机系统。

(2)有哪些虚拟机,VMWare Visual box JVM

(3)VMWare或者Visual Box都是使用软件模拟物理CPU的指令集。

(4)JVM使用软件模拟Java字节码的指令集。


2、2004年发布JDK1.5 新增了泛型 注解 装箱 枚举 可变长参数 Foreach循环 jdk1.6 支持脚本语言,jdbc4.0 java编译器api等 

      2011年发布JDK1.7 动态语言得到增强 64为系统中的的压缩指针nio2.0

      2014年JDK8发布 支持lambda表达式 语法增强 java类型注解  16年JDK9 支持模块化



第二章内容


1、JVM启动流程


2、JVM基本结构

Class文件 通过ClassLoader[类加载器子系统]加载被加载到内存空间,这个内存空间包括方法区,Java堆和Java栈。

pc寄存器存储对象的上下指针关系。执行引擎用来执行class字节码。垃圾收集器负责收集看收集的对象空间。



(1)PC寄存器

每一个线程拥有一个PC寄存器,在线程创建时被创建,指向下一条指令的地址,执行本地方法时PC的值为undefined。

(2)方法区

用来保存类的源信息,包括类型常量池,字段方法信息,方法字节码,在JDK7中,String等常量已经移动到了堆。

又叫静态区,和堆一样,被线程共享,它包含所有的class和static的变量。

(3)Java堆

和程序开发密切相关,应用系统对象都保存在java堆中,所有线程共享java堆,对分代的GC来说,堆也是分代的。GC的主要工作区间

eden(伊甸园)  s0 幸存区 s1幸存区  tenured(老年代)

(4)Java栈

线程私有,栈由一些列帧组成(线程栈),帧保存一个方法的参数和局部变量等。每一次方法调用都会创建一个新的帧,压到栈里去。



(5)工作内存和主内存的关系(内存模型)



(6)一个线程修改了变量,其他线程立即知道的方法:

volatile  synchronied  final修饰


3、GC算法

(1)gc的概念:Garbage Collection 垃圾收集 在java中,GC的对象是堆空间和永久区。

gc的算法:引用计数法 ,标记清除法 标记压缩法 复制算法


(1)引用计数法:对于一个对象A,只要有任何一个对象应用了A,则A的引用计数器就加1,当引用失效的时候,就减1,只要对象A的引用计数器的值为0,则对象A就不可能再被引用了。看下图:



引用计数法的问题:引用和去引用伴随加法和减法 影响性能;很难处理循环引用的问题。循环引用会让对象的引用计数都不为0,则不会被清除。

(2)标记清除法:清除算法是现代垃圾回收算法的思想基础。他分两个阶段,标记和清除。一种可行的实现是,在标记阶段,通过根节点标记所有从根节点开始的可达对象,因此未被标记的对象就是未被应用的垃圾对象,然后再清除阶段,清除所有未被标记的对象。





(3)标记压缩:适合用于存活对象比较多的场合。如老年代。是对标记清除的改进。从根节点标记开始后,对所有可达对象做一次标记。但之后并不是简单的清理未标记的对象二十将所有的存活动向压缩到内存的一端。之后清理边界外所有的空间。



(4)复制算法

与标记清除算法相比,复制算法是一种相对高效的回收方法。不适合用于存活对象较多的场合如老年代,将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在被使用的内存中存活的对象复制到未使用的内存块中,之后,清除正在使用的内存快中的所有对象,交换两个内存的橘色,完成垃圾回收。




问题:对空间有一定的浪费。只能使用一半的空间。


对复制算法进行扩展,让其不浪费空间:



解释如果优化的呢:将内存空间分为伊甸园区,幸存区1,幸存区2,和老年代。

(1)先说老年代:老年代不属于复试回收算法的营地,它负责担保保存一些长期引用未被回收的对象和一些大对象。

(2)新增的对象放在伊甸园,每次对伊甸园做回收时,将一些老对象放入幸存区,每次都保证有一个幸存区是空的。但伊甸园和幸存区满时,将大对象和老不死放入老年代,其他存活对象放入另外一个幸存区,将之前的幸存区和伊甸园清理干净。


分代思想:根据对象的存活周期进行分类,短命对象归为新生代,老不死对象归为老年代。少量对象存活适合复制算法。大量对象存活适合标记清理和压缩清理。

年轻代:复制算法。 适合生命周期短,对象小的场景。

老年代:标记清除。没有使用引用计数。 适合大数量和大对象回收的。




什么对象才是可回收对象呢?

可触及的:从根节点可以触及这个独享

可复活的:一旦所有引用被释放 就是可复活状态 因为在finalize中可能复活该对象

不可触及:在finalize后 可能会进入不可触及状态 不可触及的对象不可能复活 可以回收对象


特别注意的是:finalize方法只能调用一次。所以当我们在finalize方法中将对象复活一次后  不能再在这个方法里对其复活第二次。例如:




这里需要注意的是:避免使用finalize方法,操作不慎可能会导致错误。优先级低何时被调用不确定。可以使用try catch finally中替代它。



GC的一种问题:STOP THE WORLD 

JAVA中一种全局暂停的现象。全局停顿,所有java代码停止,native代码可以执行,但不能和JVM交互,多半是由GC引起的。例如DUMP线程,死锁检查,堆DUMP。


GC产生全局停顿的原因:垃圾太多,进行一次全局的垃圾回收。此时需要暂停当前活动。 FULL GC

FULL GC的危害:长时间服务停止,没有响应,遇到HA系统,引起主备切换维护生产环境。



5、GC参数


堆:分为新生代和老年代。

新生代分为伊甸园和幸存区1,2   新生代的对象多为新建对象 或生命周期不长的对象 当垃圾回收时,有一些对象会被幸存到幸存区1,年轻代的回收算法是复试算法。

那些老不死的对象进入老年代,会使用标记算法进行垃圾回收。



几种垃圾回收器:

(1)串行收集器  SerialGC 最古老最稳定但效率最高 可能产生较长的停顿。

使用参数:-XX:+ UseSerialGC 就在使用串行收集器了此时,

新生代和老年代都使用串行回收。新生代是复制算法,老年代是标记压缩算法。


(2)并行收集器

参数:-XX:+UseParNewGC

新生代并行  老年代串行  复制算法 多线程 多核支持

多线程不一定快  得考虑CPU等  多核CPU下考虑线程数量


(3)类似并行收集器:Paralle收集器

新生代复制算法 老年代 标记压缩算法  

-XX:+UseParallelGC 新生代并行 老年代串行

-XX:+UseParallelOldGC 老年代也并行



(4)CMS收集器

Concurrent Mark sweep 并发的标记清除算法

并发阶段会降低吞吐量,老年代的收集器。新生代使用并行收集器。

-XX:+UseConcMarkSweepGC


CMS流程:(老年代算法收集器)

初始标记  会产生全局停顿   并发标记   重新标记   并发清除




特点:

尽可能降低停顿。会影响系统整体吞吐量和性能。清理不是很彻底 因为在清理阶段 用户线程还在运行,会产生新的垃圾无法清理。


GC的参数整理



6、性能监控工具

JConsole VisualVM



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值