- Java中的强引用,软引用,弱引用,虚引用
- Java中对象的生命周期
- Java的注解
- Java中的强引用,弱引用,软引用,虚引用
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。
软引用在内存不足时会被回收。用于实现内存敏感的高速缓存。如果一个对象只具有 软引用,则内存空间充足时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
只具有 弱引用 的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
虚引用 顾名思义,就是形同虚设。与其他几种引用都不同,虚引用并不会决定对象的生命 周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
这四种引用也引申出Java对象的五种可达性:
强可达(Strongly reachable) 软可达(Softly reachable) 弱可达(Weakly reachable) 虚可达(Phantom reachable) 不可达(Unreachable)
- Java中对象的生命周期
在Java中,对象的生命周期包括以下几个阶段:
1.创建阶段(Created)
JVM 加载类的class文件 此时所有的static变量和static代码块将被执行 加载完成后,对局部变量进行赋值(先父后子的顺序) 再执行new方法 调用构造函数 一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段。
2.应用阶段(In Use)
对象至少被一个强引用持有着。
3.不可见阶段(Invisible)
当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。 简单说就是程序的执行已经超出了该对象的作用域了。
4.不可达阶段(Unreachable)
对象处于不可达阶段是指该对象不再被任何强引用所持有。 与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的任何强引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。
5.收集阶段(Collected)
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作。
6.终结阶段(Finalized)
当对象执行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。
7.对象空间重分配阶段(De-allocated)
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段。
- Java的注解
注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。
Java中内置了三种标准注解以及四种元注解。
三种标准注解分别是:
@Overide 复写。表明当前的方法将覆盖超类的方法,如果拼写错误或者方法签名对不上,编译器就会发出错误提示。
@Deprecated 废弃。标明方法或者域已经废弃,调用处会收到编译器的警告。
@SuppressWarnings 关闭不当的编译器警告信息。
元注解是专职负责注解其他的注解,四种元注解分别是:
@Target 表示该注解可以用于什么地方,可能的ElementType参数包括:
- CONSTRUCTOR 构造器的声明
- FIELD 域声明
- LOCAL_VARIABLE 局部变量声明
- METHOD 方法声明
- PACKAGE 包声明
- PARAMETER 参数声明
- TYPE 类,接口(包括注解类型)或枚举声明
@Retention 表示需要在什么级别保存该信息,可选的RetentionPolicy参数包括
- SOURCE 注解将被编译器丢弃
- CLASS 注解在class文件中试用,但会被VM丢弃
- RUNTIME VM将在运行期也保留注解,因此可通过反射机制读取注解的信息
@Ducumented 将该注解包含在Javadoc中 @Inherited 允许子类继承父类成员的注解
�注解通常需要有对应的注解处理器,通过反射接口的getAnnotation()可以拿到注解实例