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

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

链接: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

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

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

相关文章

python爬虫—使用xpath方法进行数据解析

1. 背景信息 爬取安居客二手房源信息 URL地址:https://wuhan.anjuke.com/sale/?fromnavigation 2. 代码实现 import requests from lxml import etreeif __name__ __main__:# 1.指定URLurl "https://wuhan.anjuke.com/sale/?fromnavigation"# 2.U…

Apache Doris (四十八): Doris表结构变更-替换表

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

在Jetpack Compose中使用Paging 3实现无限滚动

在Jetpack Compose中使用Paging 3实现无限滚动 本文将介绍在Jetpack Compose中进行分页加载。分页加载意味着一次只加载应用程序中的小数据块。 假设您在服务器上有大量数据,并且您希望在UI上显示这些数据。显然,您不希望一次性加载所有数据。您希望每次…

reactor (百万并发服务器) -- 1

为了从点滴开始,文章会先从一些基础socket去补充一些经常发生但是没有很深入去思考的细节。然后我们再开始去设计reactor的设计,可以选择跳过起过前面部分。 为了能从0开始去设计,测试,优化...整个过程会分为2-3篇文章输出&#x…

Redis队列Stream

1 缘起 项目中处理文件的场景: 将文件处理请求放入队列, 一方面,缓解服务器文件处理压力; 另一方面,可以根据文件大小拆分到不同的队列,提高文件处理效率。 这是Java开发组Leader佳汇提出的文件处理方案&a…

网络安全—小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

QT实现用本地资源管理器来打开文件夹

QString path"文件夹路径";QDesktopServices::openUrl(QUrl("file:"path, QUrl::TolerantMode)); 在windows中QT编程,使用资源管理器来打开指定本地文件夹的方法: 第一种:使用Qprocess命令(相当于在cmd命令管…

测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)

参考文献1除了介绍Aplayer组件的用法之外,还提供有demo下载以供学习,本文学习并记录其中的使用方式。   VideoPlayer项目使用C#在VS2013开发,其解决方案中包括VideoPlayer和VideoPlayer两个小项目,前者基于.net framework4.0&am…

【数据分析】上市公司半年报数据分析

前言 前文介绍过使用网络技术获取上市公司半年报数据的方法,本文将对获取到的数据进行简要的数据分析。 获取数据的代码介绍在下面的两篇文章中 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 【java爬虫】公司半年报数据展示-CSDN博客 全量数…

C#开发DLL,CAPL调用(CAPL>> .NET DLL)

文章目录 展示说明新建类库工程C# 代码生成dllCAPL脚本调用dll,输出结果展示 ret为dll里函数返回的值。 说明 新建类库工程 在visual studio中建立。 C# 代码 using

Python构造代理IP池提高访问量

目录 前言 一、代理IP是什么 二、代理IP池是什么 三、如何构建代理 IP 池 1. 从网上获取代理 IP 地址 2. 对 IP 地址进行筛选 3. 使用筛选出来的 IP 地址进行数据的爬取 四、总结 前言 爬虫程序是批量获取互联网上的信息的重要工具,在访问目标网站时需要频…

启动Vue项目报错Error: error:0308010C:digital envelope routines::unsupported

问题描述 启动Vue项目报错Error: error:0308010C:digital envelope routines::unsupported 出现这个一般就是node版本的问题,通过命令查看node -v查看node版本; 百度查了好多,都让我降低node版本,属实太麻烦了 在不改node版本的…

[论文笔记]BGE

引言 今天介绍论文BGE,是智源开源的语义向量模型,BAAI General Embedding。 作者发布了C-Pack,一套显著推进中文嵌入领域的资源包。包括三个重要资源: 1) C-MTEB是一个全面的中文文本嵌入基准,涵盖了6个任务和35个数据集。 2) C-MTP是一个从标记和未标记的中文语料库中选…

均值、方差、标准差

1 中间值和均值 表现"中间值"的统计名词: a.均值:   mean,数列的算术平均值,反应了数列的集中趋势,等于有效数值的合除以有效数值的个数.b.中位值:  median,等于排序后中间位置的值&#x…

c++11新特性

文章目录 1. C11简介2. 统一的列表初始化2.1 {}初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype3.3 nullptr 4 范围for循环5. STL中一些变化 1. C11简介 2003年,C标准委员会提交了技术勘误表(TC1)&…

Python的错误和异常处理

一、错误和异常 编程中出现的错误大致可以分为两类:错误和异常。 (一)错误 错误又可以分为两类:语法错误和逻辑错误。 1. 语法错误 语法错误又称解析错误,它是指在编写程序时,程序的语法不符合Python语言的规范,导致…

BI零售数据分析,告别拖延症,及时掌握一线信息

在日常的零售数据分析中,经常会因为数据量太大,分析指标太多且计算组合多变而导致数据分析报表难产,零售运营决策被迫拖延症。随着BI数据可视化分析技术的发展,智能化、可视化、自助分析的BI数据分析逐渐成熟,形成一套…

如何使用navicat图形化工具远程连接MariaDB数据库【cpolar内网穿透】

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

Vue项目搭建及使用vue-cli创建项目、创建登录页面、与后台进行交互,以及安装和使用axios、qs和vue-axios

目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css(css.txt) 2.3 配置路由 2.5 运行效果 3. 后台交互 3.1 引入axios 3.2 axios/qs/vue-axios安装与使用 3.2…

Webpack常见的插件和模式

文章目录 一、认识插件Plugin1.认识Plugin 二、CleanWebpackPlugin三、HtmlWebpackPlugin1.生成index.html分析2.自定义HTML模板3.自定义模板数据填充 四、DefinePlugin1.DefinePlugin的介绍2.DefinePlugin的使用 五、Mode配置 一、认识插件Plugin 1.认识Plugin Webpack的另一…