学习笔记3——JVM基础知识

news2024/11/19 15:17:28

学习笔记系列开头惯例发布一些寻亲消息

链接:https://baobeihuijia.com/bbhj/contents/3/196593.html
在这里插入图片描述

JVM(Write Once,Run Anywhere)

  • 以下是一些学习时有用到的资料,只学习了JVM的基础知识,对JVM整体进行了解

(5 封私信 / 80 条消息) Java JVM怎么学习啊?从哪方面入手? - 知乎
(zhihu.com)

JVM入门教程开篇:为什么要学虚拟机? - 陈树义 - 博客园
(cnblogs.com)

【精选】Java | JVM | 详细图解,坚持看完,带你真正搞懂Java虚拟机_java jvm
图-CSDN博客

抽象语法树AST的全面解析(一)_语法树解析_嘿嘿帆的博客-CSDN博客

可移植性的两个层次

  • 源代码级可移植性和二进制代码的可移植。 大部分的语言都支持源代码级的可移植性(编译器是平台有关的) JAVA语言不仅支持源码可移植性,其源代码编译之后生成的字节码同样具有可移植性。【理解:系统能够识别是编译后形成的二进制文件,操作系统有一套对应的机制能够识别出来,比如对应于0011,win操作系统认为是+,但是放到linux下可能就认为是非法操作,所以需要“编译”+“识别”要成对,而对于java代码,我们的编译和识别是不需要成对的,因为java不直接生成给系统看的二进制代码,而是先生成字节码再通过jvm匹配不同的系统。】

java到机器码流程

  • java并不是一上来直接把代码编译为系统识别的机器码,而是编译为一种特定的语言规范——字节码,java虚拟机解析字节码内容,将其翻译为操作系统能理解的机器码
    • javac: 将源代码翻译为字节码**(前端编译器)**——>16 进制数据流 / javap可以反编译
      • 将源码的字符流转化为token流,构建抽象语法树(AST)
      • 将定义的符号信息输入到符号表(符号地址和符号信息)
      • 注解处理:对生成的语法树进行增删改查,还是要进行token生成和符号表新增,重复直到新增注解后语法树没有修改
      • 语法分析
        • 语义分析:使用前是否声明/路径的返回值/受查异常被正确处理
        • 解语法糖:自动拆箱-还原简单的数据结构
      • 生成字节码(将语法树和符号表转为字节码.class)
    • 字节码到机器码(java解释器和JIT编译混用)
      • java解释器:直接执行字节码,调用系统(启动快但是过程慢)
      • JIT编译器:将字节码转化为本地机器码(启动慢过程很快)
        • c1编译模式:进行简单、可靠的优化,如有必要将加入性能监控的逻辑
        • c2编译模式:会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。
    • AOT编译器:是一种由源代码直接到机器码的方法,但是对于java 的动态特性并不友好,所以是一种牺牲质量换取性能的策略,如动态类加载无法实现

对字节码进行深入理解

  • 源代码
    在这里插入图片描述

  • 常量池

在这里插入图片描述

  • 类索引:地址指向了常量池中的Demo类

  • 父类索引:地址指向常量池的object类

  • 接口索引:接口计数器+接口信息

  • 字段表集合:类级变量、实例级变量(不包括类中的局部变量)/ 同样是字段计数器+属性数据

  • 方法表索引:方法计数器+方法表

    • public访问修饰符 + 方法名的索引,指向了常量池的 + 属性表计数器+属性表
      • 属性表名code+属性长度+操作数栈深度的最大值+为局部变量分配的存储空间+字节码指令(通过查询字节码指令表可以知道,类似于汇编)+异常表长度+又来一个属性表放的是line_number_info表,其中包含了start_pc(字节码行号)+ line_number(java源码的行号)
  • 属性表(是类层次的属性,其中包含了该字节码文件的源文件即demo.java)

运行时数据区(java虚拟机的内存)【java类加载到java内存中,类信息存在方法区,创建对象存在堆中,调用方法就开启线程】

  • 公有(所有线程共享)

    • java堆
      • 存储java实例对象的内存分配
    • 方法区
      • 存储java类字节码数据,存储每一个类的结构信息如运行时常量池、字段和方法数据
      • 常量池也在里边
  • 私有(线程私有)

    • PC寄存器:线程正在执行的字节码指令地址
    • java虚拟机栈:存储局部变量,操作数栈
    • 本地方法栈:。。。

类加载机制(即字节码如何翻译)【遇到static单独开出去内存,不会每次new 对象都新开内存】有几个例子要多看

  • 加载:将字节码加载到内存,在方法区创建对应的class对象

  • 校验:对字节码文件继续校验,是否规范

  • 为类变量(static修饰的变量)分配内存,并按照

    • 变量的话:java语言的数据零值来赋值【注意不是代码里边的值】
    • 常量final的话:直接就是用户代码给出的值
  • 解析:将常量池中的符号引用替换为直接的内存地址

  • 初始化:new/读取或者设置一个类的static(被final修饰、或者在编译器把结果放入常量池的静态字段除外)/调用一个类的静态方法

在这里插入图片描述

  • 从入口程序开始执行

  • 执行结束后,jvm销毁创建的class对象,最后JVM也退出内存

重点,先类初始化,结束后就对象初始化,如果没有实例化,只是因为main入口或者用了其中的static或者因为子类初始化的时候父类还没有初始化,那么只会类初始化不会对象初始化,understand!!!类初始化只有一次

  • 类初始化的细节(jvm看到方法区的字节码其实分不清构造函数啥的)【是先类初始化后对象初始化】
    • 类初始化:类变量的赋值语句、静态代码块的执行
    • 对象初始化(实例化之后才会执行):赋值语句,普通代码块,最后才是构造函数代码【按照我们平时构造函数中可以调用对象字段就可以推测出来】

垃圾回收机制

  • 判断垃圾:GC Root Tracing 算法:从 GC Root 出发,所有可达的对象都是存活的对象,而所有不可达的对象都是垃圾。为什么不使用引用计数:是因为引用计数会存在循环引用的问题

  • 三种垃圾回收机制

    • 标记清除

    • 复制算法

    • 标记压缩

  • 堆区的回收总的来说分为年轻代和老年代 1:3

    • 【年轻:存活率低,复制算法;老年:存活率高,标记-压缩方法】

      • 年轻代用复制:年轻代分为Eden(伊甸园),From Survivor 0(幸存0区),To Survivor 1(幸存1区)
      • 分区比例8:1:1,这么分区是因为ibm公司统计98%对象都是短期的,不必单独浪费一半的空间来存储,只需要用10%即可保留下当前年轻代中的精华对象

      • 老年代用标记-压缩方法

    • 扫描的时候,如果没有引用且计数为0就直接回收,如果+1后够年龄就放入老年

    • 一进来就进新生代Eden,Eden一满就会触发GC进行垃圾回收,新生代会频繁存入新的对象,所以触发很频繁

    • Survivor 0:上一代GC的时候保留下来的数据,但是还不够进入老年,和Eden作为本次的扫描区域

    • Survivor 0:我感觉像个temp,耶斯就是一个temp,理解的很棒~!

    • 如果前边几次扫描发现某个对象都在,够一定年龄,就放到老年代,减少GC重复的判断

  • 四大垃圾回收器

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 一些术语

    • Minor GC:从年轻代回收内存叫做minor GC, Eden满了就会触发
    • Major GC: 如果老年代的空间也不够了,就会触发,也可以认为major GC是由minor GC引起的
    • Full GC:年轻代预感到有大量对象即将进入老年代,于是发起full gc将年轻和老年都整理
    • stop the world

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

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

相关文章

Nginx 部署多个安全域名,多个服务【工作记录】

以下是本人通过Docker 部署的Nginx挂载出来的文件目录 先看下 nginx.conf 配置文件内容:如下 ps:当前文件就是安装后的初始内容,无修改。主要关注最后一行 include /etc/nginx/conf.d/*.conf;表示引入其他目录下的.conf配置文件;…

构建 hive 时间维表

众所周知 hive 的时间处理异常繁琐且在一些涉及日期的统计场景中会写较长的 sql,例如:周累计、周环比等;本文将使用维表的形式降低时间处理的复杂度,提前计算好标准时间字符串未来可能需要转换的形式。 一、表设计 结合业务场景常…

MySQL(5):排序与分页

排序数据 排序规则 使用 ORDER BY 子句排序 ASC(ascend):升序 DESC(descend):降序 ORDER BY 子句在SELECT语句的结尾 单列排序 SELECT last_name,job_id,department_id,hire_date FROM employees ORDER…

设计师看后惊叹:当泥色走进室内空间的时候竟有此番效果

在美国的洛杉矶,一座引人注目的度假别墅彰显了自己的独特魅力。建筑师 Ron Radziner 说:“这是一座现代住宅,采用风化木、深色灰泥和绿色屋顶等与峡谷环境相关的材料,设计得通透、开放。” Zwickl 解释说:"他们想…

CCF CSP认证 历年真题自练Day42

题目 试题编号: 201512-3 试题名称: 画图 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图…

正点原子嵌入式linux驱动开发——Linux CAN驱动

CAN是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过CAN总线连接起来的。CAN总线目前是自动化领域发展的热点技术之一,由于其高可靠性,CAN总线目前广…

axios中get/post请求方式

1. 前言 最近突然发现post请求可以使用params方式传值,然后想总结一下其中的用法。 2.1 分类 get请求中没有data传值方式 经过查阅资料,get请求是可以通过body传输数据的,但是许多工具类并不支持此功能。 在postman中,选择get请求…

WebService接口方式和Restful接口这两者有什么区别和相同点

WebService和RESTful接口都是用于在网络上进行通信和数据交换的技术,但它们在设计和使用上有一些重要的区别和相似之处。 相同点: 基于HTTP协议:无论是WebService还是RESTful接口,它们都是通过HTTP协议进行通信的。 支持多种数据…

高防服务器与CDN防御怎么区分?

​  高防服务器和CDN防御是两种不同的网络安全防护方式。 定义上:高防服务器是指在传统服务器的基础上,增加了一系列的防御措施,如DDoS防护、WAF防护、IP黑白名单等,以提高服务器的抗攻击能力。高防服务器通常具有较强的计算和存…

知识图谱实战应用30-知识图谱在反欺诈情报分析项目中的应用实践

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用30-知识图谱在反欺诈情报分析项目中的应用实践,现代商业环境中,各类欺诈行为日益猖獗,严重影响企业的运营和社会秩序。传统的欺诈检测方法难以满足实时性和有效性方面的要求。本文介绍了采用知识图谱技术构建反欺诈情报…

纳米银簇 银纳米团簇

纳米银簇 名称:纳米银簇 西)用途:科研 安)描述:银纳米团簇是由数十个银原子组成的超小尺寸簇集体。银纳米团簇具有很高的表面积和独特的光学、电学、催化等性质,因此在生物学、光电子学、催化化学等领域具…

idea自动编译以及修改代码后需要执行 mvn clean install 才生效

idea自动编译以及修改代码后需要执行 mvn clean install 才生效 一. idea热部署一、开启IDEA的自动编译(静态)二、开启IDEA的自动编译(动态)三、开启IDEA的热部署策略(非常重要) 二. IDEA 中项目代码修改后…

笔记软件推荐!亲测好用的8款笔记软件!

​在以往的生活中,我们都需要用纸和笔做笔记,但随着时代的发展,许多人已经不再选择用这种传统方式,来记录自己重要的笔记了,他们都选择将重要的笔记用软件记录下来,将笔记保存在电脑里,更不容易…

一篇文章让你弄懂Java中的方法

目录 1. 方法概念及使用 1.1 什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 1.5 没有返回值的方法 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 2.3 方法签名 1. 方法概念及使用 1.1 什么是方法(method) 方法就是一…

Web3公链之Cosmos生态的项目Celestia

文章目录 Web3公链之Cosmos生态的项目:模块化区块链Celestia什么是CelestiaCelestia网络架构数据可用性问题有哪些可用的解决方案? 发展历史运行节点参考 Web3公链之Cosmos生态的项目:模块化区块链Celestia 什么是Celestia 官网&#xff1a…

SpringMVC Day 08 : 文件上传下载

前言 文件上传和下载是 Web 开发中的重要环节,但它们往往不那么容易实现。幸运的是,Spring MVC 提供了一套简单而又强大的解决方案,让我们可以专注于业务逻辑,而不必过多关注底层的文件处理细节。 在本篇博客中,我们…

32、github的使用小技巧

如何在github中阅读项目代码 如果要完整阅读项目代码, 可能要在文件间来回跳转,就非常麻烦。所以我们往往会把项目代码下载到本地,用更强大的编辑器来阅读。 在github中,可以这样操作: 登录 GitHub 后,直…

Android手机实时投屏利器scrcpy图文详解教程

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl scrcpy简介 scrcpy是免费开源的投屏软件,它支持将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可直接借助鼠标在投屏窗口中进行交互和录制。…

QCustomPlot图像刷新原理

借用官方的这张图分析。 主要关注QCPLayer 和QCPLayout,几乎所有的元素都是放置同一张布局中的,布局是核心要素,不同的元素可能不在同一张layer ,即不在同一层,不在同一层的元素的区别就是上层的元素会挡住下层的元素&#xff0c…

Xposed hook 抖音首页标签隐藏

Xposed hook 抖音首页标签隐藏 本篇文章主要使用xposed hook arraylist,来实现 抖音首页部分标签条目隐藏。 直接上代码: //隐藏首页tab XposedHelpers.findAndHookMethod(ArrayList.class, "add", Object.class, new XC_MethodHook() {Overrideprotect…