双非本科准备秋招(9.3)—— JVM2

学这个JVM还是挺抽象的,不理解的东西我尽量记忆了,毕竟刚接触两天,也没遇到过实际应用场景,所以学起来还是挺费劲的,明天再补完垃圾回收这块的知识点。U•ェ•*U

先补一下JVM运行时的栈帧结构。

        线程调用一个方法的执行和退出意味着一个栈帧的入栈和出栈,栈顶的栈帧叫当前栈帧,对应一个线程需要执行的最新的方法。其内部主要包含局部变量表、操作数栈、方法返回地址、动态链接等信息。

局部变量表(Local Variables Table)

        用来存放方法参数和方法内部定义的局部变量。编译期就能确定局部变量表的容量,所以方法运行期间容量大小不会改变

        容量大小以变量槽(Variable Slot)为单位,变量槽可以重用,这个局部变量使用完成了,它占用的内存就可以给别的变量使用了。

        每个变量槽的大小是32位,所以64位的变量会用两个连续的槽,并且JVM不允许以任何方式访问其中的一个。

操作数栈

        主要用于保存计算过程的中间结果,同时作为计算过程中变量的临时存储空间。

方法返回地址

方法正常退出:方法正常执行完成后,会将返回值返回给调用方法

方法异常退出:方法执行时发生了异常并且没有得到妥善处理,也会触发方法退出,并且不会有返回值返回给调用方。

方法正常退出,主调方法PC计数器的值就可以作为返回地址。方法的退出,就是栈帧出栈的过程。

动态链接

java源文件编译为字节码文件的过程中,所有的变量和方法会作为符号引用,保存在Class文件的常量池中。

当一个方法调用另一个方法时,就是通过常量池中指向方法的符号引用表示的。

动态链接就是能将符号引用转换成调用方法的直接引用

比如我在main里写一个method_one()方法,编译过程中首先在常量池(Constant pool)创建该方法的符号引用,然后会执行invokestatic #2指令,这个指令就是通过常量池中的符号引用#2表示的,在运行时,动态链接会根据这个符号引用真正地调用这个方法。

垃圾回收Part1

四大引用

图解

先把黑马的图粘贴过来,众所周知四大天王有五位,四大引用有五个也是正常的。

HotSpot通过直接引用来访问java对象,根据引用强弱分为四种,强软弱虚。Strong、soft、weak、Phantom。

强引用

对象的一般状态都是强引用。

一个对象有强引用,GC绝不会回收。

public class test {
    public static void main(String[] args) {
        String s = "sm";
        HashMap map = new HashMap();
    }
}

软引用

用于对象缓存,如果一个对象只有软引用,那么当内存不足,抛出OOM之前会回收软引用对象。

用法示例:

public class GCAnalization {
    private static final int _8MB = 8 * 1024 * 1024;
    private static final int _4MB = 4*1024*1024;
    public static void main(String[] args) {
        ArrayList<SoftReference<byte[]>> list1 = new ArrayList<>();
        for(int i = 0; i < 10; i++){
            list1.add(new SoftReference<>(new byte[_4MB]));
        }
        for(int i = 0; i < 10; i++){
            System.out.println(list1.get(i));
        }
    }
}

弱引用

用于对象缓存,弱引用更低级,只要发生GC,弱引用就会被回收。

虚引用

好像没啥用,为对象设置一个虚引用,该对象被回收时能收到系统通知,必须与引用队列关联使用。

判断对象是否能回收的算法

引用计数法

当对象被引用一次,加1,不被引用,减1。

但是可能出现循环引用,这时就会发生内存泄露。

可达性分析

通过一系列GC Root(根对象节点)对象作为起点,根据引用关系,向下搜索,能找到的对象就是可达的,表示不可回收。

什么对象能作为GC Root?

比如: 

1、虚拟机栈中引用的对象

2、方法区中类静态属性引用的对象

3、本地方法栈的Native对象

等等。

垃圾回收算法

标记清除

找出所有存活的对象,对存活的对象进行标记,清除未被标记的对象。

速度快,但会产生内存碎片。

标记整理

找出所有对象,对存活的对象进行标记,将存活对象整理到一端(紧凑),然后清除未被标记的对象。

没有内存碎片,速度慢

复制

划分两个大小相同的区域,每次只用一块,这块用完了,就把存活的对象复制到另一块,然后清理内存空间。这样交替使用两块内存。

没有内存碎片,占用空间大。

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

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

相关文章

【并发编程】volatile原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程⛺️稳重求进&#xff0c;晒太阳 volatile原理实现是内存屏障&#xff0c;Memory Barrier 对volatile变量的写指令后会加入写屏障。对volatile变量的读指令前会加入读屏障 如何保…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程&#xff08;源码解读&#xff09; BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor&#xff1a; From java doc&#xff1a; BeanFactoryPostProcessor may interact with and modify bean defin…

网工内推 | 申通快递急招网安、测试工程师,包食宿,30k*13薪

01 申通快递 招聘岗位&#xff1a;信息安全工程师 职责描述&#xff1a; 1、 负责集团数据安全风险的识别、协同、跟踪、改进优化及事后评估&#xff1b; 2、 负责集团数据安全专项风险的治理及系统上线前的数据安全评审&#xff1b; 3、 负责集团信息安全、合规等方面制度的编…

限时回归!!!3D版《空洞骑士》!!!

空洞骑士是一款基于横板平台跳跃的传统风格2D动作冒险游戏。庞大的游戏世界交错相通&#xff0c;玩家控制小虫子去探索幽深黑暗的洞穴&#xff0c;成为了一代人茶余饭后的惦念&#xff0c;深受广大玩家们的喜爱。 这类平台跳跃游戏一般是游戏开发初学者以及独立游戏开发者们比…

React一学就会(7): 细说redux及其应用

不知不觉一个星期结束了&#xff0c;很快就要过年了&#xff0c;中间休息了两天&#xff0c;小孩生病&#xff0c;我也有点感冒了&#xff0c;还好&#xff0c;我的这个 React 基础教学课程也基本结束了。大家有不明白的可以留言问我&#xff0c;我一定竭尽所能的帮助你。后面几…

D3703F——应用于音响系统的静音检测电路 当音响系统在放音或快进 / 退时进行静音检测,输出控制信号。

D3703F 是 一 块 汽 车 音 响 静 音 检 测 电 路 。 用 于 音 响 系 统 检 测 在 放 音 或 快 进 / 退 时 进 行 静 音 检 测 。 D3703F 的 的 电 压 范 围 &#xff1a; 3.2V &#xff5e; 16V &#xff0c; 信 号 检 测 和 静 音 时 间 可 通 过 外 围 电 阻 、 电 容 来 …

中小型企业知识库建设的秘诀来啦,赶紧收藏起来

知识库是企业的智慧宝库&#xff0c;其中的信息和知识的整合&#xff0c;可以极大地提高工作效率和团队协作能力。尤其对中小企业来说&#xff0c;知识库的建设更是关系企业未来发展的重要因素。那么&#xff0c;怎样有效地构建高效的知识库系统呢&#xff1f;下面这些秘诀值得…

Arthas的使用

1. 简介 官网 线上debug神器&#xff0c;就不过多介绍 2. 环境搭建 win11环境 ,jdk11 2.1 安装 下载地址 2.2 启动 cmd java -jar arthas-boot.jar启动之后会自动检测启动的java服务 1~4 &#xff0c;springboot是启动类名&#xff0c;所以我选择了3 3. 常用操作 3.…

Hadoop3.x基础(1)

来源&#xff1a;B站尚硅谷 这里写目录标题 大数据概论大数据概念大数据特点(4V)大数据应用场景 Hadoop概述Hadoop是什么Hadoop发展历史&#xff08;了解&#xff09;Hadoop三大发行版本&#xff08;了解&#xff09;Hadoop优势&#xff08;4高&#xff09;Hadoop组成&#xf…

非阿里云注册域名如何在云解析DNS设置解析?

概述 非阿里云注册域名使用云解析DNS&#xff0c;按照如下步骤&#xff1a; 添加域名。 添加解析记录。 修改DNS服务器。 DNS服务器变更全球同步&#xff0c;等待48小时。 添加解析记录 登录云解析DNS产品控制台。 在 域名解析 页面中&#xff0c;单击 添加域名 。 在 …

SkyWalking+es部署与使用

第一步下载skywalking :http://skywalking.apache.org/downloads/ 第二步下载es:https://www.elastic.co/cn/downloads/elasticsearch 注&#xff1a;skywalking 和es要版本对应&#xff0c;可从下面连接查看版本对应关系&#xff0c;8.5.0为skywalking 版本号 Index of /di…

实惨!多本EI接连被各大数据库剔除!2024年EI期刊目录首次更新-附下载

EI目录更新 本月爱思唯尔&#xff08;Elsevier&#xff09;官网更新了EI Compendex收录期刊目录&#xff0c;这是2024年第一次更新。 Elsevier发布2024年第一版EI期刊目录 更新时间&#xff1a;2024年1月1日 不同于SCI/SSCI目录每月更新一次的频率&#xff0c;EI目录更新没有…

VBA技术资料MF112:列出目录中的所有文件和文件夹

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

构建高效外卖系统:利用Spring Boot框架实现

在当今快节奏的生活中&#xff0c;外卖系统已经成为人们生活中不可或缺的一部分。为了构建一个高效、可靠的外卖系统&#xff0c;我们可以利用Spring Boot框架来实现。本文将介绍如何利用Spring Boot框架构建一个简单但功能完善的外卖系统&#xff0c;并提供相关的技术代码示例…

解析线上HBase集群CPU飙高的原因与解决方案

在日常的运维工作中&#xff0c;CPU负载高是一种常见的故障状况&#xff0c;它可能对系统的正常运行和性能产生不利影响。为了准确地定位具体的异常原因&#xff0c;掌握一些专业的工具和方法是至关重要的。本文将通过一个实际的案例&#xff0c;详细介绍如何排查在线上HBASE集…

【C++】C++入门基础讲解(二)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读 接着上一篇的内容继续学习&#xff0c;今天我们需要重点学习引用。 1. 引用 在C中&#xff0c;引用是一种特殊的变量&#xff…

动态gif图如何在线做?这一招分分钟生成

Gif动图是怎么制作呢&#xff1f;Gif动画已经是日常聊天娱乐必备的了&#xff0c;那么这种有趣的gif表情要怎么操作呢&#xff1f;很简单&#xff0c;使用gif动图生成&#xff08;https://www.gif.cn/&#xff09;工具无需下载软件&#xff0c;小白也能轻松操作。可上传MP4格式…

Vue2 VS Vue3 生命周期

一、生命周期的概念 Vue组件实例在创建时要经历一系列的初始化步骤&#xff0c;在此过程中Vue会在合适的时机&#xff0c;调用特定的函数&#xff0c;从而让开发者有机会在特定阶段运行自己的代码&#xff0c;这些特定的函数统称为&#xff1a;生命周期钩子&#xff08;也会叫…

每日一道面试题:Java中序列化与反序列化

写在开头 哈喽大家好&#xff0c;在高铁上码字的感觉是真不爽啊&#xff0c;小桌板又拥挤&#xff0c;旁边的小朋友也比较的吵闹&#xff0c;影响思绪&#xff0c;但这丝毫不影响咱学习的劲头&#xff01;哈哈哈&#xff0c;在这喧哗的车厢中&#xff0c;思考着这样的一个问题…

对Spring当中AOP的理解

AOP(面向切面编程)全称Aspect Oriented Programminge AOP就是把系统中重复的代码抽取出来&#xff0c;单独开发&#xff0c;在系统需要时&#xff0c;使用动态代理技术&#xff0c;在不修改源码的基础上&#xff0c;将单独开发的功能通知织入(应用)到系统中的过程&#xff0c;完…