jvm简单八股
1、jvm中内存分为那几个区域,1.7和1.8
jvm 中主要有 程序计数器、虚拟机栈、本地方法栈、堆、方法区、直接内存。
线程私有的有:程序计数器、虚拟机栈、本地方法栈
线程共有的有:堆、方法区、直接内存
堆空间又可以分为:新时代、老年代、永久代(1.8后叫元空间);1.7的永久代使用的是jvm的内存,1.8后的元空间使用的是本地内存
新时代分为:eden,s0,s1 区其中比例为(8:1:1)
2、jvm对象的创建过程(五步)
1、类加载检查
2、内存分配
3、初始化0值
4、填充对象头(对象年龄-最大为15,对象头中只给分配了4位空间,hash值,地址)
5、执行init
对象内存分配两种方式:指针碰撞、空闲列表
对象分配原则为:1、对象优先分配在eden区,2、长期存活的进入老年代、3、大对象直接进入老年代
访问对象的两种方式:句柄和直接指针
3、垃圾相关
1、垃圾检测算法:
1、引用计数法;
2、可达性分析算法
(其中链表起始位置为:GCRoot可以为:1、方法区中类静态属性引用的对象,2、方法区中常量引用对象、3、本地方法区中引用的对象、4、虚拟机栈中引用的对象、5、所有被同步锁持有的对象)
2、垃圾回收算法:
1、标记-清除
2、标记-复制(也叫复制算法,多用于年轻代的垃圾回收算法)
3、标记整理 (多用于老年代的垃圾回收算法)
4、分代收集(Java中对象大多数存活时间是很短的)
4、引用相关
强引用 软引用 弱引用 虚引用
强引用对象:一般对象都是强引用对象,当垃圾回收时候发现空间不足不会清除,而是直接报错
软引用对象:当垃圾回收时候,空间不足时候才回去回收
弱引用对象:当垃圾回收扫描到了这个对象时候就会回收
虚引用对象:不能直接使用,要搭配引用队列《ReferenceQueue》一块使用,一般用来跟踪对象被垃圾回收的活动
垃圾回收器
1、serial 收集器(串行收集器)
2、ParNew 收集器(serial 收集器的多线程版本)
3、serial Old 收集器(单线程)
4、parallel Scavenge 收集器(吞吐量高)
上面的垃圾收集器算法:年轻代:复制算法 老年代:标记-整理算法