java面试题整理

多线程

1.java如何开启线程?怎么保证线程安全?

a.继承thread类重写run方法,实现runnable接口实现run方法,实现callable接口实现call方法(返回值),通过线程池创建
b.JDK提供的锁,使用Synchronized关键字及提供的其他锁lock

2.Volatile和Synchronized什么区别?Volatile能不能保证线程安全?DCL(Double Check Lock)单例为什么要加Valatile?

a.Sy关键字是用来加锁,volatile只是保证变量在线程之间的可见性
b.不能,volatile只能保证线程之间的可见性,不能保证原子性
c.使用volatile防止指令重排,解决多线程之间指令重排安全性问题

3.java线程锁机制是怎样的?偏向锁、轻量级锁、重量级锁的区别是什么及升级过程?

a.java的锁就是在对象的Markword中记录一个锁状态,不同的锁及无锁对应不同的锁状态
b.锁机制是根据资源竞争的激烈程度不断进行锁升级的过程

4. 谈谈对AQS的理解,AQS如何实现可重入锁?

a.AQS是java线程同步的框架。是JDK中很多锁工具的核心实现框架
在AQS中维护了一个信号量state和一个线程组成的双向链表队列,用来给线程排队,state控制是否放行
b.在可重入锁场景下,state是用来表示加锁的次数,0表示无锁。每加一次锁就加1,释放一次锁就减1

5.有ABC三个线程,如何保证三个线程同时执行?如何在并发情况下保证三个线程依次执行?如何保证三个线程有序交错执行?

CountDownlatch、Cylicbarrier、Semaphore

6.如何对一个字符串快速进行排序(多线程情况下作答)?

通过使用fork/join框架,分而治之,通过多线程处理先拆分计算,在合并结果

JVM

1.关于jvm内存模型理解

image.png

2.java类加载的全过程是怎样的?什么是双亲委派机制?有什么作用?

JAVA的类加载器:AppClassLoader->ExtClassLoader->BootStrapClassLoader
a.每个类加载器都有自己的加载目录
b.每个类加载器对加载过的类都有一个缓存
c.双亲委派:向上委托查找(缓存),向下委托加载;作用:是为了保护java的层的类不会被其他应用程序所覆盖
image.png
d.类的加载过程: 加载->连接->初始化

加载:把类的字节码文件(.class)加载到JVM内存中,并将其映射成JVM认可的数据结构
连接:1.验证:检查加载的字节信息是否符合JVM规范
     2.准备:创建类和接口的静态变量,并赋予初始值,处于半初始化状态
     3.解析:把符合引用转为直接引用
初始化 自己写的那些代码的执行

3.一个对象从加载到JVM,再到被GC清除,都经历了什么过程?

image.png

4.怎么确定一个对象是否是垃圾?什么是GC Root?

1.引用计数法,2.可达性分析法
image.png

5.JVM有哪些垃圾回收算法?

a.MarkSweep标记清除算法。b.拷贝算法。c.标记整理算法
image.png
image.png

6.JVM有哪些垃圾回收器?他们都是怎么工作的?什么是STW?他们都发生在哪些阶段?什么是三色标记?如何解决错标记和漏标记的问题?为什么要设计这么多垃圾回收器?

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

7.如何进行JVM调优?JVM参数有哪些?怎么查询JAVA进程的JVM参数?谈谈你了解的JVM参数。如果一个java程序每次运行一段时间就会变得非常卡顿,你会如何对他进行优化?

image.png

你可能感兴趣的:(java面试问题)