初始jvm-程序员宅基地

技术标签: python  开发语言  

初识jvm

jvm是解释运行 Java字节码的虚拟机。职责就是运行java字节码文件。

jvm的功能:

  • 解释运行字节码,实时解释成机器码让计算机执行
  • 内存管理:自动为对象,方法等分配内存。自动垃圾回收机制,回收不再使用的对象
  • 即时编译:对热点代码进行优化(不用重复执行,用一块内存管理),提高执行效率。

常见的jvm

发展历程

字节码文件详解

java虚拟机的组成

类加载器(加载内存class字节码文件中的内容到内存中)-->运行时数据区(负责管理jvm使用到内存)-->执行引擎(将字节码文件中的指令解释成机器码,同时使用即时编译器性能)

字节码文件的组成

基本信息(魔术,字节码文件对应的Java版本号),常量池(保存了字符串常量,类或接口名,字段名主要在字解码指令中使用),字段(当前类或接口声明的字段信息),方法,属性

字节码指令执行

public class Demo1 {
    public static void main(String[] args) {
        int i = 1;
         i++;
        System.out.println(i);
    }
}
 0 iconst_1  // 写入操作数栈上
 1 istore_1   // 栈弹出写入局部变量中 1为下标 
 2 iinc 1 by 1 // 必须是 当前帧的局部变量数组 (第 2.6 节),然后索引处的局部变量将按该量递增。intint
 5 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
 8 iload_1  // 从局部变量加载操作数栈上 复制一份数据
 9 invokevirtual #3 <java/io/PrintStream.println : (I)V>
12 return

常量池就是存放一些固定不变的,避免相同的内容重复定义,避免重复定义。

字符串都是指向同一个常量池cp_info24

    public static void main(String[] args) throws IOException {
        String c = "cc";
        String a = "cc";

    }

字节码的方法存放当前类,方法的字节码

类的生命周期

类的加载,验证,链接,初始化,使用,卸载回收的一个全过程。加载字节码,验证(是否是javaClass文件),会在方法区生成一个c++本地方法的Class,同时堆区也会生成方法区实现的class。

类的生命周期 加载阶段

类加载器通过根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。加载完会将字节码的信息保存到方法区中。会生成一个InstanceKlass对象。保存类的所有信息。还包含实现特定功能多态的信息。同时,还会在堆区生成一个在方法区类似java.lang.class对象。

查看类加载信息 启动命令 :java -cp sa-jdi.jar sun.jvm.hotspot.HSDB

类的生命周期 连接阶段之验证

连接阶段的环节是验证。验证的主要目的是为了检测java字节码文件是否遵守了《java虚拟机规范》

主要包含四个阶段

  1. 文件格式。文件以OxCAFEBABE开头,主次版本号是否满足当前虚拟机版本要求。

2.元信息验证,例如类必须有父类。

3验证程序执行指令的语义。

4.符合引用验证,例如是否访问其他类的private方法

类的生命周期 连接阶段之准备

准备阶段为静态变量分配内存并设置初始值

final修饰的基本数据类型的静态变量,准备阶段直接会将代码中值进行赋值

类的生命周期 连接阶段之解析

解析阶段主要是将常量池中的符号引用替换为直接引用(访问直接地址)

类的生命周期初始化

初始化给静态变量赋值初始值(除非用final修饰直接赋值,在连接阶段就直接赋值)

初始化阶段会执行静态代码块中的代码,并为静态变量赋值。执行代码流程一致。初始化会先执行字节码的clinit.

 private static  int i  =5;

    static {
        System.out.println("2");
    }

    public static void main(String[] args) throws IOException {
        System.out.println(i);
    }
 0 iconst_5 // 往栈中放入5
 1 putstatic #3 <com/lyw/jvm/Demo1.i : I> // 栈中弹出 在类中设置静态字段 i=5
 4 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;> //从类中获取字段static
 7 ldc #5 <2> // 从常量池中将字符串2加载到操作数栈
 9 invokevirtual #6 <java/io/PrintStream.println : (Ljava/lang/String;)V> //打印
12 return
  • clinit指令在特定情况下不会出现:
    无静态代码块且无静态变量赋值语句
  • 有静态变量的声明,但是没有赋值语句

  • 静态变量的定义使用final关键字,准备阶段直接进行初始化

类加载器

什么是类加载器:(java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术)通过类加载器将字节码加载到存储中

类加载器的分类:启动类加载器,扩展类加载器,应用程序类加载器,自定义类加载器。(向上查找,向下加载。上面没找到这个类,然后就从上到下加载一遍)。

启动类加载底层是用c++实现,默认加载java安装目录/jre/lib下的类文件

扩展类加载器

jre/lib/ext

双亲委派机制

向上查找,向下搜索(在类加载的过程中会先向上(加载器)查找有没有该类有就返回。如果都没有就向下加载)。如果类的加载器parent为null,则会提交给启动类加载器处理

打破双亲委派机制

1.可以通过自定义类加载器并且重写loadClass方法,就可以将双亲委派机制的代码去除。每一个应用会有一个独立的类加载器加载对应的类。

2.线程上下文类加载器。保存了线程上下文中保存的类加载器进行类的加载。这个类加载器一般都是应用类加载器。

JDBC就是通过spi机制对外暴露接口。然后通过上下文类加载器,去加载不同的的驱动。从而打破的双亲委派机制。

运行时数据区

pc程序计数器
主要是记录当前字节码运行的指令

Java虚拟机栈

java虚拟机栈由一个一个栈帧组成

java虚拟机栈随着线程的创建而创建,而回收则会在线程的销毁时进行。由于方法可能在不同的线程执行

每个线程都会包含一个自己的虚拟机栈。

栈帧

栈帧是由局部变量表,操作数栈,帧数据组成

局部变量表(在运行过程中存放的局部变量)。存放局部变量是会复用的。

操作数栈(是栈帧中虚拟机在执行指令过程中用来存放临时数据的一块区域)

帧数据主要包含动态链接,方法出口,异常表的引用

本地方法栈

存放navatice的方法栈

方法区

方法区是存放基础信息的位置,线程共享,主要包含三部分内容:

类的元信息(保存了所有类的基本信息)

运行时常量池(保存了字节码文件中常量池的内容)

常量池中存放的是字节码中的常量池内容。字节码文件中通过编号查表的方式找到常量,这种常量池称为静态常量池。当常量池加载到内存中之后,可以通过内存地址快速定位到常量池的内容,这种称为运行时常量池。

字符串常量池(保存了字符串常量)

堆区

一般java程序中堆内存是空间存放最大的一块内存区域。创建处理的对象都存在与堆上。

栈上的局部变量表中,可以存放堆上对象的引用。

不停的创建对象会造成内存溢出,堆空间有三个需要关注的值:used total max.

总结

自动垃圾回收

什么是内存泄漏:指的是不在使用的对象在系统中未被回收,内存泄漏的积累可能导致内存溢出。

Java中为了简化对象的释放,引入了自动的垃圾回收机制。通过垃圾回收器来对不再使用的对象完成自动回收,垃圾回收器主要负责对堆上的内存进行回收。

方法区的回收

方法区中能回收的内容主要就是不在使用的类

判断一个类可以被卸载。需要同时满足下面三个条件:

  1. 此类所有的实例对象都已经被回收。在堆中不存在任何该类的实例对象以及子类对象
  2. 加载该类的类加载器已经被回收
  3. 该类对应的java.lang.class对象没有任何地方被引用

堆的回收

如何判断堆上的对象可以回收?

java中的对象是否能被回收,是根据对象是否被引用来决定。如果对象被引用,说明该对象还在使用,不允许被回收。

如何判断堆上的对象没有被引用

常见的两种判断方法:引用计数法和可达性分析法

引用计数法

引用计数法会为每一个对象维护一个引用计数器,当对象被引用+1,取消引用时-1

缺点:当出现循环引用的时候,回收就会出现问题。

每次引用和取消引用都需要维护计数器,对系统性能有一定的影响。

可达性分析算法

java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类:GCRoot对象和普通对象,对象与对象之间存在引用关系。

可达性分析算法就是如果从某个到GCRoot对象是可达的,对象就不可被回收。

几种常见的对象引用

可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系。只有这层关系存在普通对象就不会被回收。除了强引用外,还有几种其他的引用方式:

软引用

弱引用

虚引用

终结器引用

软引用

软引用相对于强引用是一种比较弱的引用关系,如果一个对象只有软引用关联到它。内存不足时就会在软引用回收

软引用继承SoftReference.软引用常用于缓存

垃圾回收算法

垃圾回收要做的两件事:找到内存中存活的对象,释放不再存活对象的内存。使得程序能再次利用这部分空间。

垃圾回收算法的评价标准

Java垃圾回收过程会通过单独GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程称之为Stop the World 简称STW,如果STW时间过长则会影响用户使用。

1.垃圾回收算法-标记清除算法

标记清除算法的核心思想分为两个阶段

1.标记阶段。将所有存活的对象进行标记。java中使用可达性分析算法。从GC ROOT开始通过引用链遍历出所有存活的对象

2.清除阶段。从内存中删除没有被标记也就是非存活对象。

缺点:碎片化问题。由于内存是连续,所以在对象被删除之后,内存中会出现很多细小的可用内存单元。如果我们需要的是一个比较大的空间,很有可能这些内存单元的大小过小无法进行分配。

2.垃圾回收算法-复制算法

复制算法的核心思想是:准备两块空间From空间和To空间,每次在对象分配阶段,只能使用其中一块空间From

在垃圾回收GC阶段,将From中存活的对象复制到TO空间

将两块空间的From和to名字互换

3.垃圾回收算法-标记整理算法

标记整理算法也叫标记压缩算法,是对标记清理算法中容易产生内存碎片化问题的一种解决方案。

核心思想分为两个阶段:

1.标记阶段,将所有存活的对象进行标记。java中使用可达性分析算法,从GC ROOT开始通过引用遍历出所有存活对象

2.整理阶段,将存活对象移动堆的一端。清理掉存活的内存空间。

4.垃圾回收算法-分代垃圾回收算法

现代优秀的垃圾回收算法,会将上述描述的垃圾回收算法组合进行使用,其中应用最广的就是分代垃圾回收算法(GC)

分代垃圾回收将整个内存区域划分为年轻代和老年代

分代回收时,创建出来的对象。首先会被放入Eden区。随着对象Eden区越来越多。如果Eden区满,会触发Minor GC。Minor GC会把eden中和From需要回收对象回收,没有回收的对象放入To区(类似复制算法)。

接下来,to区变成From区。Enda园区满了之后。在触发GC。每个对象刚开始为1;当到15时会Minor GC.变成老年代。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50823701/article/details/137742456

智能推荐

稀疏编码的数学基础与理论分析-程序员宅基地

文章浏览阅读290次,点赞8次,收藏10次。1.背景介绍稀疏编码是一种用于处理稀疏数据的编码技术,其主要应用于信息传输、存储和处理等领域。稀疏数据是指数据中大部分元素为零或近似于零的数据,例如文本、图像、音频、视频等。稀疏编码的核心思想是将稀疏数据表示为非零元素和它们对应的位置信息,从而减少存储空间和计算复杂度。稀疏编码的研究起源于1990年代,随着大数据时代的到来,稀疏编码技术的应用范围和影响力不断扩大。目前,稀疏编码已经成为计算...

EasyGBS国标流媒体服务器GB28181国标方案安装使用文档-程序员宅基地

文章浏览阅读217次。EasyGBS - GB28181 国标方案安装使用文档下载安装包下载,正式使用需商业授权, 功能一致在线演示在线API架构图EasySIPCMSSIP 中心信令服务, 单节点, 自带一个 Redis Server, 随 EasySIPCMS 自启动, 不需要手动运行EasySIPSMSSIP 流媒体服务, 根..._easygbs-windows-2.6.0-23042316使用文档

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链_原生jackson 反序列化链子-程序员宅基地

文章浏览阅读1.2k次,点赞27次,收藏7次。2023巅峰极客 BabyURL之前AliyunCTF Bypassit I这题考查了这样一条链子:其实就是Jackson的原生反序列化利用今天复现的这题也是大同小异,一起来整一下。_原生jackson 反序列化链子

一文搞懂SpringCloud,详解干货,做好笔记_spring cloud-程序员宅基地

文章浏览阅读734次,点赞9次,收藏7次。微服务架构简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?(网关)这么多小服务,一旦出现问题了,应该如何自处理?(容错)这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。_spring cloud

Js实现图片点击切换与轮播-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏20次。Js实现图片点击切换与轮播图片点击切换<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/ja..._点击图片进行轮播图切换

tensorflow-gpu版本安装教程(过程详细)_tensorflow gpu版本安装-程序员宅基地

文章浏览阅读10w+次,点赞245次,收藏1.5k次。在开始安装前,如果你的电脑装过tensorflow,请先把他们卸载干净,包括依赖的包(tensorflow-estimator、tensorboard、tensorflow、keras-applications、keras-preprocessing),不然后续安装了tensorflow-gpu可能会出现找不到cuda的问题。cuda、cudnn。..._tensorflow gpu版本安装

随便推点

物联网时代 权限滥用漏洞的攻击及防御-程序员宅基地

文章浏览阅读243次。0x00 简介权限滥用漏洞一般归类于逻辑问题,是指服务端功能开放过多或权限限制不严格,导致攻击者可以通过直接或间接调用的方式达到攻击效果。随着物联网时代的到来,这种漏洞已经屡见不鲜,各种漏洞组合利用也是千奇百怪、五花八门,这里总结漏洞是为了更好地应对和预防,如有不妥之处还请业内人士多多指教。0x01 背景2014年4月,在比特币飞涨的时代某网站曾经..._使用物联网漏洞的使用者

Visual Odometry and Depth Calculation--Epipolar Geometry--Direct Method--PnP_normalized plane coordinates-程序员宅基地

文章浏览阅读786次。A. Epipolar geometry and triangulationThe epipolar geometry mainly adopts the feature point method, such as SIFT, SURF and ORB, etc. to obtain the feature points corresponding to two frames of images. As shown in Figure 1, let the first image be ​ and th_normalized plane coordinates

开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)_语义角色增强的关系抽取-程序员宅基地

文章浏览阅读708次,点赞2次,收藏3次。开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先关系再实体)一.第二代开放信息抽取系统背景​ 第一代开放信息抽取系统(Open Information Extraction, OIE, learning-based, 自学习, 先抽取实体)通常抽取大量冗余信息,为了消除这些冗余信息,诞生了第二代开放信息抽取系统。二.第二代开放信息抽取系统历史第二代开放信息抽取系统着眼于解决第一代系统的三大问题: 大量非信息性提取(即省略关键信息的提取)、_语义角色增强的关系抽取

10个顶尖响应式HTML5网页_html欢迎页面-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏51次。快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间。不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源。鉴于网站模板的灵活性和强大的功能,现在广大设计师和开发者对html5网站的实际需求日益增长。为了造福大众,Mockplus的小伙伴整理了2018年最..._html欢迎页面

计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...-程序员宅基地

文章浏览阅读282次。原标题:2018全国计算机等级考试调整,一、二级都增加了考试科目全国计算机等级考试将于9月15-17日举行。在备考的最后冲刺阶段,小编为大家整理了今年新公布的全国计算机等级考试调整方案,希望对备考的小伙伴有所帮助,快随小编往下看吧!从2018年3月开始,全国计算机等级考试实施2018版考试大纲,并按新体系开考各个考试级别。具体调整内容如下:一、考试级别及科目1.一级新增“网络安全素质教育”科目(代..._计算机二级增报科目什么意思

conan简单使用_apt install conan-程序员宅基地

文章浏览阅读240次。conan简单使用。_apt install conan