Java基础相关:
面向对象的特征:封装、继承、抽象、多态
jdk、jre、jvm的关系:jdk>jre>jvm
Java8的新特性:Lambda表达式和集合之流式操作
Java字节码:.class文件,Java源程序通过编辑器编译为字节码,字节码通过虚拟机解释执行
equals方法和hashCode方法:equals方法常用于比较两个对象是否相等。hashCode方法主要在集合中用到。将对象放入集合中时,如果该对象的hashCode与集合中任意对象的hashCode均不相等则直接将该对象放入,否则调用equals方法判断是否相等,若不等则放入。重写了equals方法必须重写hashCode方法,否则会降低map等集合索引速度。
VO、DTO、DO、PO分别是什么:VO视图对象、DTO数据传输对象、DO领域对象、PO持久化对象。
Java对象的克隆:Java对象的克隆分为深克隆和浅克隆。实现Cloneable 接口,可以实现浅克隆也可以实现深克隆;实现Serializable接口通过对象的序列化和反序列化实现克隆。
java异常体系:Java异常体系分为Error和Exception两大类,它们都继承自Throwable。其中errror分为VirtualMachineError和其它error。这些几乎不通过代码处理。Exception分为RuntimeException(也称为运行时异常)和其它Exception(受査异常)。
类的实例化顺序:由父到子:静态变量,静态块,再由父到子:非静态变量,构造函数。
反射相关:
反射的功能:运行时构造一个类对象;生成动态代理;判断一个类所具有的成员变量和方法。
反射的应用:Spring框架中IOC基于反射创建对象和设置依赖属性。
其它:
Java中没有默认的拷贝构造方法,需要自己实现。
StringBuilder线程不安全
对象中某个值不需要序列号的时候可以使用transient关键字修饰。
多线程相关:
Java线程是重量级线程
多线程上下文切换:当线程数大于程序分配的cpu数量时就需要轮转使用cpu,这个就是上下文切换。(进程控制块PCB)。
如何结束一个线程:设置一个flag变量,这个变量要多线程可见;使用interrupt 方法,结合isInterrupt方法使用 。
对象监视器
Java提供的锁是对象级的。
sleep、join、yield方法的区别:
ThreadLocal:典型应用场景为数据库连接管理、session管理等。
synchronized原理:同步块使用monitorenter和monitorexit实现,同步方法使用ACC_SYNCHRONIZED实现。
volatile原理:采用内存屏障来实现的。
happens-before原则:1:A happens-before B则A的操作结果对B可见,而且A的执行顺序排在B之前。2:如果两个操作之间存在happens-before关系,并不意味一定要按照happens-before关系来执行,只要于该关系执行的结果一致即可。
Java内存模型:
线程间的通信方式:共享内存;消息传递(wait、notify、BlockingQueue)
阻塞队列:7个
CAS相关:
countDownLatch和cyclicBarrier:
Executors相关:四个参数(最大线程数、核心线程数、阻塞队列、拒绝策略)
虚拟机相关:
为对象分配内存:
分为两种情况:内存绝对规整和内存不连续的。内存规整的情况是:虚拟机只需要在被占用的内存和可用空间之间移动指针即可,这种方式被称为“指针碰撞”;内存不规整的情况是:虚拟机需要维护一个列表,来记录哪些内存是可用的。分配内存的时候需要找到一个可用的内存空间,然后在列表上记录下已被分配,这种方式成为“空闲列表”。
对象如何定位访问:
直接指针访问和句柄访问
内存溢出怎么排错?
1、查看控制台日志
2、查看堆栈日志(JDK 自带的 jvisualvm)
3、定位出内存溢出的空间
哪些可以作为gcroot?
1、方法区中类静态熟悉引用的对象
2、方法区中常量引用的对象
3、本地方法栈中JNI引用的对象
4、虚拟机栈中引用的对象
Java对象的引用类型:
强引用、软引用、弱引用、虚引用
哪些可以作为安全点?
1、循环的末尾
2、方法返回前
3、调用方法call之后
4、抛出异常的位置
垃圾收集器:
新生代:Serial收集器、ParNew收集器、Parallel Scavenge 收集器
老年代:Serial Old 收集器、Parallel Old 收集器、CMS收集器
新生代+老年代:G1收集器、ZGC收集器
cms:初始标记、并发标记(和用户线程一起)、重新标记、并发清除(和用户线程一起)
G1:初始标记、并发标记、最终标记、筛选回收
对象分配规则:
对象优先分配在Eden区、大对象直接进入老年代、长期存活的对象进入老年代、动态判断对象的年龄、空间分配担保
gc日志:
双亲委派:
1、共享功能:避免类重复加载
2、隔离功能:为了安全性
Java对象在内存中的标志:
1、可达的
2、可恢复的
3、不可达的