JVM面试真题总结(十)

news2025/2/24 21:30:03

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

是否所有对象都分配在堆内存上?

在Java中,对象主要是在堆上分配的。

堆是JVM中专门用于动态分配内存的区域,所有的对象实例以及数组都需要在堆上分配。

  • 当我们创建一个新的对象实例时,JVM会在堆上为这个新的对象分配内存。

然而,要注意的是,虽然对象实例本身是在堆上分配的,但是对这些对象的引用通常是在栈上分配的。

  • 比如,当我们在一个方法中创建一个新的对象时,这个对象的引用通常会被存储在当前线程的栈帧中。

除此之外,也要注意到Java 8引入的元空间(Metaspace)来替代永久代(PermGen)。

  • 类的元数据(如类的名字,字段,方法等)存储在元空间,而不是堆内存中。

另外,Java HotSpot虚拟机还引入了一种叫做逃逸分析的优化技术。

通过这种技术,JVM可以判断出一个新创建的对象的引用是否会逃逸出当前方法或者当前线程。

如果JVM通过逃逸分析判断出一个对象的引用不会逃逸出当前方法,那么这个对象可能会被优化为在栈上分配

  • 而不是在堆上分配,这种技术可以有效减少垃圾收集的压力。

但这是一种优化技术,并不是通常情况下的行为。

什么是直接内存?

直接内存并不是Java虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。

  • 它是在Java堆外分配的内存,直接受操作系统管理。

Java中的ByteBuffer类可以用来创建直接内存。

当我们调用ByteBufferallocateDirect方法时,Java虚拟机会调用本地方法,在堆外分配一块内存。

  • 这块内存不受Java垃圾收集器管理,所以在使用完后需要手动释放。

使用直接内存的主要好处是可以减少在Java堆和原生堆之间复制数据的次数。

  • 特别是在进行网络通信或者文件操作时,数据通常需要从Java堆复制到原生堆
    • 然后再从原生堆复制到操作系统的内核缓冲区。
    • 如果使用直接内存,数据就可以直接在原生堆中操作,无需在Java堆和原生堆之间进行复制。

但是,直接内存的分配和回收都比较昂贵

  • 所以只有在确实需要通过减少内存复制来提高性能的地方,才使用直接内存。

  • 另外,由于直接内存不受Java垃圾收集器管理,如果不正确地使用它,可能会造成内存泄漏。

详细描述JVM加载字节码文件的过程

JVM加载字节码文件的过程通常被称为类加载过程,主要包括以下几个步骤:

加载(Loading):

这是类加载过程的第一步,主要完成了以下三件事情:

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

链接(Linking):

链接阶段主要将原始的类文件字节码转化为可以被JVM直接使用的形式。

  • 验证(Verification):
    • 确保被加载的类的信息符合JVM规范,没有安全方面的问题。
  • 准备(Preparation):
    • 为类的静态变量分配内存,并将其初始化为默认值。
  • 解析(Resolution):
    • 将类的二进制数据中的符号引用替换为直接引用。

初始化(Initialization):

这个阶段主要执行类中定义的Java程序代码。

JVM将会根据类的字节码中的指令,对类进行初始化。

使用(Using):

程序使用该类进行各种操作。

卸载(Unloading):

当该类不再需要,类加载器将其卸载,回收内存。

这个过程是由类加载器(ClassLoader)执行的。

Java中有三种内置的类加载器:

  • 引导类加载器(Bootstrap ClassLoader
    • 扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)。
  • 我们也可以自定义类加载器,通过继承java.lang.ClassLoader类并覆盖它的方法来实现。

类加载器的类型有哪些?

Java的类加载器大体可以分为以下四种:

引导类加载器(Bootstrap ClassLoader):

  • 这是最顶层的类加载器,主要负责加载Java的核心类库,这些类库是Java运行时最基础的类库
    • rt.jar、resources.jar、charsets.jar等。
    • 引导类加载器是C++实现的,它并不继承自java.lang.ClassLoader

扩展类加载器(Extension ClassLoader):

  • 这是引导类加载器的子类,负责加载Java的扩展类库,如jce.jar、jsse.jar、jfr.jar
    • 以及java.ext.dirs路径下的jar包。
    • 扩展类加载器是Java实现的。

应用类加载器(Application ClassLoader):

  • 也被称为系统类加载器,是扩展类加载器的子类,负责加载用户类路径(ClassPath)上的类库。
    • 这个是程序默认的类加载器,也是ClassLoader.getSystemClassLoader()方法的返回值。

自定义类加载器(User ClassLoader):

  • Java也允许我们自定义类加载器
    • 我们可以继承java.lang.ClassLoader类,并覆盖其findClass()方法来自定义类加载器。
    • 自定义类加载器可以用于一些特殊的场景
    • 比如需要从网络、数据库加载类,或者需要对类进行加密和解密等。

类加载器的主要作用是加载Java类到JVM中。

当程序需要使用某个类时,如果这个类还没有被加载到内存中,那么系统就会通过类加载器来加载这个类。

一旦类被加载到内存中,就可以创建这个类的对象,或者调用这个类的静态方法和静态字段。

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

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

相关文章

SVM——支持向量机的学习入门

1、推荐文章 1、一文看懂SVM算法 2、图解机器学习|支持向量机模型详解 3、支持向量机的直观理解 2、分类问题 假设你的大学开设了一门机器学习(ML)课程。课程导师发现数学或统计学好的学生表现最佳。随着时间的推移,积累了一些数据&…

Mysql的高级查询:SQL关联查询(内连接/外连接/自连接)/子查询

一.关联查询: 定义:关联查询又叫连接查询 常见:内连接/外连接/自连接 1.内连接(无存在主从表) 语法:inner join ...on 定义:组合两个表的记录,返回关联字段相符的记录,也就是返…

【LeetCode】每日一题 2024_9_15 与车相交的点(差分)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 今天的题目曾经的我做过了 . . . 又是复习的一天 题目:与车相交的点 代码与解题思路 func numberOfPoints(nums [][]int) (ans int) { diff : [102]int{}for _, p : range nums {diff[p[0]]d…

Orchestrator 与 Mysql 8.0 的兼容性

一、看图识别问题 二、Mysql 8.0 从 MySQL 8.0.22 开始,使用SHOW REPLICA STATUS代替SHOW SLAVE STATUS,该语句从该版本开始已弃用。 所以:Mysql 8.0.22前可以用Orchestartor

InternStudio大模型之路(十七):销冠大模型案例实战

一、📢 简介 Streamer-Sales 销冠 —— 卖货主播大模型 是一个能够根据给定的商品特点从激发用户购买意愿角度出发进行商品解说的卖货主播大模型。以其独特的智能魅力,将彻底改变您的购物体验。该模型能深度理解商品特点,以生动、精准的语言…

NC输出二叉树的右视图

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 请根据二叉树…

QXDM 如何更新软件?

如何更新QXDM等高通软件?之前做过这个事情,但过几个月给别人讲的时候就忘记了,特做如下记录。 一. 背景知识: 1. QXDM 依赖于Qualcomm package Managers 3(QPM in short)。 目前的时间是2024年9月15日,但不知从何…

华为OD机试 - 找出作弊的人(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

门店引流神器异形创意LED圆形(饼/盘)显示屏使商业广告更有吸引力

在当今这个信息爆炸的时代,商业竞争日益激烈,如何在众多商家中脱颖而出,吸引顾客的注意力,成为了每个商家亟待解决的问题。而在这个视觉为王的时代,一种创新的门店引流神器——异形创意LED圆形(饼/盘&#…

【案例72】Apache检测到目标 URL 存在 http host 头攻击漏洞的解决方案

在网络安全中,我们经常会遇到各种漏洞和攻击,其中 http host 头攻击漏洞是一种比较常见的安全问题。最近,我在处理一个项目时,检测到目标 URL 存在 http host 头攻击漏洞,下面我将分享两种Apache解决这个问题的方法。 …

强烈建议!所有Python基础差的同学,死磕这本64页的背记手册

关于Python书籍的推荐,特别是针对Python背记手册这一类别,虽然直接名为“Python背记手册”的书籍可能不常见,但存在多本详尽的Python学习资料,旨在帮助学习者系统地掌握Python语言的基础知识和进阶技能,这些书籍或资料…

【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目

使用rtt-studio与stm32CubeMx联合创建项目 创建rt-thread项目 设置项目信息 在项目资源管理器中“右击“,创建RRT studio 项目 双击“RT-Thread 项目“。 选择MCU,设置UART,以及调试方式。添加项目名称,点击“完成“按钮。 …

python画图|极坐标下的3D surface

前述学习过程中,我们已经掌握了3D surface的基本绘制技巧,详见链接: python画图|3D surface基础教程-CSDN博客 基础教程中的3D surface绘制位于笛卡尔坐标系,但有时候会用到极坐标绘图。虽然我们已经学过简单的极坐标绘图技巧&a…

C++: 二叉树进阶面试题

做每件事之前都心存诚意, 就会事半功倍. 目录 前言1. 根据二叉树创建字符串2. 二叉树的层序遍历Ⅰ3. 二叉树的层序遍历Ⅱ4. 二叉树的最近公共祖先5. 二叉搜索树与双向链表6. 根据一棵树的前序遍历与中序遍历构造二叉树7. 根据一棵树的中序遍历与后序遍历构造二叉树8. 二叉树的…

AMD FSR 4已秘密开发1年 支持AI帧生成

作为当今三大超分技术之一,AMD FSR曾经在第二代一度紧紧咬住NVIDIA DLSS,但是进入第三代之后反而差距拉大了,尤其是帧生成技术差了很多。AMD高级副总裁、计算与图形业务事业部总经理Jack Huynh近日透露,FSR 2/3并不是AMD真正想要的…

学习使用在windows系统上安装vue前端框架以及环境配置图文教程

学习使用在windows系统上安装vue前端框架以及环境配置图文教程 1、安装nodejs2、安装vue3、安装Vue-cli脚手架4、安装高版本5、创建vue项目6、启动项目7、配置开发环境8、发布项目 1、安装nodejs 点我查看教程 2、安装vue winR,打开cmd cnpm install vue -g表示安…

Golang数据流处理:掌握Reader和Writer接口的技巧

Golang数据流处理:掌握Reader和Writer接口的技巧 引言理解Reader和Writer接口Reader接口的定义和基本方法Writer接口的定义和基本方法 Reader接口的深入探讨Reader接口的实现示例使用io.Reader读取文件内容从网络连接中读取数据 常用Reader类型及其应用场景strings.…

vue之 package.json和package-lock.json

一、package.json 定义了当前项目所需要引用的各个模块,可以手工修改配置,也可以删除后,使用npm init命令重新自动生成。 但是该文件只锁定大版本号,也就是版本号的第一位,所以你会发现两个文件中同一个包的版本号不一…

【Pycharm】Pycharm创建Django提示pip版本需要升级

目录 1、现象 2、分析 3、本质 前言:经常使用pycharm创建django、flask等项目时候提示pip版本需要升级,解决方案 1、现象 使用Pycharm创建Django项目提示安装Django超时,报错建议pip升级22升级到24 2、分析 之前使用命令升级了pip到了24…

数据库连接池与Druid【后端 16】

数据库连接池与Druid 在现代软件开发中,数据库连接池作为一种关键的技术手段,被广泛用于提升数据库访问的效率和稳定性。本文将深入探讨数据库连接池的概念、常见实现,并重点介绍我国阿里集团开源的数据库连接池——Druid,以及如何…