JavaEE - JVM八股文(JVM内存区域划分,典型面试题,JVM类加载机制)

news2024/11/19 2:43:48

文章目录

  • 1. JVM运行时数据区(内存区域划分)
  • 2. JVM类加载机制
    • 常见面试题

1. JVM运行时数据区(内存区域划分)

JVM运行时数据区域也叫内存布局,但需要注意的时它和Java内存模型(JMM)不同,属于不同的概念。

JVM运行时数据区域由下列组成

  1. 程序计数器:内存中最小的区域,保存了下一条指令的地址。

    JVM将字节码加载到内存,程序会将指令从内存中取出,放到CPU上执行。
    程序计数器就是用来标记当前执行到第几条指令。
    每个线程都有一份。

  2. 栈:存放局部变量和方法调用信息

    每次调用方法时入栈,执行完方法后出栈操作。
    栈中的每一个元素称为栈帧。
    每个线程都有一份。

  3. 堆:一个进程只有一份,多个线程共用一个堆。

    堆中的内容保存new出来的对象。
    (局部变量在栈上,成员变量在堆上。)

  4. 方法区:方法区中存放的是类对象

    java文件在运行时会被编译为class文件,class文件被加载到内存中,被JVM构造成类对象(加载的过程称为类加载)
    这个类对象就放在方法区中。
    类对象中包含(静态成员(static修饰的成员),类名称,成员变量和方法等)

2. JVM类加载机制

类加载:把class文件加载到内存中,构成对象。

整个类加载分为三大步
loading(加载) , linking(连接) , initializing(初始化)

loading:找到对应的.class文件,打开.class文件,生成一个类对象。

  1. 通过一个类的全限定名来获取定义此类的二进制字节流。
  2. 将这个字节流所代表的静态储存结构转化为方法区的运行时数据结构。
  3. 在内存中生成一个代表这个类的java.long.Class对象,作为方法区这个类的各种数据的访问入口。

linking:建立好多个实体之间的联系。

  1. 验证:保证读取的.class数据内容是否符合规范,是否正确。如果验证失败,就会类加载失败,并且抛出异常。

  2. 准备:为静态变量分配内存,并且设置0值。

  3. 解析:对常量池的符号引用替换为直接引用的过程,初始化常量

    .class文件中,常量是集中放置的,每个常量有一个编号。
    .class文件内的结构体初始情况只是记录常量编号
    解析的过程就是将这个编号还原为变量的过程

initializing:对类对象进行初始化

常见面试题

  1. 下面代码的运行结果
class A {
    public A() {
        System.out.println("A的构造函数");
    }

    {
        System.out.println("A的构造代码块");
    }

    static {
        System.out.println("A的静态代码块");
    }

}

class B extends A {
    public B() {
        System.out.println("B的构造函数");
    }

    {
        System.out.println("B的构造代码块");
    }

    static {

        System.out.println("B的静态代码块");
    }
}

public class TestJVM extends B {
    public static void main(String[] args) {
        new TestJVM();
        new TestJVM();
    }
}

原则:

  1. 类加载阶段进行静态代码块执行
  2. 静态代码块旨在类加载过程中执行一次
  3. 构造方法和构造代码块每次实例化都会执行,构造代码块在构造方法前
  4. 先初始化父类,之后初始化子类。加载顺序类似。

在这里插入图片描述

要想执行main方法,需要先加载TestJVM类。
要想加载TestJVM类就要加载B类,要加载B类就要加载A类。

  1. 双亲委派模型

处于类加载中的加载阶段,描述的JVM类加载器如何根据类的全限定名找到.class文件的过程

JVM里提供专门的对象负责类加载(类加载器)
.class文件可能存放到多个位置,JVM里面提供多个类加载器,每个类加载器负责一个片区

默认的类加载器:

  1. BootStrapClassLoader:负责标准库中的类
  2. ExtensionClassLoader:负责加载JDK扩展的类
  3. ApplicationClassLoader:负责加载当前项目目录的类

也可以自定义类加载器,用来加载其他目录的类。

双亲委派模型:描述了类加载器找目录的过程。
eg:类加载器加载java.long.String类

  1. 程序启动,先进入ApplicationClassLoader类加载器
  2. ApplicationClassLoader检查它的父加载器是否已经加载过,如果没有,就调用父加载器ExtensionClassLoader
  3. ExtensionClassLoader检查父加载器是否加载过,如果没有就调用父加载器BootStrapClassLoader
  4. BootStrapClassLoader扫描负责的目录
  5. java.long.String这个类在BootStrapClassLoader负责的目录下找到了,所以BootStrapClassLoader负责后序的类加载过程。加载过程结束。

eg:考虑加载用户自定义的test类
前4个步骤于上面相同。

  1. test这个类在BootStrapClassLoader负责的目录下没找到,回到子加载器继续加载。
  2. ExtensionClassLoader扫描自己负责的目录,也没找到
  3. ApplicationClassLoader扫描自己负责的目录,找到test类,进行类加载。
  4. 如果ApplicationClassLoader也没找到,就抛出类没找到异常。

这样设计,一旦用户自定义的类和标准库中的类名重复了,也可以加载到标准库的类。保证加载类的唯一性。

自定义的类加载器可以选择不遵守双亲委派模型
eg:tomcat加载webapp中的类,没有遵守双亲委派模型。

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

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

相关文章

使用PyTorch进行知识蒸馏的代码示例

随着机器学习模型的复杂性和能力不断增加。提高大型复杂模型在小数据集性能的一种有效技术是知识蒸馏,它包括训练一个更小、更有效的模型来模仿一个更大的“教师”模型的行为。 在本文中,我们将探索知识蒸馏的概念,以及如何在PyTorch中实现它…

计算机毕设Python+Vue校园舆情监控系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C#修改富文本框(RichTextBox)指定内容颜色

1.前言 最近给客户做了一个协议解包与组包的工具,以便于他们给终端客户或者集成商使用,让客户能够快速集成产品协议,降低客户集成工作量,产品协议是基于JT/T808,但是有增加了自己的一些特殊修改。 客户使用的是C#开发…

数据库原理及MySQL应用 | 并发控制

无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制问题,MySQL通过多版本并发控制和加锁实现并发控制。 多用户并发执行事务访问同一个数据库时,可能引发脏写、脏读、不可重复读、幻读等一致性问题。并发事务访问相同记录的情况&#xff0…

Golang 【basic_leaming】数组

阅读目录Array(数组)数组定义数组的初始化方法一方法二方法三数组的遍历数组是值类型多维数组二维数组的定义二维数组的遍历数组练习题1、请求出一个数组的和以及平均值 for-range2、请求出一个数组的最大值,并得到对应的下标3、从数组 [1, 3, 5, 7, 8] 中找出和为 …

探花交友_第10章_搭建后台系统(新版)

探花交友_第10章_搭建后台系统(新版) 文章目录探花交友_第10章_搭建后台系统(新版)1.1 概述1.2 API网关1.2.1 搭建网关依赖引导类跨域问题配置类配置文件测试1.2.2 配置鉴权管理器1.3 Nacos配置中心1.3.1 添加依赖1.3.2 添加boots…

33.数据统计

数据统计 后台系统首页中,显示各种统计数据,比如:累计用户数、新增用户数、登录次数等内容。 解决方案 数据库表分析 一、数据采集 需求: 1、探花系统将用户操作日志写入RabbitMQ 2、管理后台获取最新消息,构造日…

SpringBoot+微信小程序实现的云音乐小程序系统 附带详细运行指导视频

文章目录一、项目演示二、项目介绍三、项目运行截图四、主要代码一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBoot微信小程序框架开发的云音乐微信小程序系统。首先,这是一个前后端分离的项目&#xff…

C语言百日刷题第十五天

前言 今天是刷题第15天,放弃不难,但坚持一定很酷~ 再刷一套模拟题 C语言百日刷题第十五天前言一、选择题二、判断题三、多选题四、填空题五、分析程序题一、选择题 1.下列选项中,不属于开发一个C语言应用程序的具体实现步骤的是&#xf…

为什么网络应用程序是今年的主要攻击媒介之一

网络犯罪分子在绕过最新的网络应用程序防火墙方面的独创性正在将互联网应用程序变成今年增长最快的攻击媒介。面向公众的 Web 应用程序现在是渗透组织边界的最广泛使用的攻击媒介。 根据卡巴斯基全球应急响应团队最近的一份报告,始于 Web 应用程序的攻击从 2020 年…

ocker高级篇1-dockeran安装mysql主从复制

大家好,咱们前面通过十篇的文章介绍了docker的基础篇,从本篇开始,咱们的《docker学习系列》将要进入到高级篇阶段(基础篇大家可以查看之前发布的文章)。 咱们先来介绍:docker复杂方式安装软件。通过按照mysql\redis两个案例来讲解…

XC6SLX100-3FGG484C规格、XC7A15T-2CPG236I产品概述及应用

Spartan-6系列提供领先的系统集成能力,为大批量应用提供最低的总成本。这个由13个成员组成的家族扩展了逻辑单元的密度,从3840个扩展到147443个,功耗仅为之前斯巴达家族的一半,并且具有更快、更全面的连接。 Spartan-6系列基于成熟…

拯救动画卡顿之FLIP

前置知识 什么是FPS FPS是浏览器的每秒的渲染帧数,也就是浏览器切换画面的次数,大多数设备的刷新率都是60FPS,一般来说FPS越低页面就会越卡顿。 什么是像素管道? 像素管道是浏览器单个帧的渲染流水线,如果其中有某…

vue数据双向绑定

5.Vue数据双向绑定 5.1.什么是双向数据绑定 Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是 Vue.js 的精髓之处了。 值得…

[ MessAuto ]: 短信验证码自动填充,理论支持所有浏览器或 APP, Only For Mac

MessAuto 开源地址:https://github.com/LeeeSe/MessAuto MessAuto 是一款 macOS 平台 自动提取 短信验证码并 粘贴回车 的软件,百分百由Rust开发,适用于任何APP。 特点: 轻量:程序占用存储 1.8 M,占用内…

NLP学习笔记(三) GRU基本介绍

大家好,我是半虹,这篇文章来讲门控循环单元 (Gated Recurrent Unit, GRU) 文章行文思路如下: 首先通过长短期记忆网络引出为什么需要门控循环单元然后介绍门控循环单元的核心思想与运作方式最后通过简洁的代码深入理解门控循环单元的运作方…

奇舞周刊 476 期:代码在内存中的 “形状”

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■代码在内存中的 “形状”众所周知,js 的基本数据类型有 number、string、boolean、null、undefined 等。那么问题来了 typeof null 和 typeof undefined 分别是什么呢&…

[附源码]Node.js计算机毕业设计果蔬预约种植管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

[内网渗透]—NTLM网络认证及NTLM-Relay攻击

NTML网络认证 Windows认证分为本地认证和网络认证,当我们开机登录用户账户时,就需要将lsass.exe进程转换的明文密码hash与 sam文件进行比对,这种方式即为——本地认证 而当我们访问同一局域网的一台主机上的SMB共享时,需要提供凭证通过验证才能访问,这个过程就会设计win…

【C++】list 的模拟实现

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉前言&…