jvm深入理解

JAVA代码经JVM编译成字节码,通过类加载机制加载到内存,包括堆和非堆。类加载有启动、扩展、应用和自定义四种方式,遵循双亲委派模型。内存管理涉及堆和方法区的内存碎片问题,垃圾回收通过引用计数法和可达性分析法判断对象存活状态,采用标记清除、复制、标记整理和分代收集等算法优化内存利用率。
摘要由CSDN通过智能技术生成

JAVA的运行

java作为一门面向对象的语言,自1995年诞生以来,就进行了多次改变成为世界上最流行的面向对象的语言,没有之一;
优点:面向对象,真正反映显示世界的逻辑抽象;
缺点:相对脚本语言比如:Python、js、html等,不够灵活,相关算法和图形设计能力较弱;

java代码经过jvm编译器的编译形成二进制字节码,这些字节码不能直接被计算机使用,必须经过虚拟机的类加载机制加载到内存中(对象实例存储在堆,数据结构,类名称,方法名,修饰符等存储在方法区~非堆中),然后进行验证,准备,解析,初始化完成调用前的准备。后续进行字节码的使用和卸载工作。

而类的加载有多种方式,启动(bootstrap)加载,扩展(ext),应用(app),自定义(user)等多种方式。

类加载器的模式是先查找本级,找不到就向上查找,顺序与前段描述相反的顺序来查找,就是所谓的双亲委派。

特别注意的是堆和非堆只是逻辑概念上的区分,他们对线程是共享的,而栈是堆线程私有的,用于运行方法和结束返回,抛出异常的存储指令。
由于方法区主要存储类信息,常量,静态变量,编译代码数据等,不容易触发回收机制,所以常常也被成为永久代。

这里说明下,程序真正的运行逻辑。cpu在同一时刻一个核只能运行一个线程,而线程的执行内容由程序计数器来指定,程序计数器的执行指令来源于jvm栈。jvm栈中存储方法的引用(指针),局部变量,返回地址等用于明确指定方法的运行顺序。jvm栈由此可知是线程私有的,保证执行安全。
在jvm栈中,实例的引用,局部变量,返回地址这些,需要将在编译期间就要分配内存空间,以便进行程序运行。堆实在实例化的过程中分配内存空间,而方法区在的静态变量,常量会在类加载的过程进行内存空间的分配。本地方法栈与jvm栈相对应加载执行本地方法不在本文讨论范围内,不再多叙述。

既然提到了,堆,方法区,jvm栈的内存分配问题,那么将会出现内存分配的碎片问题。如何处理这些内存碎片,怎么样高效利用内存,将会是我们讨论的垃圾回收问题。
那么怎么样判断一个对象已经可以回收,不再被别的地方使用?

一种方法是,引用计数法:对象有个引用计数属性,每次被引用都会都会计数+1,每次释放引用都会计数-1,垃圾回收器只会回收计数为0的对象(对象互相循环引用会出现无法计数为0的状态);
另一种方法是,可达性分析法:从对象的根从上往下查找,查找所有的路径,称为引用链,没有任何引用链时,对象不可用(不可达);对象的根包含:jvm栈引用的对象、静态属性引用的对象(存储在方法区)、常量引用的对象(存储在方法区)、本地方法栈引用的对象;

既然已经可以判断对象的存活(引用计数法/可达性分析法),那么可以通过算法进行垃圾搜集;主要有以下几种分类:标记清除算法、复制算法、标记整理(压缩)算法、分代收集算法等;
标记清除算法:1、标记不存活的对象;2、清除标记的对象;
优点:算法简单、基础、易于理解;缺点:效率较低、容易出现内存碎片;

复制算法:1、内存空间分为两半;2、标记不存活的对象;3、复制存活的对象到另一半空间;4、回收当前这一半的内存;
优点:解决内存碎片问题;缺点:内存变为原来的一半、运作复杂;

标记整理(压缩)算法:1、标记不存活的对象;2、复制存活的对象到一边;3、清除另一边的对象即可;
有点:不会存在内存碎片、高效利用内存空间,是前两种算法的综合;缺点:比第一种运作复杂;

分代收集算法:将堆内存空间分为老年代和新生代;
老年代:对象存活周期长,标记清除和标记整理算法较好;
年轻代:对象大量的创建和消亡,复制算法比较好;

年轻代分为,from survivor,to survivor,eden三种空间,比例为1:1:8,所以,复制算法对年轻代的收集很有用,年轻代的复制算法逻辑:
1.对象在eden区创建;2.触发第一次GC,存活对象从eden区移动到from区;3.第二次GC,存活对象从eden和from区移动到to区;这样能利用9/10的空间,极大的解决了内存的一半使用的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值