JVM从入门到入门!

最近的学习状态超级差,也没有怎么写博客,知识点也都忘得差不多了。该复习一波了!

垃圾回收

一、引用

  • 强引用:只要引用还在,垃圾回收就不会回收引用对象
  • 软引用:系统在发生内存溢出异常之前,会把这些对象列进回收范围中进行二次回收,如果第二次回收还没有足够的内存,这时会抛出内存溢出异常
  • 弱引用:只能生存到下一次垃圾回收之前
  • 虚引用:对象被垃圾回收器回收时收到一个系统通知

二、内存

  • 栈(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对象

连接:包括验证,准备,解析

初始化:为类的静态变量赋初始值

先这么多,敬请期待“从入门到放弃”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值