当前位置: 首页 > news >正文

JVM 内存分哪几个区,如和判断一个对象是否存活

JVM 内存分哪几个区,每个区的作用是什么?

java 虚拟机主要分为以下一个区:方法区:

1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生 GC,在这里进行的 GC

主要是对方法区里的常量池和对类型的卸载

2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后

的代码等数据。

3. 该区域是被线程共享的。

4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态

性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。

虚拟机栈:

1. 虚拟机栈也就是我们平常所称的栈内存,它为 java 方法服务,每个方法在执行的时候都

会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。

2. 虚拟机栈是线程私有的,它的生命周期与线程相同。

3. 局部变量表里存储的是基本数据类型、returnAddress 类型(指向一条字节码指令的地址)和对象

引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对

象相关联的位置。局部变量所需的内存空间在编译器间确定

4. 操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索引来访问,

而是压栈和出栈的方式

5. 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调

用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。

本地方法栈

本地方法栈和虚拟机栈类似,只不过本地方法栈为 Native 方法服务。

java 堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此

该区域经常发生垃圾回收操作。

程序计数器

内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、

循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个 java 虚拟

机规范没有规定任何 OOM 情况的区域。

如和判断一个对象是否存活?(或者 GC 对象的判定方法)

判断一个对象是否存活有两种方法:

1. 引用计数法

所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器

加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是

死对象”,将会被垃圾回收.引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象 A 引用对象 B,对象B 又引用者对

 A,那么此时 A,B 对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没

有采用这种算法。

2. 可达性算法(引用链法)

该算法的思想是:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到 GC Roots 没有任何

引用链相连时,则说明此对象不可用。

 java 中可以作为 GC Roots 的对象有以下几种:

· 虚拟机栈中引用的对象

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

· 方法区常量池引用的对象

· 本地方法栈 JNI 引用的对象

虽然这些算法可以判定一个对象是否能被回收,但是当满足上述条件时,一个对象比不一定会被回收

当一个对象不可达 GC Root 时,这个对象并

不会立马被回收,而是出于一个死缓的阶段,若要被真正的回收需要经历两次标记

如果对象在可达性分析中没有与 GC Root 的引用链,那么此时就会被第一次标记并且进行一次筛选,筛

选的条件是是否有必要执行 finalize()方法。当对象没有覆盖 finalize()方法或者已被虚拟机调用过,那么

就认为是没必要的。

如果该对象有必要执行 finalize()方法,那么这个对象将会放在一个称为 F-Queue 的对队列中,虚拟机

会触发一个 Finalize()线程去执行,此线程是低优先级的,并且虚拟机不会承诺一直等待它运行完,这是

因为如果 finalize()执行缓慢或者发生了死锁,那么就会造成 F- Queue 队列一直等待,造成了内存回收

系统的崩溃。GC 对处于 F-Queue 中的对象进行

第二次被标记,这时,该对象将被移除即将回收集合,等待回收。

http://www.lryc.cn/news/67588.html

相关文章:

  • 在Spring Boot微服务使用Jedis操作Redis List列表
  • springboot + vue 部署 阿里云云服务器 ECS
  • mysql 日期 计算 时间差 天数差
  • 不用网闸、FTP的话 如何实现内外网数据交换?
  • 探寻Spring MVC的奥秘:内部组件与工作流程详解
  • eclipse svn ClassNotFoundException: javassist.ClassPool
  • 广度优先遍历搜索迷宫最短路径
  • 分布式计算基础知识
  • Mybatis方式完成CRUD操作
  • css背景 background的属性作用和值
  • 六大行文化特色知识(上)
  • 匿名对象的特性和使用场景你知道吗?
  • 企业应该如何做到数字化转型成功?
  • PBDB Data Service:Bibliographic references for fossil collections(采集记录参考书目)
  • 浅析图形验证码安全
  • 论文笔记:基于手机位置信息的地图匹配算法
  • 因果推断系列16-面板数据与固定效应
  • 第三十三章 弹性池塘2(弹城少年歌词)
  • PMP之预测部分
  • Node.js 异步流控制
  • 掌握这些思维技巧,解救996的打工人!
  • 【嵌入式Linux】MBR分区表 和 GPT分区表
  • 【华为OD机试真题】MVP争夺战(python)100%通过率 超详细代码注释 代码解读
  • 实战打靶集锦-019-BTRSys2.1
  • 2023中国(苏州)国际电源工业展览会暨高端论坛
  • 基于SpringBoot+Vue的校园疫情防控系统(附源码和数据库)
  • Docker启动安装nacos
  • FastDFS总结
  • 【职场新人备忘录】新人职场生存指南:快速适应、持续成长和个人提升
  • SpringCloud Alibaba详解