Java虚拟机(JVM)解析:内存区域、类加载、垃圾回收和选型考虑

目录

一、JVM内存区域划分

二、JVM类加载 

三、JVM垃圾回收(GC)


一、JVM内存区域划分

  • 方法区(元数据区)
  • 程序计数器

1.栈 

举个例子:

 

那具体是怎么分的呢?如下图

本地方法栈:给JVM内部的方法准备的栈空间

虚拟机栈:给Java代码使用的栈(这里的栈与数据结构的栈的概念不同)

栈是每个线程都有一份,一个进程有n份

2.堆

堆是每个进程只有一份

3..元数据区 

类对象就是在这里,包括常量池,静态成员~~

4..程序计数器

记录当前线程执行到那个指令,每个线程有一份

二、JVM类加载 

类加载流程:

 对于一个类来说,它的生命周期是这样的:

其中前 5 步是固定的顺序并且也是类加载的过程,其中中间的 3 步我们都属于连接,所以对于类加载来说总共分为以下几个步骤: 

1. 加载:把.class文件找到,读取文件内容,最终得到一个类对象

一个类,啥时候会被加载呢?

怎么找到.class文件呢?

双亲委派模型,描述的是就是找.class文件的基本过程 (最常考)

 基本流程:

举个例子:

假设用户在自己的代码中,写了个java.lang.String这个类,按照上面的加载流程,此时JVM加载的是标准库中的类,不会加载自己写的类。 

2. 连接

        1. 验证——根据jvm虚拟机规范、检查.class文件的格式是否符合要求

        2. 准备——给类对象分配内存空间(内存初始化为全0)

        3. 解析——针对字符串常量进行初始化,把符号引用转为直接引用

把符号引用转为直接引用的意思:

 举个简单的例子:

3. 初始化:真正针对类对象里面的内容进行初始化,加载父类,执行静态代码块的代码

三、JVM垃圾回收(GC)

大家还记得吗?在C语言中,我们通过malloc动态申请内存(申请的内存是在堆中),每次申请完后都要我们手动释放内存(free)。如果不释放就回造成内存泄漏等严重问题。

但是如果光指望我们程序员手动释放内存,那显然是不靠谱的。

为在Java中就由机器负责回收不再使用的内存空间——这种机制就被称为内存回收机制(garbage collection简称GC)

GC的好处:非常省心,让程序猿写代码简单点,不容易出错

GC的坏处:需要消耗额外的系统资源,也有额外的性能开销 

性能开销导致的问题:STW问题(stop the world)

如果有时候,内存的垃圾已经非常多了,此时触发一次GC机制,开销会非常大,大到可能把系统资源吃了很多~~

另一方面,GC可能会涉及一些锁操作,导致业务没办法正常执行,这样的卡顿,可能会持续几十毫秒或者上百毫秒~~

举个简单的例子:当你在家电脑打游戏时,突然你妈妈过来扫地,那你就只能挂机,站起来等你妈妈扫完这个地方,才继续~~ 

1.那么,垃圾回收收的是什么呢?

 

 2.如何确定该对象需要回收呢?

  • 引入计数【不是java的做法.python/php】
  • 可达性分析 【java的做法】

大家面试注意审题:

1.问题是:垃圾回收中如何判断对象是垃圾?

此时两个都说

2.问题是: 谈谈java的垃圾回收中如何判断对象是垃圾?

此时只需要说可达性分析

引入计数 :

大括号结束,上述三个引用超出作用域,失效,此时引用计数就是0了,此时new Test()对象就是垃圾了~~

那为什么java不使用这个方法呢?

 可达性分析 :

可达性就是以代码中的一些特殊变量为起点,然后以起点触发,看看哪些对象都能被访问到。只要对象能访问到,就标记为“可达”,当完成一圈标记后,剩下的就是“不可达“的了,也就是要回收的垃圾了。

我们对上面的名词做出解释~

 简单来说~~

举个例子:

确定了要回收的对象,那如何进行垃圾回收呢?

1.标记清除

 

 2.复制算法

 

3.标记整理 

4.分代回收 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业微信自建应用开发流程

开发需知 1、企业微信后台管理(不是小程序管理后台):企业微信 2、企业微信开发者文档(不是小程序文档):概述 - 接口文档 - 企业微信开发者中心 3、开发应用的类型:根据开发应用类型选择文档。…

STM32F103VET6基于ENC28J60移植LWIP1.4.1(标准库,无RTOS)

目录 环境引脚连接1.准备LWIP2.新建arch3.网卡驱动4.新建分组5.项目头文件路径6.LWIIP头文件编写7.ethernetif.cvoid low_level_init(struct netif *netif)err_t low_level_output(struct netif *netif, struct pbuf *p)struct pbuf *low_level_input(struct netif *netif)void…

UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank 效果: 代码: void MyClass::do_it() { //获取加工环境tagtag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);//返回当前工序导…

财报解读:打好“新鲜牌”,光明乳业业绩规模能否持续扩大?

近期,各大乳企相继披露了中期业绩,从财报情况来看,伊利、蒙牛、光明仍然稳居营收规模上百亿的第一梯队。 值得一提的是,2023年上半年,乳制品行业的发展并非一帆风顺,牧业端饲料价格处在高位,养…

清水模板和混水模板的区别是什么?

清水模板和混水模板是建筑施工中常用的两种模板类型。它们在结构、外观和使用方面存在一些显著的区别。下面将详细介绍清水模板和混水模板的特点和区别。 1. 材料:清水模板是由高分子有机材料制成的,而混水模板则是由混凝土制成的。由于材料的不同&#…

【论文阅读】MARS:用于自动驾驶的实例感知、模块化和现实模拟器

【论文阅读】MARS:用于自动驾驶的实例感知、模块化和现实模拟器 Abstract1 Introduction2 Method2.1 Scene Representation2.3 Towards Realistic Rendering2.4 Optimization3.1 Photorealistic Rendering3.2 Instance-wise Editing3.3 The blessing of moduler des…

网上管理系统的分析及设计---应用UML建模

目 录 第1章 系统需求 第2章 需求分析 2.1 识别参与者 2.2 识别用例 2.3 用例的事件流描述 第3章 静态结构模型 3.1 定义系统对象 3.2 定义用户界面类 3.3 建立类图 第4章 动态行为模型 4.1 创建系统顺序图(协作图) 4.2 创建系统…

【Spring Boot】有这一文就够了

作者简介 前言 作者之前写过一个Spring Boot的系列,包含自动装配原理、MVC、安全、监控、集成数据库、集成Redis、日志、定时任务、异步任务等内容,本文将会一文拉通来总结这所有内容,不骗人,一文快速入门Spring Boot。 专栏地址…

Jmeter系列进阶-获取图片验证码(4)

安装工具 通过ocrserver工具识别图片验证码,解压后 .exe双击启动即可。 jmeter中使用 (1)HTTP请求获取验证码 (2)在获取验证码图片的接口下面添加监听器》保存响应到文件;如下图: &#x…

易点易动固定资产管理系统:为企业提供高效资产管理的必备利器

在如今竞争激烈的商业环境中,企业对于固定资产的管理显得尤为重要。然而,传统的手工管理方式已经无法满足企业对于高效、准确、智能化管理的需求。因此,引入一款先进的固定资产管理系统是必不可少的。易点易动固定资产管理系统作为一款领先的…

【Spring使用三级缓存解决循环依赖的过程】

testService1和testService2相互依赖 当Spring创建testService1对象时,它会先从一级缓存中查找是否存在testService1的实例。如果缓存中不存在testService1实例,它将继续查找二级缓存中是否存在testService1。如果二级缓存中也不存在testService1实例&…

浅述数据中心供配电系统解决方案及产品选型

安科瑞 华楠 【摘 要】现如今,社会主要领域已从对单个设备的关注转化为对于系统解决方案的关注,数据中心的供应商们也想尽办法去满足所面对的各方面需求。基于此,主要提出了云计算数据中心供配电解决方案,同时还对数据中心供配电…