简介JVM

news2024/11/14 20:48:55

目录

一、内存分区

1、程序计数器 

2、栈

3、堆

4、方法区 

二、类加载 

1、Loading 

2、Linking 

Verification 

Preparation 

Resolution 

3、Initializing

4、双亲委派模型 

三、垃圾回收 

1、如何判断为垃圾? 

引入引用计数

可达性分析

2、如何进行垃圾回收? 

标记清除

复制算法 

标记整理 

分代回收 


一、内存分区

Java将内存分为了程序计数器、栈区、方法区、堆区。

1、程序计数器 

程序计数器是内存中最小的区域,保存了下一条要执行指令的地址。

程序运行时,JVM就会把字节码加载起来,放到内存中,程序把指令从内存中取出来,放到CPU上执行这也就需要随时记住当前指令执行的位置,因为CPU是并发执行程序的,并且操作系统以线程为单位进行调度执行的,所以每个线程都有程序计数器。

2、栈

栈区主要保存的是局部变量和方法的调用信息,方法调用的时候就会涉及“入栈”操作,方法执行完之后就会涉及“出栈”的操作,局部变量也是类似。

栈空间也是比较小的,代码处理不当就会出现栈溢出异常。

每个进程都会分配一个栈区。

3、堆

堆区是内存空间中最大的区域,每次new出来的对象存在于堆区,对象的成员变量也就自然存在于堆区了。

一个进程会分配一个堆区,多个线程共享一个堆区。

4、方法区 

方法区存放的是类对象,每次当.class文件编译形成.class文件,.class文件会被加载到内存中,也就会被JVM构造成类对象(加载的过程就是类加载),此处的类对象就会存放到方法区,类对象中的静态成员也会存放到方法区。

二、类加载 

类加载是将.class文件加载到内存中,构建成类对象,类加载主要有Loading、Linking和Initiallizatio三步。

1、Loading 

Loading过程是先找到对应的.class文件,然后打开并读取.class文件,会将读取并解析到的信息初步填写到类对象中,同时会初步生成一个类对象。

2、Linking 

Linking来建立多个实体之间的联系,Linking又可以分为Verification、Preparation和Resolution三个阶段。

Verification 

校验阶段,主要来验证读到的内容与规范中规定的格式是否完全匹配,如果返现格式不匹配,就会类加载失败,并且抛出异常。

Preparation 

准备阶段,是正式为类中的变量分配内存并设置初始值,也就是给静态变量分配内存,并设置初值。

Resolution 

解析阶段是Java虚拟机将常量池中的符号引用替换为直接引用的过程,也就对常量初始化的过程。

3、Initializing

是真正对类对象进行初始化,尤其是对静态成员

4、双亲委派模型 

双亲委派模型其实是Loading的一个环节,描述的是JVM中的类加载器如何根据类的全限定名来找到.class文件的过程,也就是描述了找目录的过程。

JVM中提供了许多类加载器,每个类加载器负责一个片区,默认的类加载器主要有三个:

  • BootStrapClassLoader:负责加载标准库中的类。
  • ExtensionClassLoader:负责加载JDK扩展的类。
  • ApplicationClassLoader:负责加载当前项目目录中的类。

查找标准库中的类的过程: 

  1. 启动程序,先进入ApplicationClassLoader类加载器。
  2. ApplicationClassLoader就会检查它的父类是否已经加载过了,如果没有就调用父加载器ExtensionClassLoader。
  3. ExtensionClassLoader也会检查它的父类是否已经加载过了,如果没有就调用父加载器BootStrapClassLoader。
  4. BootStrapClassLoader会扫描自己负责的目录,一定会找到,找到后负责类加载的后序过程,直至查找环节结束。

查找自定义类的过程:

  1. 启动程序,先进入ApplicationClassLoader类加载器。
  2. ApplicationClassLoader就会检查它的父类是否已经加载过了,如果没有就调用父加载器ExtensionClassLoader。
  3. ExtensionClassLoader也会检查它的父类是否已经加载过了,如果没有就调用父加载器BootStrapClassLoader。
  4. BootStrapClassLoader会扫描自己负责的目录,如果没找到,就回到子加载器ExtensionClassLoader继续进行扫描。
  5. ExtensionClassLoader也会对自己负责的目录进行扫描,如果没找到,就回到子加载器ApplicationClassLoader继续进行扫描。
  6. ApplicationClassLoader对自己负责的目录进行扫描,如果找到就进行后续加载,否则就会抛出ClassNotFoundException异常。

三、垃圾回收 

如果一直申请空间而不进行空间回收的话就会导致内存用完,也就是内存泄露的问题,对于栈和程序计数器不考虑垃圾回收,当方法或进程结束时所占用的空间也会随着释放,垃圾回收主要针对堆和方法区。

1、如何判断为垃圾? 

引入引用计数

就是给对象再开辟一块区域用于引入计数器,当调用这个对象时,计数器就会加1,当引用失效的时候,计数器就会-1,如果计数器为0,该对象就会变为“垃圾”,进行回收。

但是也存在缺点:

空间利用率低,当对象本身空间很小时再增加一个计数器空间利用率低。

循环引用

public class T {
    public T t = null;

    public static void main(String[] args) {
        T t1 = new T();
        T t2 = new T();
        t1.t = t2;
        t2.t = t1;
        t1 = null;
        t2 = null;
    }
}

两个对象相互引用之后引用的t对象的程序计数器就为1,无法进行进行回收。

可达性分析

定义一个起始位置GCRoots,类似于深度优先遍历,对可以遍历到的对象进行标记,没标记的对象就是不可达,就成了垃圾。

例如:

GCRoots可以访问所有结点就不存在垃圾。

 

 GCRoots无法访问C和F,C和F就是垃圾。

在Java语言中,可作为GC Roots的对象包含下面几种:

1. 虚拟机栈(栈帧中的本地变量表)中引用的对象;

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

3. 方法区中常量引用的对象;

4. 本地方法栈中 JNI(Native方法)引用的对象。

2、如何进行垃圾回收? 

标记清除

进行可达性标记,对于未标记的直接进行清除释放内存。

缺点:产生许多内存碎片。

复制算法 

为了避免产生内存碎片,就引入了复制算法,将申请的内存一分为2,将不是垃圾的拷贝到另一边,将原来使用的一半空间整体释放。

缺点:

  • 空间利用率低。
  • 当垃圾较少时,复制开销较大。

标记整理 

将不是垃圾的元素都拷贝到申请的空间的前面,后面的空间可以正常利用。类似于顺序表删除元素。

分代回收 

对象新创建出来的时候先放在伊甸园,当伊甸园中的对象熬过一轮GC扫描,利用复制算法就会被拷贝到幸存区,在后序的几轮GC中幸存区的对象还是利用复制算法在幸存区之间来回拷贝,每一轮又会进行淘汰,在持续若干次之后,对象就会进入老年代,对象越老,继续存活的可能性就越大,老年的扫描频率低,并且老年代使用标记整理的方式进行回收。

分代回收中占用内存较大的对象可直接进入老年代。

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

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

相关文章

Transformer论文阅读:Swin Transformer算法笔记

标题:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 会议:ICCV2021 论文地址:https://ieeexplore.ieee.org/document/9710580/ 官方代码:https://github.com/microsoft/Swin-Transformer 作者单位&am…

[安装之2] 台式计算机加固态硬盘,台式机添加固态硬盘教程_台式主机固态硬盘怎么安装

固态硬盘是用固态电子存储芯片阵列制成的硬盘,也是电脑中比较常见的内存硬件,有些用户在使用电脑时候,由于内存不足导致系统运行较卡的情况,往往会选择添加固态硬盘来解决,那么台式主机固态硬盘怎么安装呢?…

shell脚本内调用另外一个shell脚本的几种方法

有时会在一个shell脚本(如test_call_other_shell.sh)中调用另外一个shell脚本(如parameter_usage.sh),这里总结几种可行的方法,这些方法在linux上和windows上(通过Git Bash)均适用: 1.通过source: 运行在相同的进程,在test_…

CCIE重认证-300-401-拖图题全

拖图 拖图题 编程 snippet;192.168.5.0,mask 255.255.255.0;number是192.168.5.0;mask是255.255.255.0 snippets;edit-config对config,loopback对name 100,address对primary,mask…

广度优先搜索算法 - 迷宫找路

广度优先搜索算法1 思考问题1.1 这个迷宫需不需要指定入口和出口?2 先粗略实现2.1 源码2.2 源码解释3 优化代码3.1 优化读取文件部分3.2 增加错误处理4 再优化-让程序变得更加灵活4.1 用户外部可以循环输入入口和出口5 完整代码这是一个提问者的提出的问题&#xff…

制造业的云ERP在外网怎么访问?内网服务器一步映射到公网

随着企业信息化、智能化时代的到来,很多制造业企业都在用云ERP。用友U 9cloud通过双版本公有云专属、私有云订阅、传统软件购买三种模式满足众多制造业企业的需求,成为一款适配中型及中大型制造业的云ERP,是企业数智制造的创新平台。 用友U 9…

python 面向对象利用selenium【获取某东商品信息】

用python程序和谷歌selenium插件获取某东商品详细信息【商品名称、商品简介,超链接】利用selenium自动化程序 中的css页面结构索取来获取详细数据关于谷歌selenium的安装方法和使用方法第一步检查自己谷歌浏览器的版本1.1 找到设置:并鼠标点击进入1.2进入…

排序评估指标——NDCG和MAP

在搜索和推荐任务中,系统常返回一个item列表。如何衡量这个返回的列表是否优秀呢? 例如,当我们检索【推荐排序】,网页返回了与推荐排序相关的链接列表。列表可能会是[A,B,C,G,D,E,F],也可能是[C,F,A,E,D],现在问题来了…

使用canvas写一个flappy bird小游戏

简介 canvas 是HTML5 提供的一种新标签,它可以支持 JavaScript 在上面绘画,控制每一个像素,它经常被用来制作小游戏,接下来我将用它来模仿制作一款叫flappy bird的小游戏。flappy bird(中文名:笨鸟先飞&am…

XSS注入进阶练习篇(一)XSS-LABS通关教程

XSS注入进阶练习篇1.常用标签整理2. XSS-LABS 练习2.1 level 1 无限制2.2 level 2 双引号闭合2.3 level 3 源码函数书写不全,单引号绕过2.4 level 4 无尖括号绕过2.5 level 5 a标签使用2.6 level 6 大小写绕过2.7 level 7 置空替换绕过2.8 level 8 URL编码绕过 - 重…

安全—07day

Tomcat AJP 文件包含漏洞(CVE-2020- 1938) 漏洞概述 Ghostcat(幽灵猫)是由长亭科技安全研究员发现的存在于Tomcat 中的安全漏洞,由于Tomcat AJP 协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含 Tomcat上所有…

Java岗面试题--Java并发(日积月累,每日三题)

目录面试题一:并行和并发有什么区别?面试题二:线程和进程的区别?追问:守护线程是什么?面试题三:创建线程的几种方式?1. 继承 Thread 类创建线程,重写 run() 方法2. 实现 …

详解垃圾回收算法,优缺点是什么?|金三银四系列

本文详细介绍了在 JVM 中如何判断哪些对象是需要回收的,以及不同的垃圾回收算法以及优缺点。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达上篇文章详细介绍了 JVM 的结构以及其内存结构,需要阅读请移步。本文主要…

Android 9.0系统源码_通知服务(二)应用发送状态栏通知的流程

前言 应用发送一个显示在状态栏上的通知,对于移动设备来说是很常见的一种功能需求,本篇文章我们将会结合Android9.0系统源码具体来分析一下,应用调用notificationManager触发通知栏通知功能的源码流程。 一、应用触发状态栏通知 应用可以通…

关于HDFS

目录 一、HDFS概述 二、HDFS架构与工作机制 三、HDFS的Shell操作 四、Hdfs的API操作 一、HDFS概述 HDFS:Hadoop Distributed File System;一种分布式文件管理系统,通过目录树定位文件。使用场景:一次写入,多次读出…

java 自定义注解

文章目录前言Annotation包自定义注解自定义注解示例参考文章:java 自定义注解 用处_java注解和自定义注解的简单使用参考文章:java中自定义注解的作用和写法前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十…

SpringAMQP消息队列(SpringBoot集成RabbitMQ)

一、初始配置1、导入maven坐标<!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2、yml配置spring:rabbitmq:host: 你的rabbitmq的ipport: …

4G模块DTU网关远程抄表方案(三):水表188协议

4G模块DTU网关远程抄表方案&#xff08;三&#xff09;&#xff1a;水气电表188协议 1 CTJ 188协议简介 CJ/T188协议规定了户用计量仪表(以下简称仪表)&#xff0c;包括水表、燃气表、热量表等仪表数据传输的基本原则&#xff0c;接口形式及物理性能、数据链路、数据标识及数…

目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

目标检测 回归损失函数1、Smooth L1 Loss2、 IoU Loss3、 GIoU Loss &#xff08;Generalized-IoU Loss&#xff09;4、 DIoU Loss &#xff08;Distance-IoU Loss&#xff09;5、 CIoU Loss &#xff08;Complete-IoU Loss&#xff09;总结&#xff1a;目标检测任务的损失函数…

【计算机网络】数据链路层(下)

文章目录媒体接入控制媒体接入控制-静态划分信道随机接入 CSMACD协议随机接入 CSMACA协议MAC地址MAC地址作用MAC地址格式MAC地址种类MAC地址的发送顺序单播MAC地址广播MAC地址多播MAC地址随机MAC地址IP地址区分网络编号IP地址与MAC地址的封装位置转发过程中IP地址与MAC地址的变…