java虚拟机:JVM相关知识整理

本文详细解析了JVM的内存分区,包括线程共享的堆区和方法区,以及线程私有的程序计数器、本地方法栈和Java虚拟机栈。深入探讨了垃圾回收算法,如标记-清除、复制和分代收集算法,并解释了对象存活的判断方法,如引用计数法和可达性分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、JVM分区组成:

线程共享:堆区、方法区

线程私有:程序计数器、本地方法栈、Java虚拟机栈

1、方法区存放的是类的信息、静态变量以及常量,最重要的是运行时常量池。

2、Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,栈帧结构包括:局部变量表、操作数、返回值地址。

3、堆区存放的是对象。

二、GC(垃圾回收)

1、垃圾回收算法:标记-清除算法、复制算法、分代收集算法(最常用)

一般垃圾回收发生在堆区,堆区分为老年代和年轻代,年轻代又分为Eden、survivor1和survicor2。老年代对象的生命周期比较长,采用标记-清除算法;年轻代会有大量对象需要回收,采用复制算法,Eden和survivor1存活的对象复制到survivor2中,然后清除。长期在survivor里的对象如果没有被回收会被放到Eden中。

如果对象占用内存超过了Eden的内存,会造成JVM内存溢出。

2、对象是否存活

引用计数法:在堆中存储对象时,在对象头处维护一个counter计数器,如果一个对象增加了一个引用与之相连,则将counter++。如果一个引用关系失效则counter–。如果一个对象的counter变为0,则说明该对象已经被废弃,不处于存活状态。

缺点:很难解决对象间循环引用问题

可达性分析:通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

如下情况的对象可以作为GC Roots:

虚拟机栈(栈桢中的本地变量表)中的引用的对象

方法区中的类静态属性引用的对象

方法区中的常量引用的对象

本地方法栈中JNI(Native方法)的引用的对象

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值