JVM简单介绍

news2024/11/24 2:22:52

JVM

  • JVM内存区域划分
  • JVM类加载机制
  • JVM垃圾回收机制
      • 【哪些内存需要被JVM中垃圾回收机制回收】
      • 【JVM中垃圾回收机制的基本单位】
      • 【JVM中垃圾回收机制是如何判断对象是否是垃圾】
      • 【如何回收垃圾】

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。

虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。

常见的虚拟机:JVM、VMwave、Virtual Box。

JVM 和其他两个虚拟机的区别:

  1. VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;

  2. JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪。

JVM 是一台被定制过的现实当中不存在的计算机。

JVM内存区域划分

JVM内存区域主要有四部分:

  1. 程序计数器
  2. 方法区

【堆】

堆的作用:程序所创建的对象都是保存在堆里面的。

也就是说,堆的内存空间是最大的

【栈】

栈细分,还可以分为:

  1. Java虚拟机栈:Java代码使用的栈
  2. 本地方法栈:给JVM内部C++代码使用的栈,也就是给JVM中的本地方法使用的栈

栈中存放最关键的信息是方法之间的调用关系和局部变量

【方法区】

方法区里面存放的是类对象

类对象里面有什么?类对象里面有代码和静态变量

方法区里面还有个运行时常量池

运行时常量池是方法区的一部分,存放字面量与符号引用。

字面量 : 字符串**(JDK 8** 移动到堆中**)** final常量、基本数据类型的值。

符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符
【程序计数器】

程序计数器的作用:程序计数器只是用来记录程序执行到哪里

程序计数器是占地最小的区域

总结:

堆和方法区是在整个Java进程只有一份,也就是说堆和方法区是线程共享的

栈和程序计数器在每一个线程都有一份,也就是说栈和程序计数器是线程私有的。

简单的效果图:
在这里插入图片描述

JVM类加载机制

Java进程启动(JVM启动)将.class文件从磁盘读取到内存,并且创建类对象的过程叫做类加载

类加载主要分为三个步骤:

  1. 加载
  2. 连接
    1. 验证
    2. 准备
    3. 解析
  3. 初始化

加载:找到.class文件,打开文件,读文件,创建空的类对象

连接

​ 验证:检查.class文件格式是否符合规范要求

​ 准备:给静态变量分配内存空间,空间里面填充0值

​ 解析:把字符串常量进行初始化,“把符号引用替换成直接引用”

初始化:针对类中的静态变量进行初始化,执行静态代码块,加载父类

【双亲委派模型】描述的是类加载中“加载阶段”

说到双亲委派模型就必须说一说类加载器,类加载器的作用就是负责把类给加载起来。

JVM中自带了三个类加载器:BootStrapClassLoader,ExtensionClassLoader,ApplicationClassLoader.

BootStrapClassLoader:负责加载标准库中的类

ExtensionClassLoader:负责加载一些扩展类

ApplicationClassLoader:负责加载应用程序里程序员自己写的类

在JVM中,给这三个类约定了一个父子关系:

BootStrapClassLoader是ExtensionClassLoader的父类

ExtensionClassLoader是ApplicationClassLoader的父类

双亲委派模型就是在上述的体系中,展开的规则:

要加载的类都先调用ApplicationClassLoader类加载器进行加载,但是ApplicationClassLoader类加载器并不做任何操作,把要加载的类交给其父类进行加载,以此类推,直到最后一个类加载器的时候,在来判断要加载的类是否是该加载器负责加载的,不是则往回走,直到加载完这个类。

JVM垃圾回收机制

在Java中,程序员不需要考虑回收内存的事情,我们想要开辟内存就开辟内存,JVM中有垃圾回收机制会帮助程序员回收没用的内存空间。

【哪些内存需要被JVM中垃圾回收机制回收】

JVM中的垃圾回收机制主要回收的是里面的内存空间。

【JVM中垃圾回收机制的基本单位】

JVM中垃圾回收机制是以对象为单位进行回收的,而不是字节

【JVM中垃圾回收机制是如何判断对象是否是垃圾】

<1>引用计数法

引用计数法:给对象增加一个计数器,计数器用来记录该对象被引用的次数,每当有一个地方引用了该对象,则计数器加一,当某个地方引用失效,计数器减一。当计数器里面的值为0时,对象就会被当作垃圾清除。

引用计数法的优点:

  1. 引用计数法能够很好地解决“如何判断对象是否是垃圾”这个问题
  2. 引用计数法实现简单,判定效率比较高

引用计数法的缺点:

  1. 在多线程的环境下,需要修改同一个计数器,必须考虑到线程安全的问题
  2. 可能导致循环引用的问题(重大缺陷)
  3. 如果对象比较少,并且比较多,引用计数就会造成不小的空间开销

<2>可达性分析

以代码中的一些特殊的变量作为起点,然后以起点出发,看看哪些对象能被访问到,只要能被访问到,则被标记为”可达“,当完成一遍后,剩下的对象就是”不可达“,会被标记为垃圾。

起点叫做”GC Root“

哪些变量可以称作”起点“(GC Root):

  1. 局部变量表中的引用(栈里面的局部变量)
  2. 方法区中,静态引用成员
  3. 常量池中对应的对象

JVM中采用”可达性分析“来判断对象是否是垃圾

【如何回收垃圾】

经典的垃圾回收算法

<1>标记-清除算法

首先,通过”可达性分析“标记出要回收的对象,然后统一回收就行了

标记-清除 算法的不足:

  1. 使用标记-清除 算法会引入 内存碎片 的问题,释放了对象,产生了很多有用的空间但是空间并不是连续的,要分配大一些的空间就不行了
  2. 标记和清除这两个过程的效率都不是很高

<2>复制算法

复制算法解决了标记-清除算法中的内存碎片的问题

复制算法将内存分为两部分,每次只能使用一部分,当要回收垃圾的时候,将还存活的对象复制到另外一部分,然后在将已使用用的部分统一释放了。

复制算法最大的缺点就是可利用的空间减少了(空间利用率不是很高)

<3>标记-整理算法

标记-整理算法 很像顺序表的删除操作,将存活的对象放在空间的前面,统一将后面的空间释放。

标记-整理算法的缺点:比较耗时,效率比较低

标记-整理算法的优点:解决了内存碎片的问题和空间利用率的问题

<4>迭代回收算法

迭代回收算法结合了复制算法和标记-整理算法

迭代回收算法引入”年龄“的概念。

年龄的大小判断:经历垃圾回收(GC)的次数

迭代回收算法将对象分为新生代和老年代,将内存分为两部分,一部分放新生代,一部分放老年代。

一般的新生代的对象在第一次垃圾回收的时候就清除了,在新生代的区域使用复制算法

一般的老年代中的对象存活率比较高,所以采用标记-整理算法。

迭代回收算法大致过程描述
在这里插入图片描述
1.新对象都保存在伊甸区

2.新对象一般是活不过一轮GC(垃圾回收),存活下来的对象保存到幸存区中。

从伊甸区到幸存区这个过程相当于复制算法。由于存活的对象比较少,复制的开销不是很大

3.幸存区的对象,又会经历多轮GC,每一轮GC都会淘汰一些对象,存活下来的对象,通过复制算法保存到另一个幸存区

4.在幸存区中经历多轮GC还在的对象,会被认为该对象一时半会儿销毁不掉,会被保存到老年代区域

5.老年代里面的对象的存活率比较高,要销毁对象使用的是标记-整理算法

注意:如果创建的对象太大的话,对象会直接保存到老年带区域

垃圾回收算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。

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

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

相关文章

电巢:半导体ATE国产化产业探究(附国内外厂家汇总)

前言 2022年10月7日&#xff0c;美国BIS发布近年来范围最大半导体管制举措&#xff0c;管控范围包括芯片、设备、零部件、人员等。 12月6日下午&#xff0c;全球最大晶圆代工厂台积电&#xff0c;在美国亚利桑那州凤凰城高调举行了首批机台设备迁机仪式。 据联合早报12月8日报道…

分蛋糕

题目描述 SYCSYC在每个阶段结束(语言阶段、基础算法、提高算法)后,都会切蛋糕 现在MasMas有一个蛋糕,他希望将蛋糕分成nn份 规定一刀合法的蛋糕切法为符合以下两种条件之一 一刀的切痕迹是一条线段,线段两个端点在圆上,且线段经过圆心(切痕为圆的直径) 一刀的切痕迹是一条线…

[附源码]计算机毕业设计Python电商小程序(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

2023年数字信号处理前沿国际会议(CFDSP 2023)

2023年数字信号处理前沿国际会议&#xff08;CFDSP 2023&#xff09; 重要信息 会议网址&#xff1a;www.cfdsp.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周内 收录检索&am…

【OpenCV】SURF图像拼接和Stitcher拼接

介绍两种图像拼接的方法&#xff0c;一种是SURF算法的图像拼接&#xff0c;另一种是Stitcher硬拼接 首先先从简单的讲起 一、Stitcher直接拼接 可以实现多张图片一起拼接&#xff0c;只要两行代码就可以实现拼接&#xff1b; 1.首先准备多张图片&#xff0c;放入向量容器中…

PDF如何插入空白页?3 次点击在PDF中插入空白页!

由于工作和学习的需要&#xff0c;您可能需要在现有的PDF文件中插入一张空白页或几页PDF&#xff0c;使之成为一个完整的PDF文件。但是&#xff0c;PDF文件实际上是最终作品&#xff0c;似乎不可能向其添加额外的页面。事实上&#xff0c;将空白页或 PDF 文件插入现有 PDF 文件…

Conv2Former ~2

还是来说Conv2Former~~ 上次发了一次~~ 一种卷积调制模块&#xff0c;利用卷积来建立关系&#xff0c;这比注意力机制在处理高分辨率图像时更高效&#xff0c;称为 Conv2Former。作者在 ImageNet 分类、目标检测和语义分割方面的实验也表明&#xff0c;Conv2Former 比以前基于…

【2022.12.19】备战春招Day14——每日一题 + 234. 回文链表 + 860. 柠檬水找零

【每日一题】1971. 寻找图中是否存在路径 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n -1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi之间的双向边。…

昆仑万维的AI作画简直就是业界天花板

AI作画的业界天花板被我找到了&#xff0c;AIGC模型揭秘 | 昆仑万维。 一、前景 1、AI和AIGC的关系 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的…

SpringMVC入门到实战------ 十一 拦截器的使用

1、拦截器的配置 拦截器用于拦截控制器方法的执行 拦截器需要实现HandlerInterceptor 拦截器必须在SpringMVC的配置文件中进行配置 1.1 和1.2 是对所有的请求进行拦截&#xff1b;1.3 对排出的请求不在拦截 1.1 不使用注解的情况 创建拦截器类 /*** 拦截器* author zyz* ve…

牛客竞赛每日俩题 - Day11

目录 错排问题 有理数运算 错排问题 年会抽奖__牛客网 全部都不获奖的概率必定是由 n个人都拿错的情况种数 除 n个人拿出的所有排列情况数。n个人拿出的所有排列情况数显然是n的阶乘。 假设a的名字没有被a拿到&#xff0c;其他n - 1个人都有可能拿到&#xff0c;即有n - 1种…

JavaScript 中的设计模式

目录 1. 单例模式 2. 策略模式 3. 代理模式 4. 装饰者模式 5. 组合模式 6. 工厂模式 7. 访问者模式 8. 发布订阅模式 9. 观察者模式 10. 参考链接 设计模式&#xff08;Design Pattern&#xff09;是从许多优秀的软件系统中&#xff0c;总结出的成功的、能够实现可维…

CentOS 7安装及使用MobaXterm连接

1、 下载centos7映像文件地址&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64 选择CentOS-7.0-x86_64-DVD-2009.iso 标准安装版或者CentOS-7-x86_64-Everything-1908.iso下载 2、安装centos7 2.1、右击以管理员身份运行 2.2、点击创建新的虚拟机 2.3、选择…

c++ - 第18节 - 哈希

1.unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进行很…

MockServer 服务框架设计

大部分现有的 mock 工具只能满足 HTTP 协议下简单业务场景的使用。但是面对一些复杂的业务场景就显得捉襟见肘&#xff0c;比如对 socket 协议的应用进行 mock&#xff0c;或者对于支付接口的失败重试的定制化 mock 场景。 为解决上述问题&#xff0c;霍格沃兹测试学院设计并研…

【Redis -String、List介绍和应用场景】

String String 是最基本的 key-value 结构&#xff0c;key 是唯一标识&#xff0c;value 是具体的值&#xff0c;value其实不仅是字符串&#xff0c; 也可以是数字&#xff08;整数或浮点数&#xff09;&#xff0c;value 最多可以容纳的数据长度是 512M。 内部实现 String 类…

万字解析,带你深入掌握多种排序算法!-C语言

今天我们来看排序&#xff0c;排序在生活中经常使用&#xff0c;非常重要&#xff0c;是必学的内容。 目录 1.插入排序 1.1直接插入排序 1.2希尔排序 2.选择排序 2.1直接选择排序 2.2堆排序 3.交换排序 3.1冒泡排序 3.2快速排序 3.2.1挖坑法 3.2.2左右指针法 3.2.3…

【驯服野生verilog-mode全记录】day4 —— 对循环展开语法的python脚本外挂支持

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵&#xff01; 系列文章目录 【驯服野生verilog-mode全记录】day3 —— 基于vim自动生成verilog-mode格式初始文件模板_尼德兰的喵的博客-CSDN博客 【驯服野生verilog-mode全记录】day2 —— 模块的例化_尼德兰的喵的博客-CSDN…