18.JVM

news2024/11/26 0:37:58

目录

1.编写源代码

2.JDK (Java Development Kit)

3.JRE(Java Runtime Environment)  Java运行时环境

4.JVM

1.类名

2.类文件放在哪?

13JVM按需加载类,那么何时加载一个类?

4.类文件是怎么来的?

5.类文件中的主要数据:

6.为什么要进行类的加载?

7.为什么类文件要按需加载,并且以类为单位加载?

8.类在内存中只会存在一份

9.类的加载过程

10.类的初始化会执行我们的哪些代码,顺序是什么?

11.类的数据被加载到内存的啥位置了?

12.默认类的加载器有哪些:

13.加载时,ClassLoader怎么知道一个类对应的类文件所在的位置?

14.如果加载时一个类不存在,会出现异常

5.类加载时常遇到的问题:双亲(parent)委派机制

6.java中的数据类型:

7.JVM的大体启动过程:控制权如何交到我们手中

8.垃圾回收

1.那么那些是GC的重点?

2.那么如何判断哪些对象是垃圾对象(不会再被使用的对象)

9.如何进行垃圾回收(内存空间的回收)


学习JVM主要是学习java程序运行宁阶段是咋工作的,帮助我们更好地写程序。

1.编写源代码

源码数据一定要存储在某个介质上,并且希望是持久化的存储,所以一般般存在硬盘。

抽象成文件形式(一般以*.java结尾,称为java源文件)

程序 = 数据 +指令

 上述阶段,一般称为开发阶段。(需求分析、编码、编译、测试)

下面进入运行时阶段(Runtime Phase)

CPU无法直接和硬盘(IO设备)做直接的数据交换,我们应该怎么做?


2.JDK (Java Development Kit)

用于给Java开发人员使用的小工具箱

里面放了:

提前准备好的程序(*.exe / *>dll): 编译器、调试工具、运行时的分析工具

官方提供的所有人都可以使用的类文件:*.class

3.JRE(Java Runtime Environment)  Java运行时环境

用于给一般用户运行别人写好的Java程序的一组环境

 这些类不够用,锁把一些官方指定了标准,但按照JDK(JRE)不会安装的类称为JavaEE(Enterprise Edition 企业版)

打包时,只给普通用户使用,只打包*.class就够用了,不用打包EE的 *.class

类文件中的数据:类的基本属性、常量池、方法(方法的信息+指令)

ClassLoader要加载一个类,主要就是加载这些数据到内存中


4.JVM

1.类名

1.权威类名:包名+类名称   mxj.demo.mxj

JVM内部:内部加载器+权威类名,确定一个类是否存在

2.默认情况下:  类加载器(ClassLoader)+权威类名

2.类文件放在哪?

硬盘中,以文件的形式出现最为常见

13JVM按需加载类,那么何时加载一个类?

实例化对象、访问静态属性、调用静态方法、子类用到父类

什么叫用到?

使用一个类,进行对象的实例化(构造对象时)

使用一个类时,会触发这个类的父类(“父类”:类的继承、接口的实现、接口的继承)

4.类文件是怎么来的?

经过编译器,将java源文件编译出来

5.类文件中的主要数据:

基本信息(静态属性)、方法(方法信息、指令(字节码))、常量

6.为什么要进行类的加载?

按照冯诺依曼体系,CPU无法直接读取硬盘的数据,需要先加载到内存中

7.为什么类文件要按需加载,并且以类为单位加载?

相对来说,节省内存空间,实现方便

8.类在内存中只会存在一份

9.类的加载过程

加载loading、链接Linking、初始化Initializing

10.类的初始化会执行我们的哪些代码,顺序是什么?

(1)属性的初始化赋值

(2)静态构造代码块

父类的初始化一定在子类之前完成

按照书写顺序

11.类的数据被加载到内存的啥位置了?

逻辑上,房子啊方法区。但不同的JVM实现,可以有进一步讨论空间

12.默认类的加载器有哪些:

不同的类,由不同的类加载

Boostrap ClassLoader(启动类加载器):加载SE下的标准类(java.lang.String、java.util.List、

java.io.InputStream)

Extenttion ClassLoader(扩展类加载器):加载SE下的扩展类(我们一般用不上)

Application ClassLoader(应用类加载器):我们写的类、我们通过maven或者其他工具引入的第三方类

13.加载时,ClassLoader怎么知道一个类对应的类文件所在的位置?

启动、扩展类加载器根据固定位置找。

应用类加载器,根据class path的路径依次查找

14.如果加载时一个类不存在,会出现异常

(ClassNotFound、NoClassF...)


5.类加载时常遇到的问题:双亲(parent)委派机制

默认的三个类加载器之间遵守的一个规范:

1.三个类加载器之间存在

2.ApplicationClassLoader需要类加载的时候,先委派给双亲去加载

如果parent加载成功这个类了,就不用再加载了,否则就自己去加载

3.目的是防止加载进来用户写好的恶意代码

前提知识点:一个类(A)用到其他类(BCD),则其他的这些类(BCD)的加载动作,默认是由当时加载A类的加载器来加载

面试重点:

假设有一个com.mxj.demo.Main用到了java.lang.String类还是java.lang.String?

         

 com.mxj.demo.Main类被哪个类加载器加载?  ApplicationClassLoader去加载

Main用到了java.lang.String  ,默认让  ApplicationClassLoader去加载

如果有双亲委派,ApplicationClassLoader优先让BootStrapClassLoader去加载rt.jar下的。所以,不会加载我们自己写的。


6.java中的数据类型:

1.基本数据类型(Primitive Type):空间保存的是值,访问内存是一次性的

2.引用数据类型(Reference Type):空间中保存的真实对象的线索(地址、其他信息)

                                                         访问内存至少两次

一、Java中的基本类型:

1.数值类型

       (1)整形 byte、char、int、long、

       (2)非整形  float、double

2.布尔类型

二、Java中的引用类型:

类、接口、数组、注解


执行引擎:就是对CPU的模拟,所以CPU的工作与执行引擎相同

1.读取PC中保存的值(一般是地址)

2.根据PC的值,去内存中(方法区),读取一条指令(字节码)

3.执行具体的字节码

4.默认情况下,PC的值自动加一(语句自动执行下一条)


7.JVM的大体启动过程:控制权如何交到我们手中

我们main方法的第一条语句(字节码)是如何被执行起来的

java.exe -classpath指定类的加载路径   启动类名称

java.exe  com.mxj.demo.Main   以这个类的main方法作为程序的启动入口

1.[OS]收集要启动进程的信息,程序是C:/Program Files/Java/jdk/bin/java.exe,参数是com.mxj.demo.Main

2.[OS]根据程序,启动进程,执行java.exe当时写的程序入口(C语言里的main函数)

3.[JVM]读取参数,找OS申请必要的内存(malloc)、创建必要的执行应用类和类加载器

4.[JVM]执行引擎,要求类加载器进行com.mxj.demo.Main类的加载

5.[JVM]创建主线程,把PC的值设成com.mxj.demo.Main类下的static main的第一条指令的地址

6.[JVM]开启执行引擎的指令执行循环,执行第一条语句

7.[Java App]开始我们代码的执行

8. .....直到所有前台线程

9.[JVM]进行必要资源的回收

10.[JVM]进程退出


8.垃圾回收

有了GC(垃圾回收)之后,让开发人员只需要考虑什么时候需要一块内存,而不需要考虑什么内存不再被需要了。

逻辑上,把内存的使用权和所有权分离了,我们只享受一段内存的使用权,没有所有权。

好处:不需要考虑内存的释放问题

坏处:内存彻底和我们无缘

1.那么那些是GC的重点?

1.PC区域:一个PC和一个线程关联,只要线程活着,PC就一定需要

分配时机:创建一个新线程

回收时机:这个PC对应线程的最后一条指令执行结束之后

分配和回收的时机非常简单,不需要GC做过多的参与

2.栈区域:每个线程都有自己的栈,创建线程时为其分配栈空间。线程执行结束后回收栈空间

栈上栈帧的分配:当执行一个方法的调用时

回收栈帧:当该方法return时

分配和回收的时机非常简单,不需要GC做过多的参与

3.方法区(包含运行常量池)

分配:类的加载

回收:类的卸载

不需要GC做过多的参与

4.堆区(以对象为基本单位)

分配:实例化一个对象     时机非常明确:new 语句出现的时候

回收:该对象一定没有在被使用的时候

一个对象没有被使用,但是还没被回收。        可以接受,一部分内存被浪费了。

一个对象还在使用,但被回收了。                   不可接受,造成野指针(访问了错误的空间)


2.那么如何判断哪些对象是垃圾对象(不会再被使用的对象)

1.引用指针法

 object.ref_count 何时增加,何时减少,关键就看引用的生命周期。

增加:每多一个引用指向该对象(进行了引用赋值),就要增加

减少:引用出现的位置

(1)栈帧中(局部变量),方法执行结束,引用声明周期消亡,ref_count--;

(2)出现在类中(静态属性),类被卸载时,引用生命周期消亡

(3)对象的死亡引起的连锁反应

          对象死亡,对象中的引用失效,导致该引用指向的对象的ref_Count--,可能引起其他对象继续死亡。

(4)引用还在,但指向其他对象了

9.如何进行垃圾回收(内存空间的回收)

对象的生命:每经历一次GC,对象的年龄+1

大部分情况下,只会进行新生带的GC。随着新生代GC的进行,会有越来越多的对象进入老年代。

由于老年代的GC成本较大,所以一般会尽量减少老年代GC

随着老年代GC对象越来越多,达到某个阈值,就会进行老年代GC

大部分情况下,老年代GC总是由于某次新生代GC引起的。所以,新生带GC发生时,一般也代表了整个GC。

如果对象本身很大,复制起来成本很高,一般直接进入老年代。

为啥15岁成年:

Hostpot内部实现对象时,用了4个bit来记录年龄,年龄就是0-15

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

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

相关文章

WebRTC学习笔记五 SDP(Session Description Protocol)

SDP里面内容虽然很多,但是条理很清楚。SDP值为字符串,通过换行符生成一行一行的SDP报文,所有行可分为三类:全局行、音频行、视频行 v - Version,版本,版本,应等于0 o - Origin,源&a…

Github优秀项目-使用Python基于GPT2文本自动生成

基于 GPT2-Chinese 模型的中文文本生成项目,可用于中文生成任务。 当下市面上很多文本自动生成业务都是基于该模型二次开发的,可以很少有那种特定垂直领域的模型用于该领域的创作,也就导致大家在使用类似产品的时候会发现很多的问题,这种问题多数会导致写出来的文章前后逻…

工业大数据收集及预测建模方法(南京大学-宋哲博士分享)- 个人总结

获取工业大数据途径 Retrospective Study(回溯性研究):完全依赖于现有的历史数据,去数据挖掘、学习和建模;Observational Study(观察性研究):在一段时间内观察要研究的工业过程,微调相关的控制参数,看系统…

闲人闲谈PS之三十五——物资备货与提前采购

惯例闲话:又一年快过去了,回想刚刚开始在CSDN上写笔记,还是2年前的事情。闲人其实是一个拖延症十分严重的人,自从开始走上写作这条路之后,治疗拖延症找到了办法,每天总有一些事情让闲人去思考,然…

Banana Pi开源社区开源硬件瑞芯微RK3568/RK3588全国产化支持计划

随着国产芯片的崛起与电子供应链的国产化率越来越高,全国产替换从技术上成为了可能。加上近几年地缘政治的影响,全国产替换的呼声越来越高,已经提升到了国家战略层面。国产替换成为了一股技术前进的力量。 Banana Pi开源社区,全力…

操作系统_多线程笔记(二)

文章目录1.线程状态2.多线程在的意义是什么?1.线程状态 状态是针对当前线程调度的情况来描述的,因为线程是系统调度的基本单位,所以状态是属于线程的属性 线程的六种状态: 注意: 1.一旦内核里的PCB消亡了,此时代码中创建的thread也就没有用了,即内核里的线程释放的时候无…

终于有阿里p9架构师分享出困扰我多年的分布式系统开发实战文档

前言 都说程序员工资高、待遇好, 2022 金九银十到了,你的小目标是 30K、40K,还是 16薪的 20K?作为一名 Java 开发工程师,当能力可以满足公司业务需求时,拿到超预期的 Offer 并不算难。然而,提升…

ANR 触发、监控、分析 一网打尽

平时看博客或者学知识,学到的东西比较零散,没有独立的知识模块概念,而且学了之后很容易忘。于是我建立了一个自己的笔记仓库 (一个我长期维护的笔记仓库,感兴趣的可以点个star~你的star是我写作的巨大大大大的动力),将…

用VS软件开发“浪漫烟花“<笔记摘录>

此处主要讲:如何开发一个连续的烟花弹上升并进行烟花爆炸的程序. 第一步自然是创建窗口,设置窗口宽度为1200,高度为800(#include <graphics.h>) initgraph(1200, 800);//创建窗口,宽度1200,高度800 第二步我们需要为这个窗口添加背景音乐,这里我们添加了一首"周杰伦…

【使用 BERT 的问答系统】第 1 章 : 自然语言处理简介

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【车间调度】基于模拟退火优化算法的的并行车间机器优化调度(Matlab代码实现)

目录 1 概述 2并行机调度问题的的描述 3 模拟退火法 4 基于模拟退火优化算法的的并行车间机器优化调度&#xff08;Matlab代码实现&#xff09; 4.1 运行结果 5 参考文献 6 Matlab代码 1 概述 并行机调度&#xff08;也称并行多机调度, Parallel MachinesScheduling Prob…

你不知道的npm

npm 前端工程化离不开 npm&#xff08;node package manager&#xff09; 或者 Yarn 这些管理工具。npm 或 Yarn 在工程项目中&#xff0c;除了负责依赖的安装和维护以外&#xff0c;还能通过 npm scripts 串联起各个职能部分&#xff0c;让独立的环节自动运转起来。 npm诞生…

跨平台.NET应用UI组件DevExpress XAF v22.1 - 增强Web API Service

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。&#xff…

Web进阶

目录 DOM节点操作&#xff08;上&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM结构及节点 DOM节点操作&#xff08;下&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM修改 DOM控制CSS样式 一、任务目标 二、任务背景 三、任务内容 …

达摩院快速动作识别TPS ECCV论文深入解读

一、论文&代码 论文&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136630615.pdf 模型&代码&#xff1a;ModelScope 魔搭社区 二、背景 高效的时空建模(Spatiotemporal modeling)是视频理解和动作识别的核心问题。相较于图像的Transforme…

ArrayList源码分析

ArrayList源码分析 注意:本笔记分析对象为 Java8 版本,随版本不同,源码会发生变化。 1 ArrayList类图与简介 ArrayList是一个 非线程安全,基于数组实现的一个动态数组。可以看到,它的顶层接口是 Collection<E> 集合类。 Note: ArrayList 可以存放所有元素,包括 n…

C语言详细知识点(下)

⛄️上一篇⛄️C语言详细知识点&#xff08;上&#xff09; 文章目录五、数组1、一维数组的定义及使用2、二维数组的定义及使用3、字符数组的定义及使用六、函数1、函数的定义2、函数的调用3、函数的声明4、函数的嵌套调用5、函数的递归调用七、指针1、什么是指针2、指针变量3、…

如何用蓝牙实现无线定位(二)--信号塔设置

1. 配置BLE4.0模块 根据三点定位原理&#xff0c;本项目需要使用3个信号塔。3个信号塔的主体均为BLE4.0模块&#xff0c;需要把BLE4.0模块的AT指令设置为“从设备”。 方法为&#xff1a; &#xff08;1&#xff09;给控制板刷一套空的程序。初始打开arduino IDE或新建&#x…

RabbitMQ事务消息

通过对信道的设置实现 channel.txSelect()&#xff1b;通知服务器开启事务模式&#xff1b;服务端会返回Tx.Select-Ok channel.basicPublish&#xff1b;发送消息&#xff0c;可以是多条&#xff0c;可以是消费消息提交ackchannel.txCommit() &#xff1b;提交事务&#xff1b;…

Devkit开发框架插件工具——Gzip工程创建

Devkit开发框架插件工具——Gzip工程创建 基于鲲鹏亲和开发框架进行原生开发&#xff0c;创建通用计算功能。 二、 操作前提。 1、 在鲲鹏社区申请远程实验室&#xff0c;操作系统选择OpenEuler。 点击链接&#xff1a;鲲鹏社区-官网丨凝心聚力 共创行业新价值&#xff0c;打…