JVM基础知识(内存区域划分,类加载,GC垃圾回收)

这篇具有很好参考价值的文章主要介绍了JVM基础知识(内存区域划分,类加载,GC垃圾回收)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

内存区域划分

JVM中的栈

JVM中的堆

程序计数器

方法区(元数据区)

给一段代码,某个变量在哪个区域上?

类加载

类加载时机

双亲委派模型

GC 垃圾回收机制

GC 实际工作过程

1.找到垃圾/判定垃圾

1.可达性分析(Java中的做法)

2.引用计数

2.清理垃圾

1.标记清除

2.复制算法

3.标记整理

分代回收(复制算法+标记整理)


内存区域划分

如果内存区域只有一块,不太方便,为了更加方便使用,就把整个空间隔成很多区域,每一个区域都有不同的作用
JVM,在启动的时候,会申请一整个很大的区域,JVM 是一个应用程序,从操作系统里申请内存,JVM把整个空间分层几个部分,每个部分各自有不同的功能作用
每一个Java进程都包含一个JVM

JVM基础知识(内存区域划分,类加载,GC垃圾回收),jvm

JVM中的栈

JVM中的栈不是数据结构中的栈,是JVM中的一个特定空间,对于 JVM 虚拟机,这里存储是 方法(我们自己写的java代码中的方法) 之间的调用关系.对于 本地方法栈,存储的是JVM内部方法的调用关系

整个栈空间内部,可以认为包含很多元素,每个元素表示一个方法. 这里的每个元素,称为一个"栈帧",这一个栈帧里,会包含这个方法的 入口地址,方法的参数是什么,返回地址是什么,局部变量等

数据结构的栈,是一个通用的更广泛的概念,是后进先出的数据结构,此处的JVM中的栈,特指JVM上的一块内存空间,由于函数调用,也是有后进先出的特点

JVM中虚拟机中的栈,有很多,每一个线程都有一个属于自己的栈,每一个栈都有很多的栈帧,调用一个方法会创建栈帧,方法结束,就会销毁这个栈帧

JVM基础知识(内存区域划分,类加载,GC垃圾回收),jvm

JVM中的堆

堆是整个 JVM 空间最大的区域,new 出来的对象(引用类型),都是在堆上.因此类的成员变量也在堆上.
堆是一个进程只有一份,一个进程中的多个线程共用一份堆.栈是一个线程有一个栈,一个进程有N个栈
堆的生命周期比较长,堆上面的方法执行结束默认不自动释放空间,而栈上面的方法会随着方法执行结束,自动释放空间

程序计数器

记录当前线程执行到哪个指令,每个线程都独有一份程序计数器

方法区(元数据区)

方法区每个进程只有一个,多个线程共用一份类对象,常量池,静态成员(static)都在方法区

给一段代码,某个变量在哪个区域上?

原则
1.局部变量在 栈 上
2.普通成员变量在 堆 上
3.静态成员变量在 方法区/元数据区 上

类加载

类加载: 类加载就是 .class文件,从文件(硬盘)被加载到内存中(方法区/元数据区)这样的过程

JVM基础知识(内存区域划分,类加载,GC垃圾回收),jvm

加载: 把.class文件找到,打开文件,读文件,把文件内容读到内存中,最终得到类对象
验证: 检查.class文件格式是否正确 
准备: 给类对象分配一个内存空间(在方法区/元数据区占个位置),会使静态成员被设置成0值
解析: 初始化字符串常量,把符号引用转换为直接引用
初始化: 调用构造方法,进行成员初始化,执行代码块,静态代码块,加载父类...      

类加载时机

java程序运行,不是把所有的类都加载了,而是真正用到了才加载(懒汉模式),一旦加载过后,后续再使用就不必重复加载了

1.构造类的实例
2.调用这个类的 静态方法/使用静态属性
3.加载子类,就会先加载父类

双亲委派模型

双亲委派模型,描述的是 加载过程 找.class文件,基本过程

JVM默认提供了 三个 类加载器

BootstrapClassLoader:  负责加载标准库中的类(java规范)

ExtensionClassLoader:  负责加载JVM扩展中的类(规范之外)

ApplicationClassLoader: 负责加载用户提供的第三方库/用户项目代码 中的类

上述三个类存在父子关系,BootstrapClassLoader是ExtensionClassLoader的父类,ExtensionClassLoader是ApplicationClassLoader的父类

加载一个类的时候是先从ApplicationClassLoader开始的,但是 ApplicationClassLoader会把加载任务,交给父亲,让父亲去执行.于是ExtensionClassLoader要去加载,但是ExtensionClassLoader也会委托给自己的父亲,于是BootstrapClassLoader就要去加载了,BootstrapClassLoader也想委托给自己的父类,可以它没有父类,因此就由自己加载,此时 Bootstrap就会搜索自己负责的标准库目录的相关的类,如果找到就加载,如果没找到,就由子类加载器进行加载..  ExtensionClassLoader 真正搜索扩展库相关的目录,如果找到就加载,如果没找到就由子类加载器加载.  ApplicationClassLoader,加载器进行加载(由于当前没有子类,如果没有找到,就会抛出 类找不到 这样的异常)

GC 垃圾回收机制

垃圾指的是不再使用的内存,垃圾回收,就是把不用的内存帮我们自动释放掉了. 而GC 就是一种主流的垃圾回收机制,GC垃圾回收机制 主要是针对 堆 里面的空间进行释放的, GC 是以"对象" 为基本单位,进行回收

GC 实际工作过程

1.找到垃圾/判定垃圾

哪个对象是垃圾,哪个对象不是垃圾,哪个对象以后可能还要使用,哪个对象后面不用了,关键思路是:看这个对象,有没有别的引用指向它(java中,使用对象只能通过引用来使用,如果一个对象没有引用指向,那么它一定不被使用)

具体如何判断对象是否有引用指向

1.可达性分析(Java中的做法)

Java 中的对象,都是通过引用来指向并访问的,经常是,一个引用指向一个对象,这个对象里的成员,又指向别的对象,比如链表,二叉树
整个Java中所有的对象,通过链表/树结构,整体串起来,可达性分析 就是把所有这些对象被组织的结构称为树,从树根节点出发,所有能被访问到的对象,标记成 "可达",不能访问到的,就是"不可达"
因此,通过上述标记JVM就可以知道所有可达的对象,剩下的不可达对象,就视为垃圾 进行回收

2.引用计数

给每个对象分配一个计数器(整数),每有一个引用指向该对象,计数器就+1,每次该引用被销毁 计数器就-1,引用计数为0时,此时这个对象就可以认为是垃圾了

2.清理垃圾

1.标记清除

直接把被标记的垃圾清除掉,缺点: 被释放的空间是闲散,零散,不连续,而我们申请内存需要连续的内存空间

2.复制算法

把不是垃圾的对象,复制到另一半,然后把刚刚有垃圾的一半整个空间删除掉.解决了内存碎片的问题
缺点,空间利用率低,如果要是垃圾少,有效对象多,复制成本大

3.标记整理

类似顺序表删除中间元素,把是垃圾的元素用不是垃圾的元素给填掉(元素搬运),再释放空间

分代回收(复制算法+标记整理)

根据不同的场景,使用不同的算法
分代: 基于经验规律,根据生命周期的长短,分别使用不同的算法
给对象引入一个 年龄 的概念,单位是 熬过GC垃圾回收的轮次,把年龄小的对象使用复制算法删除(年龄小的对象中,可能是垃圾的比较多),把年龄大的对象使用标记整理删除(老年代对象可能是垃圾较少)文章来源地址https://www.toymoban.com/news/detail-732246.html

到了这里,关于JVM基础知识(内存区域划分,类加载,GC垃圾回收)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM零基础到高级实战之Java内存区域本地方法栈

    JVM零基础到高级实战之Java内存区域本地方法栈 JVM零基础到高级实战之Java内存区域本地方法栈 本地方法栈是什么? 用于作用域本地方法执行的一块Java内存区域 为什么要有本地方法栈? 与Java虚拟机栈相同,每个方法在执行的同时都会创建一个栈帧(Stack Framel)用于存储局部

    2024年02月09日
    浏览(41)
  • JVM-基础知识

    JVM基础知识 JVM结构图 字节码文件 Java虚拟机不和包括Java在内的任何语言绑定,它只与字节码文件这种特定的二进制文件格式所关联. Class文件结构不仅仅是JVM的执行入口,更是Java生态圈的基础和核心. 字节码文件内容是什么 字节码是一种二进制的类文件,他的内容是JVM指令,而不

    2024年02月07日
    浏览(34)
  • 《JavaEE初阶》JVM基础知识

    本章主要介绍JVM中比较重要的三个内容: JVM内存区域划分 JVM类加载机制 JVM垃圾回收机制 当我们创建一个java进程时,启动时会向操作系统申请一块内存,JVM会将这块内存划分为几个区域: 堆 栈 程序计数器 方法区 堆: 堆上主要存放的是new的对象,是最重要的区域,也是内存划分最多

    2024年02月09日
    浏览(37)
  • JVM-环境准备&性能指标&基础知识

    环境准备性能指标基础知识 环境准备 JDK — 工具 JDK(Java Development Kit) 是用于开发 Java 应用程序的软件开发工具集合,包括了 Java 运行时的环境(JRE)、解释器(Java)、编译器(javac)、Java 归档(jar)、文档生成器(Javadoc)等工具。简单的说我们要开发 Java 程序,就需要

    2024年02月07日
    浏览(57)
  • JVM,关于JVM基础的知识,你确定不了解一下吗?

    目录 一.JVM的概念 什么是JVM? 二.JVM的运行流程 1.class文件如何被JVM加载并运行 2.JVM运行时数据包括哪些区域(M) 三.类加载的过程(M) 四.双亲委派模型 1.双亲委派模型分析 2.JAVA中有哪些类加载器(M) 五.垃圾回收机制 1.死亡对象的标识 ①引用计数算法 ②可达性分析算法

    2024年02月02日
    浏览(42)
  • Java基础常考知识点(基础、集合、异常、JVM)

    作者: 逍遥Sean 简介:一个主修Java的Web网站游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 本文收集Java核心的面试常考知识点,码起面试之前复习!!! JDK(Java SE Development Kit) ,

    2024年02月07日
    浏览(57)
  • jvm中类和对象定义存储基础知识

    Class文件结构主要有两种数据结构: 无符号数和表 • 无符号数 :用来表述数字,索引引用、数量值以及字符串等,比如 图1中类型为u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节的无符号数 • 表 :表是有由多个无符号数以及其它的表组成的复合结构,比如图1中类

    2024年02月08日
    浏览(54)
  • JAVA后端开发面试基础知识(一)——JVM

    Class loader(类装载) 根据给定的全限定名类名(如: java.lang.Object)来装载class文件到 Runtime data area中的method area。 Execution engine(执行引擎) 执行classes中的指令。 Native Interface(本地接口) 与native libraries交互,是其它编程语言交互的接口。 Runtime data area(运行时数据区域) 这就是我们常说

    2024年03月10日
    浏览(60)
  • 内存管理框架 --- 基础知识

    早期的计算机, 程序是直接运行在物理内存上 。也就是程序在运行的过程中,直接访问的是物理地址。 如果这个系统只运行一个程序,只要这个程序所需的内存不要超过该机器的物理内存就不会出现问题,也就不需要考虑内存管理,反正就一个程序,就这么点内存,够不够

    2024年02月11日
    浏览(48)
  • 第三章 内存管理 一、内存的基础知识

    目录 一、什么是内存 二、有何作用  三、常用数量单位 四、指令的工作原理 五、装入方式 1、绝对装入 2、可重定位装入(静态重定位) 3、动态运行时装入(动态重定位) 六、从写程序到程序运行 七、链接的三种方式 1、静态链接 2、装入时动态链接 3、运行时动态链接

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包