一、Java中的四种引用
1、强引用
无论如何都不回收,宁可抛出OOM,也不回收。
2、软引用
内存够则不回收,内存不够就回收
3、弱引用
GC线程一旦发现就回收
4、虚引用
形同虚设,随时被回收
设计的作用就是用来跟踪对象被垃圾回收的活动,虚引用必须和引用队列联合使用。
GC在回收一个对象时,如果一个对象还有虚引用,则将这个虚引用放入与之关联的引用队列中。
二、JMM
JMM(Java Memory Model),JMM 就是 「Java内存模型」(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)「屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果」。
Java内存模型规定所有的变量都存储在主内存中,包括实例变量,静态变量,但是不包括局部变量和方法参数。每个线程都有自己的工作内存,线程的工作内存保存了该线程用到的变量和主内存的副本拷贝,线程对变量的操作都在工作内存中进行。「线程不能直接读写主内存中的变量」。
每个线程的工作内存都是独立的,「线程操作数据只能在工作内存中进行,然后刷回到主存」。这是 Java 内存模型定义的线程基本工作方式。
三、泛型和泛型擦除
1、泛型:「把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型」
2、泛型擦除是什么?
因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,「在编译阶段使用泛型,运行阶段取消泛型,即擦除」。擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。
四、Java中的异常体系
异常体系:
Exception:
(1)受检查时异常,编译期发现。
(2)不受检查时异常,运行时发现。
finally不执行的3种情况:
(1)CPU关闭
(2)线程死亡
(3)try或者finally中用到了System.exit(in)退出程序。