面试复习-Java虚拟机

2020-05-30  本文已影响0人  Lugton

一、Java内存区域

1.Java虚拟机运行时数据区

2.对象的创建过程

  1. 类加载检查
  2. 为对象分配内存
  3. 将分配到的内存空间初始化置零(不包括对象头)
  4. 设置对象头
  5. 初始化成员变量,并执行构造函数

3.OOM异常(内存溢出)

3.1 JVM调优
  1. 首先把OOM文件dump下来
  2. 使用jprofiler工具加载dump文件,查看是否有大对象占用很大内存,此外还可以定位到哪行代码出现问题
  3. 尝试调大堆内存

内存泄漏:程序申请内存后,无法释放已申请的内存空间,一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论内存多大都会被占光。

二、垃圾收集

1.判断对象是否已死

可作为GC Roots对象的:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中Native方法引用的对象

2.引用

Object obj = new Object();

假设有一个应用需要大量读取本地的图片:每次读取图片都从磁盘读取会严重影响性能,如果一次性全部加载到内存中又可能造成溢出,此时用软引用就可以解决这个问题。

3.finalize()

在可达性分析中不可达的对象,也并不是一定会被回收的,真正宣告它死亡,至少需要两次标记过程。可达性分析中的不可达对象会被进行第一次标记,并根据此对象是否有必要执行finalize()方法进行一次筛选。如果没有覆盖finalize()方法或已被执行过,则都被视为没有必要执行。
如果有必要执行finalize()方法,会被放入F-Queue中,有可能会通过finalize()方法实现自救。

4.回收方法区

常量池的回收和类的卸载

5.垃圾收集算法

6.垃圾收集器

7.内存分配与回收策略

  1. 对象优先在Eden分配
  2. 大对象(需要大量连续内存空间的对象 )直接进入老年代
  3. 长期存活(默认为15岁,每熬过一次minor GC 算一次)的对象将进入老年代
  4. 如果Survivor空间中相同年龄所有对象大小总和超过Survivor空间的一半,则年龄大于或等于该年龄的对象就可以直接进入老年代。

三、类加载机制

1.类的生命周期

加载-验证-准备-解析-初始化-使用-卸载

  1. 通过一个类的全限定名来获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口

2.类加载器

3.双亲委派模型

上一篇 下一篇

猜你喜欢

热点阅读