深入了解JVM底层原理

一、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 关联的直接内存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win修改图标自定义QQ桌面图标

当安装了TIM后,想把图标改成QQ 图标见顶部,或通过网盘下载 提取码:9Ayc 操作步骤: 1.桌面右键图标,点击属性 2.选择快捷方式-更改图标 3.浏览选择下载的ico图标即可

Python中的迭代器与生成器提高性能的秘密武器【第143篇—迭代器与生成器】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的迭代器与生成器:提高性能的秘密武器 在Python编程中,迭代…

17双体系Java学习之数组的长度

数组的长度 //获取数组长度 arrays.lengthfor (int i 0; i <nums.length; i) {sum sum nums[i];}System.out.println("总和为&#xff1b;"sum);

心灵治愈交流平台|基于springboot框架+ Mysql+Java+B/S结构的心灵治愈交流平台设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 心理咨询师功能 系统功能设计 数据库…

Linux下使用ntpdate进行时间同步

1.简介 ntpdate是Linux下用于从NTP服务器同步时间的命令行工具。 2.安装 大多数Linux发行版已预装ntpdate。未安装的可使用以下命令&#xff1a; # Ubuntu/Debian sudo apt-get install ntpdate # CentOS/Fedora/RHEL sudo yum install ntpdate 3.手工同步网络时间 执行以下命…

操作系统原理与实验——实验七固定分区的分配与回收

实验指南 运行环境&#xff1a; Dev c 算法思想&#xff1a; 本实验是模拟存储管理方式中的固定分区分配与回收算法&#xff0c;系统在作业装入前预分将整个用户区划分为若干个大小确定的分区&#xff0c;然后根据待装入作业的名称和大小到分区列表中查找满足要求的空闲分区&am…

鸿蒙Next-TextInput制作简易登录页面

Entry Component struct EventCase {State username: string State password: string build() {Row() {Column({ space: 30 }) {TextInput({ placeholder: 请输入用户名, text: $$this.username }).height(40)TextInput({ placeholder: 请输入密码, text: $$this.password })…

【网络原理】TCP协议详细解析

文章目录 &#x1f332;TCP协议的概念&#x1f338;TCP协议段格式&#x1f338;TCP的特性 &#x1f333;TCP原理详解&#x1f338;确认应答机制&#xff08;安全机制&#xff09;&#x1f338;超时重传机制&#xff08;安全机制&#xff09;&#x1f338;连接管理&#xff08;安…

电脑缺少dll文件一键修复的方法,如何快速修复dll文件

如果你遇到了电脑缺少dll文件&#xff0c;那么也不要慌&#xff0c;要解决也是比较简单的&#xff0c;下面我们一起来了解一下电脑缺少dll文件一键修复的方法&#xff0c;教教大家快速修复。 一.什么是dll文件 DLL 文件全称为“Dynamic Link Library”文件&#xff0c;翻译为中…

美国科技行业今年裁员超 5 万人;宁德时代一年净赚超 440 亿丨 RTE 开发者日报 Vol.167

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

Docker部署Django项目——基础

1.服务器配置 1.1centos7 系统的安装 centos-7-isos-x86_64安装包下载) VMware安装自定义配置 选择对应的系统镜像 一般选择内核4核、内存8g、硬盘80g 相关配置 1.2.网络配置 1.2.1查看win电脑虚拟机VMnet8的ip 使用ipconfig查看虚拟机的ip 1.2.2配置虚拟机VMnet8的ip…

膨胀 卷积

1.作用 Dilated convolution、Atrous convolution 增大感受野保持原输入大小 2.膨胀因子 描述的是相邻元素之间的距离 r 2 3.gridding effect 不合理的多个膨胀卷积之前&#xff0c;设计的膨胀因子不合理导致&#xff0c;在增大感受野的同时丢失了细节信息。 丢失&…

计算机组成原理-1-计算系统概论

1. 计算系统概论 文章目录 1. 计算系统概论1.0 课程概貌1.1 计算机系统简介1.2 计算机的硬件框图1.3 计算机的工作步骤1.4 计算机硬件的主要技术指标 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理&#xff08;上&#xff09;_哈尔滨工业大学》、《计算机组成原理&#xf…

简历信息泄露?如何用图数据库技术解决简历泄露事件的反欺诈挑战

“金三银四”&#xff0c;又到了春招黄金期&#xff0c;但个人简历泄露的数据安全问题诸见报端&#xff0c;甚至在此前的3.15晚会报道中就揭露过招聘平台上的简历信息被泄露&#xff0c;不法分子通过各种渠道获取到简历&#xff0c;并用于欺诈活动&#xff0c;形成了一套庞大的…

2023年度VSCode主题推荐(个人常用主题存档)

前言 早在2018年的时候发了一篇关于VSCode主题风格推荐——VS Code 主题风格设置&#xff0c;时过境迁&#xff0c;如今常用的主题皮肤早已更替。 今天下午在整理VSCode插件的时候&#xff0c;不小心把常用的那款&#xff08;亮色&#xff09;主题插件给删除了&#xff0c;无…

18 优先级队列

priority_queue介绍 1.优先级队列是一种容器适配器&#xff0c;根据弱排序标准&#xff0c;它的第一个元素总是最大的 2.此上下文类似于堆&#xff0c;堆中可以随时插入元素&#xff0c;检索最大堆元素 3.优先队列实现为容器适配器&#xff0c;容器适配器即将特定容器类封装作…

科普文之五分钟轻松入门Generative AI

1. 引言 最近&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;在行业内带来了巨大的变动。还记得 2022 年 11 月推出的 ChatGPT 吗&#xff1f;在短时间内&#xff0c;它就成为了有史以来用户数量最快突破 1 亿的产品。 人工智能已经存在了很长一段时间&…

二叉树算法

递归序 每个节点都能回到3次! 相当于2执行完然后返回了代码会往下走,来到3节点 小总结: 也就是4节点先来到自己一次,不会执行if,先调用自己左边的那个函数,但是是null,直接返回。 这个函数执行完了,就会回到自己,调用自己右边的那个函数,结果又是空,又返回,回到…

Hive SQL必刷练习题:连续问题 间断连续(*****)

问题描述&#xff1a; 1&#xff09; 连续问题&#xff1a;找出连续三天&#xff08;或者连续几天的啥啥啥&#xff09;。 2&#xff09; 间断连续&#xff1a;统计各用户连续登录最长天数&#xff0c;间断一天也算连续&#xff0c;比如1、3、4、6也算登陆了6天 问题分析&am…

Kotlin进阶之协程从上车到起飞

公众号「稀有猿诉」 原文链接 Kotlin进阶之协程从上车到起飞 通过前面的一篇文章我们理解了协程的基本概念&#xff0c;学会协程的基本使用方法&#xff0c;算是正式入门了&#xff0c;接下来就是要深入的学习技术细节和高级使用方法&#xff0c;以期完全掌握Kotlin协程…