深入了解JVM底层原理

news2024/9/23 9:34:11

一、JVM内存结构

1、方法区:存储编译后的类、常量等(.class字节码文件

2、堆内存:存储对象

3、程序计数器:存储当前执行的指令地址(计算机处理器(CPU)正在执行的下一条指令在内存中的地址)

4、虚拟机栈:java栈,存储局部变量、方法参数、返回值以及异常处理信息

5、本地方法栈:存储本地方法的执行状态信息以上是JVM内存结构的主要部分,其中除了方法区外其他部分都是java程序员直接操作和调优的重要部分

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

线程共享:方法区、堆。

以下是一个更完整的示例代码,演示了JVM内存结构的各个部分:

public class MemoryStructureExample {

    // 静态变量,存储在方法区
    private static String staticVar = "Static Variable";

    public static void main(String[] args) {
        // 局部变量,存储在虚拟机栈
        int localVar = 10;
        
        // 创建一个对象实例,存储在堆内存
        MemoryStructureExample obj = new MemoryStructureExample();
        
        // 调用方法,会在虚拟机栈中创建方法调用的栈帧
        obj.method();
    }

    // 实例方法
    public void method() {
        // 方法中的局部变量,存储在虚拟机栈
        String localVar2 = "Local Variable";
        
        // 创建一个对象实例,存储在堆内存
        Object obj = new Object();
        
        // 调用本地方法,本地方法栈存储本地方法的执行状态信息
        System.out.println(System.currentTimeMillis());
    }
}

在这个示例中,我们展示了JVM内存结构的各个部分的应用:

  • 静态变量staticVar存储在方法区;
  • main方法中的局部变量localVar存储在虚拟机栈;
  • MemoryStructureExample对象实例存储在堆内存;
  • method方法中的局部变量localVar2也存储在虚拟机栈;
  • 方法中创建的Object对象实例也存储在堆内存;
  • 调用本地方法System.currentTimeMillis()时,本地方法栈存储本地方法的执行状态信息。

二、JVM垃圾回收

        GC 的目的在于实现堆内存中无用对象内存自动释放,减少内存碎片、加快分配速度 。线程私有的不存在垃圾回收,线程共享才存在垃圾回收。以下我们围绕如何发现垃圾和如何进行垃圾回收进行详细描述:

(一)如何发现垃圾?

1、引用计数算法

        引用计数算法核心思想是,堆中的对象每被引用一次,则计数器加 1,每减少一个引用就减 1,当对象的引用计数器为 0 时可以被当作垃圾收集。

优点:效率高,比较快

缺点:无法检测出循环引用,如两个对象互相引用时,他们的引用计数永远不可能为 0

2、可达性分析(根搜索)算法

        根搜索算法是把所有的引用关系看作一张图,从一个节点 GC ROOT 开始,寻找对应的
引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕
之后,剩余的节点则被认为是没有被引用到的节点,即可以当作垃圾。

3、三色标记法(黑灰白)

        三色标记法是用三种颜色记录对象的标记状态。这种算法通过标记对象的颜色来表示它们的状态,以确定哪些对象是活动的,哪些是垃圾对象。黑色-已标记,灰色-标记中,白色-未标记。原理是通过将引用链上的对象全部标记,最终剩余的不在引用链上的对象全部是白色的(未标记的),然后对未标记的无用的对象进行回收。这种算法通过标记对象的颜色来表示它们的状态,以确定哪些对象是活动的,哪些是垃圾对象。

3.1起始的三个对象还未处理完成,用灰色表示

3.2该对象的引用已经处理完成,用黑色表示,黑色引用的对象变为灰色

3.3依次类推

3.4沿着引用链都标记了一遍

3.5最后为标记的白色对象,即为垃圾

(二)如何清除垃圾?

1、标记清除算法(空间碎片,CMS)

        标记清除算法是通过GC Root引用链往下查找,对于引用链上有引用的对象进行标记,然后对之外的无用的对象进行清除。缺点是存在内存碎片的问题。

2、标记整理算法(性能较差,G1)

        标记整理算法是在标记清除算法上多了一步整理的操作,去除了空间碎片的问题。缺点是性能较差

3、标记复制算法(占用成倍的空间

        3.1将整个内存分成两个大小相等的区域,from 和 to,其中 to 总是处于空闲,from 存储新创建的对象。

        3.2标记阶段与前面的算法类似。

        3.3在找出存活对象后,会将它们从 from 复制到 to 区域,复制的过程中自然完成了碎片整理

        3.4复制完成后,交换 from 和 to 的位置即可。

三、四种引用

        总的来说,强引用是最常见的引用类型,只有在不再被引用时才会被回收;软引用在内存不足时会被回收;弱引用在下一次垃圾回收时会被回收;虚引用在对象被回收时会被放入引用队列中,需要手动清除。根据不同的需求和场景,可以选择合适的引用类型来管理对象的生命周期。

(一)强引用:

        普通变量赋值即为强引用,如 A a = new A();通过 GC Root 的引用链,如果强引用不到该对象,该对象才能被回收。

(二)软引用:

        例如:SoftReference a = new SoftReference(new A());如果仅有软引用该对象时,首次垃圾回收不会回收该对象,如果内存仍不足,再次回收时才会释放对象;软引用自身需要配合引用队列来释放,典型例子是反射数据。

(三)弱引用:

        例如:WeakReference a = new WeakReference(new A());如果仅有弱引用引用该对象时,只要发生垃圾回收,就会释放该对象,弱引用自身需要配合引用队列来释放,典型例子是 ThreadLocalMap 中的 Entry 对象。

(四)虚引用:
  1. 例如: PhantomReference a = new PhantomReference(new A(), referenceQueue);

  2. 必须配合引用队列一起使用,当虚引用所引用的对象被回收时,由 Reference Handler 线程将虚引用对象入队,这样就可以知道哪些对象被回收,从而对它们关联的资源做进一步处理

  3. 典型例子是 Cleaner 释放 DirectByteBuffer 关联的直接内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java后端八股----JVM篇

上图中线程1,2如果资源被抢占了,则程序计数器记录一下执行的行号,等到资源就绪后会从记录的行号继续向后执行。 Java8把静态变量以及常量放到了线程的本地内存原空间中(避免放在堆中不可控)。 👆图中第二种情况不太容易出现…

【Chapter1】操作系统概述,计算机操作系统教程,第四版,左万利,王英

文章目录 一、操作系统的基本概念1.1操作系统的层次结构1.2操作系统的运行视图1.3操作系统的概念(定义)1.4操作系统的功能和目标1.4.1操作系统的功能和目标——作为系统资源的管理者1.4.2操作系统的功能和目标——向上层提供方便易用的服务1.4.2.1GUI:图形化用户接口…

CPU vs. GPU :本质差异是?

他们的目的都是做并行计算的,但并行计算可分为时间上的并行和空间上的并行。所以我觉得本质差异是: CPU 时间并行GPU 空间并行 这样就容易理解他们的工作方式: 对CPU来说,不同的核心可以执行不同的机器指令但GPU则不同&#xff…

长安链开源社区发布2023年度长安链优秀应用案例

1月27日结束的“长安链发布三周年庆暨生态年会”上,在国家区块链技术创新中心的指导下,长安链开源社区联合长安链生态联盟正式发布2023年度长安链行业示范案例、领域精品案例及特色创新案例。 本次评选面向2023年度应用长安链上线并取得应用成效的案例&…

SSA优化最近邻分类预测(matlab代码)

SSA-最近邻分类预测matlab代码 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出,主要是受麻雀的觅食行为和反捕食行为的启发。 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试集,比例为8&#…

intelliJ配置Android环境 与 文件目录解释

实验目的与要求: 目的:掌握面向Android编程的开发环境搭建。学习、掌握Android程序编写基本步骤,例如,Android Studio平台编写简单的一个 HelloWorld程序,掌握编译、运行等基本步骤和操作。 内容要求: 搭建…

杂货铺 | vscode配置C/C++环境(亲测极简ver)

文章目录 📚Step1:下载安装VSCode📚Step2:下载安装g📚Step3:编辑环境变量📚Step4:安装vscode插件📚Step5:建好文件夹⭐️📚Step6:开始…

【Node.js从基础到高级运用】十三、NodeJS中间件高级应用

在现代web开发中,Node.js因其高效和灵活性而备受青睐。其中,中间件的概念是构建高效Node.js应用的关键。在这篇博客文章中,我们将深入探讨Node.js中间件的高级应用,包括创建自定义中间件、使用第三方中间件等。我们将从基础讲起&a…

qt vs 编程 字符编码 程序从源码到编译到显示过程中存在的字符编码及隐藏的字符编码转换

理解字符编码,请参考:unicode ucs2 utf16 utf8 ansi GBK GB2312 CSDN博客 了解windows字符显示必须了解locale概念 参考:揭密 Windows 上的各种 locale - 知乎 汉字(或者说多字节字符)的存放需求,是计算…

【CSP试题回顾】202309-2-坐标变换(其二)

CSP-202309-2-坐标变换&#xff08;其二&#xff09; 解题代码 #include <iostream> #include <vector> #include <cmath> #include <iomanip> using namespace std;struct MyOpt {double k, theta; }; int n, m, opt, s, e; double para, x, y;int …

Java项目:62 基于ssm的校园驿站管理系统+jsp

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员管理快递仓库信息&#xff0c;管理待发货信息&#xff0c;管理已收快递&#xff0c;管理物流以及留言信息&#xff0c;管理员工和用户资料。 员…

C++——字符串、读写文件、结构体、枚举

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

【Java】高级篇1:异常处理

异常&#xff1a;程序在执行过程中出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 Java的异常抛出机制 Java异常体系 1、Throwable 2、Error和Exception 异常处理方式 1、try-catch-finally&#xff08;捕获异常&#xff09; 基本结构&#xff1a; 使用…

B140XW01 V8 +OZ9956B PDF

B140XW01 V8 PDF OZ9956B 14B38-COW 18650串联50欧点亮一颗灯珠

代码随想录算法训练营第11天| 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

系列文章目录 目录 系列文章目录20. 有效的括号利用栈对称匹配将栈中元素弹出与判断栈顶元素是否匹配分开&#xff0c;比较耗时&#xff08;2ms)&#xff1a;若将栈中元素弹出与判断栈顶元素是否匹配放一起&#xff0c;比较节省时间(1ms)&#xff1a; 1047. 删除字符串中的所有…

探索区块链世界:从加密货币到去中心化应用

相信提到区块链&#xff0c;很多人会想到比特币这样的加密货币&#xff0c;但实际上&#xff0c;区块链技术远不止于此&#xff0c;它正在深刻地改变我们的生活和商业。 首先&#xff0c;让我们来简单了解一下什么是区块链。区块链是一种分布式数据库技术&#xff0c;它通过将…

MySQL的insert-on-duplicate语句详解

一、insert-on-duplicate语句语法 注意&#xff1a;ON DUPLICATE KEY UPDATE只是 MySQL的特有语法&#xff0c;并不是SQL标准语法&#xff01; INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。 这个语法适用于在 insert的时候…

操作系统核心知识点大梳理

计算机结构 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时&#xff0c;先从内存中取出第一条指令&#xff0c;通过控制器的译码&#xff0c;按指令的要求&#xff0c;从存储器中取出数据进行指定的运算和逻辑操作等加工&#xff0c;然后再按地址把结果送到内存中去…

做跨境用哪种代理IP比较好?怎么选到干净的IP?

代理IP对于做跨境的小伙伴来说&#xff0c;都是必不可少的工具&#xff0c;目前出海的玩法已经是多种多样&#xff0c;开店、账号注册、短视频运营、直播带货、网站SEO等等都是跨境人需要涉及到的业务。而国外代理IP的获取渠道非常多&#xff0c;那么做跨境到底应该用哪种代理I…

Servlet两种配置

通过xml配置 <servlet><servlet-name>MyServlet</servlet-name><servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/MyServlet</ur…