深入了解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 关联的直接内存。

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

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

相关文章

openwrt下部署clouddrive2

在启动项上增加启动参数 在exit 0前面增加 mount --make-shared /mnt/data480g注意,后面的/mnt/data480g要替换成你设置的共享映射券。 拉取镜像 docker pull cloudnas/clouddrive2启动镜像 一定要用ssh在后台用docker run命令启动,因为openwrt前台…

函数-Python

师从黑马程序员 函数初体验 str1"asdf" str2"qewrew" str3"rtyuio" def my_len(data):count0for i in data:count1print(f"字符串{data}的长度是{count}")my_len(str1) my_len(str2) my_len(str3) 函数的定义 函数的调用 函数名&a…

基于Java的大学计算机课程管理平台(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

面试笔记——Redis(缓存击穿、缓存雪崩)

缓存击穿 缓存击穿(Cache Breakdown): 当某个缓存键的缓存失效时(如,过期时间),同时有大量的请求到达,并且这些请求都需要获取相同的数据,这些请求会同时绕过缓存系统&a…

【GameFramework框架内置模块】8、文件系统(File System)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q7…

登录-前端部分

登录表单和注册表单在同一个页面中,通过注册按钮以及返回按钮来控制要显示哪个表单 一、数据绑定和校验 (1)绑定数据,复用注册表单的数据模型: //控制注册与登录表单的显示, 默认false显示登录 true时显…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明: field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

java方法的引用传递和值传递

1、方法的值参数传递 下面代码,它会在控制台输出什么? public class ArrayTest {public static void main(String[] args) {int number 100;System.out.println(number);change(number);System.out.println(number);}public static void change(int n…

vue3使用qrcodejs2-fix生成背景透明的二维码

qrcodejs官方仓库:GitHub - davidshimjs/qrcodejs: Cross-browser QRCode generator for javascript qrcodejs2-fix 是一个用于生成QR码的JavaScript库,使用的时候先安装,然后通过设置前景色和背景色可以控制显示的二维码效果。想生成透明背…

手撕算法-二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数 0≤_n_≤1000 , 二叉树每个节点的值 0≤_val_≤1000要求: 空间复杂度 O(n) 。本题也有原地操作,即空间复杂度 O(1) 的解法&#xff0c…

士兵排列问题

解法一&#xff1a; deque实现队头入队和队尾入队即可得到编号排列&#xff0c;每个士兵有二个属性&#xff1a;编号、能力值。 #include<iostream> #include<algorithm> #include<deque> #include<vector> using namespace std; #define endl \n st…

汇率与政治的关系?Anzo Capital实例举证

投资者在使用特定货币对交易时&#xff0c;交易者应关注交易所用货币国家的主要政治新闻。众所周知&#xff0c;政治和金融密切相关&#xff0c;因此重要政治消息的发布会对汇率产生强烈影响。 Anzo Capital实例举证&#xff1a;汇率与政治的关系。 其中一个例子&#xff0c…

文件系统 与 软硬链接

目录 一、文件系统 认识磁盘 磁盘存储的逻辑抽象结构 块组的内容 inode Table Data blocks inode Bitmap Block Bitmap Group Descriptor Table Super Block 理解目录 二、软硬链接 软链接​ 硬链接 硬链接数 一、文件系统 之前的博客主题叫做"进程打开文…

【物联网应用】基于云计算的智能化温室种植一体化平台

目录 第一章 作品概述 1.1. 作品名称 1.2. 应用领域 1.3.主要功能 1.4.创新性说明 第二章 需求分析 2.1 现实背景 2.2 用户群体及系统功能 2.3 竞品分析 第三章 技术方案 3.1. 硬件组成与来源 3.2. 硬件设计合理性 3.3. 硬件系统设计图 3.4. 接口的通用性与可扩展性 3.5. 代码规…

vue中判断是否使用自定义插槽

在封装自定义组件时&#xff0c;需要判断使用者是否使用了插槽<slot"aaa">&#xff0c;如果没有则使用一个组件中默认的值&#xff0c;反之就用传入的内容<template name"aaa"></template>,实现如下&#xff1a; <div class"lin…

苍穹外卖-day06:HttpClient、微信小程序开发、微信登录(业务流程)、导入商品浏览功能代码(业务逻辑)

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 功能实现&#xff1a;微信登录、商品浏览 微信登录效果图&#xff1a; 商品浏览效果图&#xff1a; 1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;…

文件系统I/O FATFS RW 源码分析

文件系统I/O FATFS RW 源码分析 0 参考 FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 整个项目都按照 ANSI C (C89) 编写。与存储器 I/O 解耦良好&#xff0c;便于移植到 8051、PIC、AVR、ARM、Z80、RX 等小型微控制器中。 下面是关于 FAT 文件系统格式…

20.回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;head …

linux 安装常用软件

文件传输工具 sudo yum install –y lrzsz vim编辑器 sudo yum install -y vimDNS 查询 sudo yum install bind-utils用法可以参考文章 《掌握 DNS 查询技巧&#xff0c;dig 命令基本用法》 net-tools包 yum install net-tools -y简单用法&#xff1a; # 查看端口占用情况…

【学习学习】学习金字塔

学习金字塔&#xff08;Cone of Learning&#xff09;&#xff0c;全称学习吸收率金字塔&#xff0c;是一种现代学习方式的理论。网上流传它是美国缅因州的国家训练实验室&#xff08;National Training Laboratories&#xff09;研究成果&#xff0c;用数字形式形象显示了采用…