最近的学习状态超级差,也没有怎么写博客,知识点也都忘得差不多了。该复习一波了!
垃圾回收
一、引用
- 强引用:只要引用还在,垃圾回收就不会回收引用对象
- 软引用:系统在发生内存溢出异常之前,会把这些对象列进回收范围中进行二次回收,如果第二次回收还没有足够的内存,这时会抛出内存溢出异常
- 弱引用:只能生存到下一次垃圾回收之前
- 虚引用:对象被垃圾回收器回收时收到一个系统通知
二、内存
- 栈(stack):存放基本数据类型,对象的引用
- 堆(heap):存放new的对象
- 静态区:存放字面量(10,‘abc’)和静态常量
图示:
例子:
String str = new String("hello");
上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。
三、垃圾回收算法
标记—清除算法:在二次标记后完成统一回收,在回收之后会产生大量不连续内存碎片,如果要创建一个较大内存的对象,没有足够连续内存,会再次触发GC
标记—整理算法:清除的时候会把所有存活的对象向一端移动(归整),然后清除
复制算法:分为大小相同的俩部分内存,每次只用一部分,当这部分的内存快满的时候,把没有被回收的对象移到另一部分,把这部分清空(效率低)
分代收集算法:根据对象存活周期的不同,分为新生代和老年代,新生代采用复制算法,老年代采用标记清除或标记整理
在新生代触发的GC称为Minor GC;在老年代触发的GC称为Full GC
类加载
一、概念
类加载:将class文件加载到JVM中。类的加载是动态的,它不会一次性把所有类都加载到虚拟机,而是把一些必要的类先加载到虚拟机,然后用到哪些再加载,这样节省了内存开销。
二、类的加载时机
- 创建类的实例(new)
- 访问类的静态变量,或为类的静态变量赋值,调用类的静态方法
- 反射的方式
- 初始化某个类的子类,其父类也会被初始化
- 标明某个类为启动类,执行main方法
三、类加载器
class文件是通过类加载器加载到JVM中的
分类:
- 启动类加载器(Bootstrap ClassLoader):加载系统主要文件
- 扩展类加载器(ExtClassLoader):
- 应用类加载器(AppClassLoader)
- 自定义类加载器(User ClassLoader)
类加载器在成功加载某个类之后,会把得到的java.lang.Class类的实例缓存起来,这样下次再加载这个类时候就可以直接使用实例,而不会再次加载。
双亲委托模型:一个类加载器收到类加载的请求不会自己去尝试加载这个类,而是交给它父类,依次向上。这样,防止内存出现多份同样的字节码
类初始化
类初始分为类的加载,连接,初始化。
加载:查找并加载类的二进制数据,在java堆中创建一个java.lang.Class对象
连接:包括验证,准备,解析
初始化:为类的静态变量赋初始值
先这么多,敬请期待“从入门到放弃”