深入理解虚拟机-笔记1

1.JVM组成部分及各部分作用

  • jvm主要包含类加载器、运行时数据区、执行引擎、本地库接口、本地方法库。当执行java程序时,首先需要将.java文件编译为.class文件。然后通过jvm类加载器加载,然后执行类加载过程,转换成运行时数据区中所需要的数据。然后通过执行引擎来执行程序,执行过程中,需要调用本地方法库中的方法(由其他语言编写,例如hascode、wait等),由执行引擎调用本地接口来调用。在开发的过程中,我们更多的关注运行时数据区部分。
  • 运行时数据区包括:方法区、 堆,虚拟机栈、本地方法栈、程序计数器。
    1.方法区主要保存着虚拟机加载的类的信息、静态变量、常量等数据
    2.堆的作用就是用来保存对象实例
    3.虚拟机栈:用来保存执行的方法信息,每一个被执行的方法,都会在虚拟机栈中创建一个栈帧。
    4.本地方法栈与虚拟机栈类似
    5.程序计数器用来记录jvm接下来需要执行的字节码指令,属于线程私有空间,也是唯一不会发生OOM的区域

2.类加载过程

执行java程序时,首先编译成.class,然后由jvm类加载器进行加载,加载过程包括:加载–验证–准备–解析–初始化–使用–卸载7个过程。其中验证–准备–解析统称为连接。

3.双亲委派机制

当jvm中的类加载器分为:启动类加载器(主要用于加载java_home/lib下的类)、扩展类加载器、程序类加载器、自定义加载器,其继承关系自上而下为:启动类加载器<–扩展类加载器<–程序类加载器<–自定义加载器。当jvm加载一个类时,首先会交给上一级类加载器进行加载,如果加载不了,然后自己在进行加载处理。这样做的好处是保证了jvm的安全,同时避免多次加载同一个class。

4.对象是否可被回收的条件

当jvm执行GC时,会回收掉那些不可用的对象所占用的空间。判断对象是否可用主要通过两种方法:第一,计数法。每当对象被引用一次,对象的引用次数就加一。当发生gc时,会回收掉引用次数为0的对象空间。使用这种方法时,会有一个问题,当对象相互引用时,则对象永远不会被回收。第二种方法:根路径搜索法,根据一系列GCRoot节点向下搜索,搜索所走的路径称为引用链路,如果一个对象不存在任何一条引用链路能够到达,则该对象不可被引用,在GC时则可以被回收。在java中有4中引用类型,强引用,软引用,弱引用,虚引用。强引用指的是Object a=new Object()这种方式创建的,垃圾回收不会回收这种引用对象。当内存不足时,在发生OOM;软引用比强引用弱一些,当系统将要发生内存溢出异常时,会将该类型引用列入回收范围进行第二次回收,如果还是没有足够的内存,则发生内存溢出异常,jdk提供softReference实现软引用。弱引用对象只能生存到下次gc之前,无论内存是否足够,gc都将回收。
虚引用:暂时不太了解具体如何使用。

5.垃圾回收算法

标记清除算法

主要分两步,首先进行标记,将可回收的对象空间进行标记,然后当发生gc时,清除掉可回收的空间。这种算法在存在的问题:1,标记和清除的效率不高;2,回收后,空间可能不连续,当有大的对象需要分配空间时,发现空间不足,可能会再次触发GC。

复制算法

将内存空间平均分成两份,每次只使用其中一块,保证其中一块是空的。当其中一块满了之后,发生GC,将存活的对象复制到另外一块空的空间。之后循环以上步骤。这种算法的好处是:效率比较高,也不产生碎片空间,缺点是:降低空间使用效率。如果对象存活率较高,则可能会频繁发生复制,导致效率降低。

标记整理算法

与标记清除算法类似,区别在于在发生gc时,将存活对象向内存的同一个端移动,这样内存中的一端为存活对象,另一端为可回收的空间,两端相交的部分为界限,当发生gc时,只需要回收可回收的那一端。这种算法比较适合于老年代。

分代算法

将内存分为新生代和老年代,其中新生代又分为eden、S1(幸存代),S2,他们的比例为8:1:1,当创建对象分配空间时,会首先分配eden空间,当发生gc时,会将存活对象移动到幸存区S1.移动后将S1和S2互换,重复以上步骤。没经过一轮gc,对象的年龄就会+1,当经过几轮gc后,会根据对象的年龄判断是否需要将对象移动到老年代。
根据不同算法的特点及对象生命周期的特点:新生代对象一般生命周期短,所以当发生gc时,可能大部分对象已经死亡,存活的对象很少,所以只需要少量的复制就可以完成垃圾回收,所以新生代更适合使用复制算法;而老年代中可能存在生命周期较长较大的对象,因此不宜使用复制算法,标记整理算法更加合适

6.常用JVM参数

Xmx:可用最大内存
Xms:可用最小内存,可以设置与Xmx值相同,避免发生gc后,自动调整
Xmn:新生代内存大小
Xss:每个线程可分配内存大小,理论上该值越小,可分配线程数越多。

个人理解,如有错误之处,还请多多指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值