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

这篇具有很好参考价值的文章主要介绍了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 中的对象进行

第二次被标记,这时,该对象将被移除即将回收集合,等待回收。 文章来源地址https://www.toymoban.com/news/detail-445613.html

到了这里,关于JVM 内存分哪几个区,如和判断一个对象是否存活的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络安全主要包含哪几个方面?

    很多用户都不知道网络安全主要体现在哪些方面,其实这是无法一概而论的,因为网络安全是一个非常庞大的体系,涉及的内容有很多,不过总体而言,网络安全主要体现在这四个方面:系统安全、应用安全、物理安全、管理安全。 1、系统安全 系统安全是指在系统生命周期

    2024年02月08日
    浏览(45)
  • CRM系统销售漏斗有哪几个阶段?

      企业获取客户、销售和转型是一个长期的过 程。CRM客户管理系统的销售漏斗可 以拆分销售过程的各个阶段, 异常时 显 示 是 哪个销售环节出现 了 问题, 并 及时进行调整,提高销售效率。 那么, CRM 系统销售漏斗分为哪几个阶段? 一、建立认知阶段 企业从各个渠道获取

    2024年02月08日
    浏览(40)
  • 区块链应用场景将会设计哪几个方面?

    近年来,随着科学技术的发展,越来越多的高新技术开始走入人们的视野,而作为目前最前沿技术之一的区块链技术,正以其蓬勃的趋势布局到人们的日常生活起居中。 目前来说,区块链技术早已从纯粹的技术性探究迈向了应用落地的阶段。世界各国早已出現许多与之有关的

    2024年02月16日
    浏览(41)
  • 数据分析完整流程一般包括哪几个环节/步骤

    问题定义: 确定需要解决的问题或目标,明确分析的方向和目的。 数据收集: 收集与问题相关的数据,可以包括从各种来源获取的结构化或非结构化数据。 数据清洗: 对收集到的数据进行清理,处理缺失值、异常值和重复值,确保数据质量。 数据探索(探索性数据分析

    2024年01月21日
    浏览(37)
  • 什么是网络安全?网络安全包括哪几个方面?

    提及网络安全,很多人都是既熟悉又陌生,所谓的熟悉就是知道网络安全可以保障网络服务不中断。那么到底什么是网络安全?网络安全包括哪几个方面?通过下文为大家介绍一下。 网络安全是指网络系统的硬件、软件及系统中的数据受到保护,不因偶然的或者恶意的原因而遭

    2024年02月13日
    浏览(44)
  • Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

    目录 一、@SpringBootApplication 二、@SpringBootConfiguration 三、@EnableAutoConfiguration 四、@ComponentScan   @SpringBootApplication是Spring Boot框架的核心注解之一,它用于标识一个主配置类,通常是项目的入口类。该注解可以将Spring Boot应用程序自动配置和启动的相关注解整合在一起,简化了Sp

    2024年02月13日
    浏览(40)
  • 【物联网那些事儿】18 大物联网操作系统,Raspbian Pi、Ubuntu Core、Windows 10 IoT、Micropython、OpenWrt ....你用过哪几个?

    如果您查看我们周围所有连接的嵌入式系统,您会意识到物联网操作系统是确保安全、连接、互操作性、网络和存储等一系列任务的关键。 Raspbian Pi、Ubuntu Core、FreeRTOS、RIOT、Tizen、Micropython 是一些最流行的物联网设备操作系统。下面让我们看看具体他们都有什么特点。 操作

    2024年01月20日
    浏览(45)
  • 判断路由器好坏的几个决定性因素

    一、路由器价格高低的原因 不同路由器区别的价格主要的因为 (1)功能不同 虽然基本功能一样,但是一些路由器区别还内置了其他比较实用的功能,像专业防火墙功能、VPN这些,因此技术要求较高,价格自然也会跟着提高。 (2)性能不同 性能强劲的路由器内置强悍的处理器和

    2024年02月05日
    浏览(48)
  • JVM---理解jvm之对象已死怎么判断?

    目录 引用计数算法 什么是引用 可达性分析算法(用的最多的) 定义:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 但是不能解决循环引用的问题,A引用

    2024年02月12日
    浏览(40)
  • JVM中判断无效对象算法

    JVM 内存大致分为 线程私有区域 和 线程共享区域 虚拟机栈、本地方法栈和程序计数器,这三个区域是线程私有的。 虚拟机栈用于描述Java方法执行的过程。每一个方法在执行的过程中会创建一个栈帧。栈帧中包括局部变量、操作数栈、动态链接和方法出口等信息。当方法执行

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包