面经

JVM学习笔记

2018-08-16  本文已影响106人  渔樵店

JVM基本结构

jvm基本结构

PC寄存器

方法区:用来保存类的一些元信息的(例外,jdk1.7String的常量信息已经移到了堆)

桟:

操作数桟

图片.png

桟上分配

堆、桟、方法区的交互

图片.png

java的内存模型

编译和解释运行的概念

GC的概念

GC算法

引用计数法

标记清除法

标记压缩法

复制算法

复制算法的优化:整合标记清除思想

image.png

可触及性

可触及的:

从根节点可以触及到这个对象

可复活的:

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

不可触及

Stop-The-World

GC参数

串行收集器(GC线程只有一个)

最古老,最稳定,效率高,可能产生较长的停顿
-XX:+UseSerialGC:
新生代、老年代使用串行回收
新生代使用复制算法,老年代使用标记压缩算法

并行收集器(GC线程有多个)

ParNew:

Parallel收集器

CMS收集器

GC参数整理

GC参数整理
GC参数整理

类装载器

class转载验证流程

加载

链接

初始化

什么是ClassLoader

自底向上查询类是否已经加载,自顶向下尝试加载类。
我们写的类一般都是在App ClassLoader中加载的,如果要查询一个类是否已经被加载,先从App ClassLoader中查找,找不到再网上找。如果要加载一个类,先问一下Bootstrap ClassLoader有没有,没有再往下走。
双亲模式的问题
BootstrapLoader不能查找App ClassLoader中的类
解决方法:Thread.setContextClassLoader()
这是一个上下文加载器,是一个角色,用以顶层ClassLoader无法访问底层ClassLoader的问题,基本思想是在顶层ClassLoader中传入底层ClassLoader实例

java堆的分析

内存溢出(OOM)的原因

Mark Word,对象头标记 32位

描述对象的hash,锁信息,垃圾回收的年龄,标记
指向锁记录的指针
指向monitor的指针
GC标志
偏向锁线程ID

偏向锁

轻量级锁 BasicObjectLock

自旋锁

获取锁的流程

首先尝试获取偏向锁,如果可用,进入偏向模式,如果不可用,尝试轻量级锁,如果可用,使用轻量级锁,到此结束,如果不可用,尝试自旋锁,如果成功,那就拿到锁了,如果不成功,最后才会膨胀为重量锁(普通锁),在操作系统层面进行挂起。

代码层面锁的优化

减少锁的持有时间

尽量使用同步代码块而不是同步方法

减小锁的粒度

锁分离

锁粗化

图片.png

锁消除

在即时编译时,如果发现不可能被共享的对象,则可以消除这些所的操作

无锁

上一篇 下一篇

猜你喜欢

热点阅读