JAVA知识点总结(一)JVM

重点:

  1. 程序运行过程
  2. 类的加载过程
  3. 垃圾回收器(JVM垃圾回收机制,四个垃圾回收算法,垃圾回收器的分类和使用场景)
  4. 运行时数据区(虚拟机栈、本地方法栈、程序计数器、方法区、堆)
  5. JVM调优(常用调优方式和工具,常用参数,)

 

一、程序运行过程

 

  1. 先把java代码编译成字节码,也就是吧.java文件编译成.class文件,这个过程的大致执行流程:java源代码->词法分析->语法分析->语义分析->字节码生成。其实也就是编译原理的那些东西和流程,其中任何一个节点失败就会造成编译失败。
  2. 把 .class文件放到java虚拟机,这个虚拟机通常指Oracle官方自带的Hotspot JVM;
  3. java虚拟机使用类加载器(Class Loader)装载class文件。
  4. 类加载完成之后,会进行字节码校验,字节码校验通过之后JVM会把字节码翻译成机器码交由操作系统执行。但不是所有代码都是解释执行的,JVM对此作了优化,比如对于Hotspot虚拟机来说,它本身提供了JIT(Just In Time)也就是我们通常说的动态编译,它能够在运行时将热点代码编译为机器码,这个时候字节码就变成了编译执行

 

 

二、类的加载过程(和上一点有些重复)

  1. 加载:根据查找路径找到相应的 class文件然后导入。
  2. 检查:检查加载的class 文件的正确性。
  3. 准备:给类中的静态变量和静态代码块分配内存。
  4. 解析:虚拟机将常量池中的符号引用换成直接引用。符号引用可以理解为一个标识,而直接引用直接指向内存中的地址。
  5. 初始化:对静态变量和静态代码块执行初始化工作。

 

三、垃圾回收机制

  1. 如何确定某个对象是需要被回收的?

JVM中主要有两种方法判定,一个是引用计数器,另一个是可达性分析。

引用计数器:为每个对象创建一个引用计数,有对象引用时计数器+1,引用被释放时计数器-1,当引用计数器为0是就可以回收。但是这个方法的缺点是不能解决循环引用的问题。

可达性分析:这个方法是通过一系列的“GC Roots”对象作为起点,从起点开始往下搜索,搜索过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是可以回收的。不过这个对象至少要经历两次标记过程才会真的变成可回收对象。

 

2.垃圾回收算法

主要有以下四种垃圾回收算法,

    2.1 标记-清除算法(Mark-Sweep):这是最基础的垃圾回收算法,最简单也最容易实现。主要分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占空间。标记-清除算法的缺点就是回收之后的的内存区域比较分散,不连续。

 

(图来自网络)

回收之前:

回收之后:

 

2.2 复制算法(Copying):为了解决标记-清除算法的缺陷,出现了复制算法,它将可用内存an容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就讲还存活的对象复制到另一块上,然后再把当前这块使用的内存一次清理回收,这样就不会出现内存碎片的问题了。但是复制算法的缺点在于内存移动消耗太大。

回收之前:

回收之后:

 

2.3 标记-整理算法(Mark-Compact):为了解决复制算法的问题,提出了标记整理算法。它也是分为两个阶段,第一个阶段是标记,但是在标记完之后不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理边界以外的内存。

回收之前:

回收之后:

 

2.4 分代收集(Generational Collection):分代收集是目前大部分JVM的垃圾回收器采用的算法。它是根据对象的生命周期不同划分为若干个不同的区域,一般分为老生代和新生代,老生代每次只有少量对象被回收,新生代则有大量对象被回收。这样就可以根据不同代的特点采取最合适的收集算法。新生代一般用复制算法,新生代又分为Eden区域和 from survivor、以及to survivor区域,他们默认占比是8:1:1,每次垃圾回收时,

  • 把Eden和from survivor中存活的对象放入 to survivor区;
  • 清空Eden和from survivor区;
  • From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。

每次在from survivor 到 to survivor移动时都存活的对象,年龄就+1,当年龄达到15(默认值),就升级为老生代。大对象会直接进入老生代。

老生代当空间占用达到某个值之后就会触发全局垃圾回收,一般使用标记-整理算法,以上循环往复。

 

3.典型的垃圾回收器:

3.1 Serial/Serial Old 

Serial/Serial Old收集器是最基本最古老的收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程。Serial收集器是针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。

3.2 ParNew 

ParNew收集器是Serial收集器的多线程版本,使用多个线程进行垃圾收集。

3.3 Parallel Scavenge 

Parallel Scavenge收集器是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控的吞吐量。

3.4 Parallel Old 

Parallel Old是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法。

3.5 CMS 

CMS(Current Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep算法。

3.6 G1

G1收集器是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。

 

 

 

四、运行时数据区

 

 

五、JVM调优

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值