Java快手一面

Posted on 2023-08-22 21:13  Capterlliar  阅读(11)  评论(0编辑  收藏  举报

面向面试背书

面试官抛一个名词然后听我背书,听着听着提个答不出来的问题,怎么说,寄的很安详。

1. JVM

内存

线程共享:堆、方法区

线程私有:虚拟机栈、本地方法栈、程序计数器

本地方法栈和虚拟机栈所发挥的作用非常相似,区别是:虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

在 JDK 7 版本及 JDK 7 版本之前,堆内存被通常分为下面三部分:新生代、老年代(活了超过15个gc)、永久代。

GC

使用可达性分析算法

垃圾收集算法:标记清除、复制

类加载器:双亲委派原理

2. sychronized锁

synchronized 关键字的使用方式主要有下面 3 种:修饰实例方法(获得实例的锁)、修饰静态方法(获得class的锁)、修饰代码块(对象/class的锁)

锁升级:Java 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。

无锁-(一直被一个线程访问)-CAS-(持有锁的线程活动)-轻量级锁-(自旋失败)-重量级锁