JAVA基础——JVM

       JVM——JAVA虚拟机,JVM是JAVA能具备跨平台特性的关键,其从软件层面屏蔽了底层硬件、指令层面的细节让他兼容各种系统。

       借用官方的图,JDK中包括了JRE,JRE中包括了JVM。在编译JAVA文件时,需要由JVM编译成电脑认识的二进制文件,JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行。

.java文件 —javac—> .class文件 —JVM—> 二进制

 一、JVM的内存模型以及分区

        JVM 分为堆区和栈区,还有方法区初始化的对象放在堆里面引用放在栈里面 class 类信息常量池(static 常量和 static 变量)等放在方法区
(1)方法区:是所有线程共享的内存区域, 主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字节码)等数据;
(2) 堆:JVM所能管理的内存中最大的一块,被 所有线程所共享 ,在虚拟机启动时创建初始化的对象,成员变量(那种非 static 的变量),所有的对象实例和数组都要在堆上分配,也是逻辑收集管理器管理的主要区域
(3)栈:栈描述的是JAVA方法执行的内存模型,其结构由栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,动态链接及方法出口等信息。其中局部变量表 存放的是 8 大基础类型,对象引用地址、returnAddress类型(保存return后要执行的字节码指令地址)等;操作数栈用于操作,将代码操作后的结果放入局部变量表中;动态链接存储调用方法要链接的其他方法的地址;方法出口为return或异常抛出;
(4)本地方法栈:主要为 Native 方法服务,修饰的大部分源码都是C/C++;
(5)程序计数器:保存当前线程正在执行的字节码指令的地址即记录当前线程执行的行号,是JVM中唯一没有规定OutOfMemoryError情况的区域
 二、JVM中堆上的分区
       堆里面分为新生代和老生代( java8 取消了永久代,采用了 Metaspace——》方法区),GC(垃圾回收机制)用于管理JAVA上的堆空间,不定时的清理堆内存中的不可达对象(程序不可访问,无法使用的对象 )。
(1)两者间的空间大小默认为新生代:老生代=2:1。该值通过参数-XX:NewRatio来指定;
(2)新生代包含 Eden+Survivor区,survivor 区里面分为 from to 区,三者间所占空间大小默认为Eden:FromSurvivor:ToSurvivor = 8:1:1。该值通过参数-XX:SurvivorRatio来指定;
(3)回收时,如果用的是复制算法(将内存平均分为两部分,每次只使用其中一部分,存满后将所有存活的对象复制到另一部分,然后清空,如此循环 ),从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动到老年区;
(4)当 JVM 内存不够用的时候,会触发 Full GC(清理整个堆空间,全局GC),清理 JVM 老年区。 新生区满了之后会触发 YGC(对新生代的GC),先把存活的对象放到其中一个 Survice 区,然后进行垃圾清理。如果仅仅清理需要删除的对象,这样会导致内存碎 片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候, 就会使用下一个 Survive,这样循环使用。如果有特别大的对象,新生代放不下, 就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存 活时间一般比较久远。
三、GC的两种判别方法(判定哪些回收,哪些不回收)
       引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 会回收。引用计数法虽然实现简单,而且效率高,但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A 的情况)
       引用链法(可达性分析法): 通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等-static 量)来判断,如果有一条链能够到达 GC ROOT 就说明对象可用,不要回收,不能到达 GC ROOT 就说明可以回收。JAVA中可以作为GC ROOT的对象有以下几种:

(1)虚拟机栈中引用的对象

(2)方法区类静态属性引用的对象

(3)方法区常量池引用的对象

(4)本地方法栈引用的对象

四、JVM中GC的收集方法( 标记清除、标记整理、复制算法
(1)标记清除:为每一个对象存储一个标记位,记录对象的状态(活着或死亡) 。标记完毕之后再将所有死亡的对象清除,效率不高,会产生碎片,一般应用于老年代;
(2)复制算法:分为 81 Eden 区和 survivor 区,就是上面谈到的 YGC;
(3)标记整理(又称标记压缩):与标记清除一样,先对对象进行标记,标记完毕之后,整理所有存活的对象存放到另一空间,然后清除本空间的所有剩余对象,一般用于老年代。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值