JVM初步了解

2.JVM

常见面试题:

  1. 请谈谈你对JVM 的理解?java8 的虚拟机有什么更新?

  2. 什么是OOM ?什么是StackOverflowError?有哪些方法分析?

  3. JVM 的常用参数调优你知道哪些?

  4. 内存快照抓取和MAT分析DUMP文件知道吗?

  5. 谈谈JVM中,对类加载器你的认识?

2.1 JVM结构图

  • 方法区(jdk8及之后叫元空间):存储已被虚拟机加载的类的元数据信息(类的元数据信息 -> 类的名称,包路径,父类和接口字段信息,方法的信息,常量、静态变量等)(主要存:静态变量+常量+类信息(构造方法/接口定义)+运行时常量池)

  • 堆:存放对象实例

  • 栈:存基本数据类型以及对象的引用(主要存:8种基本类型的变量+对象的引用变量+实例方法)

  • 程序计数器:当前程序所执行的字节码的行号

  • 本地方法栈:navtive方法,调用c语言的

2.2 类加载器

  • 启动类加载器:负责加载jre/lib/tr.jar 中的所有类,由C++实现,不是ClassLoader的子类

  • 扩展类加载器:负责加载java平台扩展功能的一些jar包,jre/lib/ext/目录下的jar包

  • 应用程序类加载器:系统类加载器,负责加载classpath中指定的jar包及目录中的class

  • 用户自定义加载器:ClassLoader的子类,用户可以自定义类的加载方式

双亲委派机制

1、当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把这个类交给父类扩展类加载器去加载

2、当扩展类加载器加载一个class时,它首页也不会自己尝试加载这个类,而是交给启动类加载器加载

3、如果启动类加载器加载失败时,则交给子类扩展类加载器加载

4、当扩展类加载器加载失败了,则交给子类系统类加载器加载

5、如果系统类加载器加载失败时,则报ClassNotFound异常

2.3 堆中内存划分

2.3.1 新生代
  • 伊甸园区

    • 所有对象都是在伊甸园区被new出来的

  • 幸存者区

    • from区

    • to区

MinorGC垃圾回收过程:

1、当伊甸园区满了的时候触发第一次gc,它会把伊甸园中的存活的对象复制到幸存者from区,当伊甸园第二次触发gc时会扫描伊甸园和幸存者from区进行gc,经过这次gc还存活的对象直接复制到to区,然后在他们的年龄上+1,当年龄到达15时进入老年代

2、清空伊甸园企区和幸存者from区

3、from和to区互换,互换15次后进去老年代

4、大对象可以直接分配到老年代

2.3.2 老年代
  • 经历多次gc(默认15)还存在的对象,或者大对象

  • 如老年区也满了,那么,这时将进行MajorGC(FullGC),若进行了fullGC还是无法保存对象,就会报OOM,OutOfMemoryError

如果出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够

1、Java虚拟机堆内存设置不够,可通过-Xms、Xmx调整

2、代码中创建了大量的大对象,并且长时间不能被垃圾收集器收集(存在被引用)

2.3.3 永久代
  • 永久代试试一个常驻内存区域,用于存放jdk自身所携带的Class、interface的元数据,也就是说它存储的是运行环境必须得类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,只有关闭jvm才会释放此区域所占内存

  • 永久代使用的是jvm堆内存,但是java8之后的元空间使用的是本机物理内存

2.4 垃圾判定

2.4.1 引用计数法

给对象中添加一个引用计数器,每当有一个地方引用它是,计数器值就加1,当引用失效时,计数器就减1。任何时刻计数器为0的对象就是不可能再被使用的,就要被gc回收

优点

  • 简单、高效

缺点

  • 引用和去引用伴随着运算,影响性能;很难处理循环引用,相互引用的两个对象则无法释放

2.4.2 可达性分析算法

以GC Roots为起点,从它开始往下搜索,如果存在一个对象没有任何引用链个GCRoot的话,那么它就可以被gc回收

  • 可作为GC Roots的对象包括以下几种

    • 栈中的引用对象

    • 方法区中的类静态属性引用的对象

    • 方法区中常量引用的对象

    • 本地方法栈中Native的引用对象

真正的标记可回收对象为可回收状态至少需要两次标记

  • 第一次:不在GCroot链中,标记为可回收对象

  • 第二次:判定当前对象是否实现了finalize()方法,如果没有实现,则直接判定这个对象可以回收,如果实现了就会先当如一个队列中,并由虚拟机建立一个低优先级的程序去执行它,随后就会进行第二次小规模标记,在这次被标记的对象就会被真正被回收了

四种引用

  • 强引用:只要强引用还存在就不会被收回

  • 弱引用:只要进行gc就会被回收

  • 软引用:内存要满之前,会被gc回收

  • 虚引用:gc工作回收

2.4.3 垃圾回收算法

复制算法

将内存分为两份,当内存满时,把活着的复制到另一份内存中,然后清空当前内存

优点

  • 实现简单

  • 不产生内存碎片

缺点

  • 两份内存、浪费空间

  • 如果内存存活率过高,那么使用复制算法会浪费性能

标记-清除算法

标记出需要回收的对象,使用的标记算法为可行性分析算法,回收被标记的对象

缺点

  • 两次遍历,效率低

  • 空间问题,标记清除后产生大量不连续的空间,导致一些大对象放不进去,导致资源浪费

标记-整理算法

先将对象标记对存活和死亡两种状态,然后让所有存活的对象向一端移动,然后清除边界以外的内存

优点

  • 不会有大量内存碎片

缺点

  • 如果对象存活过多,整理阶段会执行较多的复制操作,效率低

内存效率:复制>标记清除>标记整理

内存整齐度:复制=标记整理>标记清除

内存利用率:标记整理=标记清除>复制

分代收集算法

  • 新生代的对象存活率低,采用复制算法

  • 老年代的对象存活率高,且有些对象比较大,采用标记清除或者标记清除和标记整理一起使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

堇荼丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值