面试题005-Java-JVM(上)

news2024/11/13 15:53:58

面试题005-Java-JVM(上)

目录

  • 面试题005-Java-JVM(上)
    • 题目自测
    • 题目答案
      • 1. JVM由哪几部分组成?
      • 2. 运行时数据区中包含哪些区域?
      • 3. 栈和堆中分别存放什么数据?
      • 4. 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) ?
      • 5. 堆空间的基本结构了解吗?什么情况下对象会进入老年代?
      • 6. 大对象放在哪个内存区域?
      • 7. Java对象的创建过程?
    • 参考资料

题目自测

  • 1. JVM由哪几部分组成?
  • 2. 运行时数据区中包含哪些区域?
  • 3. 栈和堆中分别存放什么数据?
  • 4. 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) ?
  • 5. 堆空间的基本结构了解吗?什么情况下对象会进入老年代?
  • 6. 大对象放在哪个内存区域?
  • 7. Java对象的创建过程?

题目答案

1. JVM由哪几部分组成?

答:JVM是一个可以执行字节码(.class)文件的虚拟计算机,同时提供了内存管理,垃圾回收等机制。它包含了以下几个主要部分。

  • 类加载子系统:负责将字节码文件(.class)加载到JVM。
  • 运行时数据区:是JVM在执行期间使用的内存区域。
  • 执行引擎:负责解释或编译字节码为机器码,供处理器执行。
  • 本地库接口:提供了一组调用操作系统或其他语言编写的本地库的API。

2. 运行时数据区中包含哪些区域?

答:运行时数据区是JVM在执行Java程序时为其分配的内存区域。

  • 程序计数器:是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。如果线程正在执行本地方法,这这个计数器的值是未定义的。
  • Java虚拟机栈:每个线程在创建的时候都会创建一个虚拟机栈,用于存储线程的局部变量表、操作数帧、动态链接、方法出口信息等。Java虚拟机栈中包含多个栈帧,每个方法被调用到执行完成的过程,都对应着虚拟机中一个栈帧的入栈到出栈的过程。
  • 本地方法栈:是JVM运行Native方法准备的空间,它与Java虚拟机栈实现的功能类似,它是描述本地方法运行过程的内存模型。
  • 堆:用于存放几乎所有的对象实例和数组,是垃圾回收器主要工作的区域。
  • 方法区:用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等。JDK1.8之前,被实现为永久代。JDK1.8开始永久代被原空间取代。元空间使用的是本地内存而非堆内存。
    Java虚拟机运行时数据区

3. 栈和堆中分别存放什么数据?

答:栈(Java虚拟机栈)中存放的数据:

  • 局部变量表:主要用于存储方法参数,方法内的局部变量,数据类型包括基本数据类型和对象的引用。
  • 操作数栈:用于临时存储操作指令和方法执行过程中中间结果。
  • 动态链接:指向方法所属类的常量池的引用,用于解析方法中的符号引用。
  • 方法返回地址:存储方法调用后执行的下一条指令地址。
    堆中存放的数据:
  • 对象实例:在程序中通过new关键字创建的对象实例,包括对象的属性和方法。
  • 数组:所有类型的数组,包括基本类型数组和对象数组。

4. 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) ?

答:将永久代替换为元空间主要是为了解决永久代的一些固有问题和限制,提高JVM的性能和灵活性。

  • 提高内存管理的灵活性和效率:永久代的内存大小是在JVM启动时就已经设定好的,不能动态调整。元空间使用的是本地内存而不是Java堆内存,它的大小可以根据需要动态调整。
  • 解决类卸载和垃圾回收问题:永久代的GC行为较为复杂且不可预测,并且回收效率偏低。
  • 提供更好的性能和稳定性:使用元空间使得JVM内存管理更加统一和一致,因为元空间和其他内存区域一样,都是使用本地内存进行管理。这样可以简化内存管理策略,提升整体性能和稳定性。
  • 简化JVM的内存管理

5. 堆空间的基本结构了解吗?什么情况下对象会进入老年代?

答:堆空间的基本结构主要由新生代、老年代和永久代组成。JDK8以后永久代被元空间取代,使用本地内存来存储。

  • 新生代:新生代进步一细分为Eden区和两个幸存者区(Survivor 0 和 Surivivor 1)
    • Eden区:新创建的对象首先在Eden区分配内存。
    • 幸存者区(S0, S1):用于存放在新生代垃圾回收时存活下来的对象。每次Minor GC后,存活的对象会在这两个区来回复制。
  • 老年代:经过多次Minor GC后仍然存活的对象。老年代进行垃圾回收(Major GC 或 Full GC)的频率较低。
  • 永久代/元空间:用于存储类的元数据,包括类的定义、常量、静态变量、即时编译后的代码等。

对象进行老年代的情况:

  • 年龄阈值达到:每个对象在新生代分配内存时都有一个年龄,每次Minor GC后年龄都会加1。当年龄达到一定阈值(默认是15)后,对象会被提升到老年代。
  • 大对象:如果对象太大,超过了JVM设定的阈值,对象会直接在老年代分配空间。
  • Survivor区空间不足:如果在进行Minor GC时,幸存者区没有足够的空间来容纳所有存活的对象,这些对象会被
  • 动态对象年龄判定:如果Survivor空间中相同年龄的所有对象大小超过了Survivor空间的一半,那么年龄大于或等于该年龄的对象可以直接进入老年代。
// 动态年龄计算代码
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
 //survivor_capacity是survivor空间的大小
size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);//TargetSurvivorRatio 为50
size_t total = 0;
uint age = 1;
while (age < table_size) {
total += sizes[age];//sizes数组是每个年龄段对象大小
if (total > desired_survivor_size) break;
age++;
}
uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
  ...
}

6. 大对象放在哪个内存区域?

答:大对象(非常大的数组和字符串)通常会直接分配在老年代内存区域。这是为了避免新生代进行频繁的垃圾回收时,大对象频繁地在Eden区和Survivor区之间复制,从而提高垃圾收集效率。
配置大对象直接进入老年代的阈值:

# 将大于1MB的对象直接分配在老年代
java -XX:PretenureSizeThreshold=1m -jar your-application.jar

7. Java对象的创建过程?

答:

  1. 类加载检查
    • 如果类没有被加载、连接和初始化,JVM会先进行类加载。这包括以下步骤:
      • 加载:通过类加载器读取类文件,并将类的字节码加载到内存中。
      • 连接:包括验证、准备和解析三个阶段。验证类文件的正确性,准备类的静态变量并分配内存,解析符号引用为直接引用。
      • 初始化:执行类的静态初始化块和静态变量的初始化。
  2. 内存分配
    • JVM在堆中为新对象分配内存。分配的内存大小由对象的结构决定,包括对象头和实例数据。
    • JVM有两种主要的内存分配方式:
      • 指针碰撞(Bump-the-pointer):如果堆内存是规整的,分配指针只需向空闲内存区域移动指定大小的距离。
      • 空闲列表(Free List):如果堆内存是非规整的,JVM需要维护一个空闲列表,分配内存时从空闲列表中找到合适的块。
  3. 初始化零值
    • JVM会将对象的所有实例变量初始化为默认值。例如,数值类型变量会被初始化为0,布尔类型变量初始化为false,引用类型变量初始化为null。
  4. 设置对象头
    • 在对象的内存空间中设置对象头信息,这包括对象的哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等。
  5. 构造方法初始化
    • 调用对象的构造函数来完成对象的初始化工作。这包括执行实例变量的显式初始化操作以及构造方法体中的代码。具体步骤如下:
      • 执行类的实例初始化块。
      • 按照继承层次从上到下执行父类的构造方法。
      • 初始化实例变量为显式指定的值。
      • 执行类的构造方法的主体部分。
/**
 * 创建对象的示例代码
 */
public class MyClass {
    private int value;

    public MyClass(int value) {
        this.value = value;
    }

    public static void main(String[] args) {
        MyClass obj = new MyClass(10);
    }
}
  • 上面代码示例的执行过程如下:
    • 类加载:JVM检查 MyClass 是否已加载。如果未加载,则加载 MyClass 类。
    • 内存分配:在堆中为 MyClass 的新实例分配内存。
    • 内存初始化:将分配的内存初始化为默认值。
    • 设置对象头:在对象头中设置元数据。
    • 构造方法初始化:执行 MyClass 的构造方法,初始化实例变量 value 为 10。

参考资料

  • JavaGuide
  • 牛客网-Java面试宝典
  • Java虚拟机底层原理总结
  • ChatGPT

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

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

相关文章

vue详解

目录 ​编辑 常用指令 v-for v-bind v-if & v-show v-if v-show v-on v-model Vue生命周期 ​编辑 Axios Axios使用步骤 Axios-请求方式别名 Vue简单案例 常用指令 指令:HTML标签上带有 v-前缀的特殊属性&#xff0c;不同的指令具有不同的含义&#xff0c;可…

股票数据分析(K线图、均值图、MACD图、RSI图)--股票日数据

数据 数据是上证指数日行情数据&#xff0c;股票代码000002.sz&#xff0c;原始数据shdata示例如下&#xff1a; 读取数据&#xff1a; import numpy as np import pandas as pd import mplfinance as mpf import matplotlib.pyplot as plt from datetime import datetime imp…

三、mysql-万字长文读懂mysql

mysql 三、 Mysql3.1 基础3.1.1 mysql执行流程-组成架构3.2 索引3.2.1 索引底层的数据结构与算法分类在创建表时,InnoDB 存储引擎会根据不同的场景选择不同的列作为索引B+树结构3.2.2 为什么 MySQL InnoDB 选择 B+tree 作为索引的数据结构3.2.2.1. 从磁盘角度出发3.2.2.2. 数据…

全志A527 T527 设置左右分屏修改为单屏幕,应用分屏改为单屏

1.前言 android13中,A527的系统设置变成,左边是一级菜单,右侧是二级菜单, 这样跟我们以前android7/8/9的布局是不一样的,我们需要将它修改为一级菜单,点进去才是二级菜单这种。 效果如下 2.系统设置实现分析 它这里使用的是google新出的embedding activity, 相关的知…

MHA Master High Availability

一、MHA工作原理和架构 MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件&#xff08;binlog events&#xff09;识别含有最新更新的slave应用差异的中继日志&#xff08;relay log&#xff09;到其他的sla…

celery执行任务报错ValueError: not enough values to unpack

背景 在做用户注册模块的时候需要对手机号验证的过程进行优化&#xff0c;目前想到的方式是通过celeryrabbitmq的方式进行异步处理&#xff0c;选择使用celery是因为使用方便、性能好、可分布式部署。 环境信息 目前使用地win11容器化启动 rabbitmq:3.13.2 python:3.6.8 cel…

21. Java AQS 原理

1. 前言 本节内容主要是对 AQS 原理的讲解&#xff0c;之所以需要了解 AQS 原理&#xff0c;是因为后续讲解的 ReentrantLock 是基于 AQS 原理的。本节内容相较于其他小节难度上会大一些&#xff0c;基础薄弱的学习者可以选择性学习本节内容或者跳过本节内容。 了解什么是 AQ…

【目录】阅读须知!全博文、专栏大纲

首先要和大家说一下&#xff0c;博主的文章并不是想到哪里写到哪里&#xff0c;而是以整个大后端为主题&#xff0c;成体系的在写专栏&#xff0c;从和后端紧相关的计算机核心课程开始、到JAVA SE、JAVA EE、到数据库、MQ等各类中间件、再到业务场景、性能优化。当然也会涉及一…

Git秘籍大公开:从基础概念到高级技巧的全面解析

文章目录 前言一、Git基础介绍1. 作用2. 为什么要进行源代码管理?3. Git的诞生4. Git管理源代码特点5. Git操作流程图解 二、工作区暂存区和仓库区介绍1. 工作区2. 暂存区3. 仓库区 三、Git单人本地仓库操作1. 安装git2. 查看git安装结果3. 创建项目4. 创建本地仓库5. 配置个人…

鸿蒙系统:未来智能生态的引领者

在当今这个日新月异的互联网领域&#xff0c;操作系统作为连接硬件与软件的桥梁&#xff0c;其重要性不言而喻。随着华为鸿蒙系统&#xff08;HarmonyOS&#xff09;的崛起&#xff0c;一场关于操作系统未来的讨论再次被推向高潮。 鸿蒙OS&#xff0c;华为的全新力作&#xff…

字节码编程javassist之打印方法耗时和入参

写在前面 本文看下如何实现打印方法耗时和入参。 1&#xff1a;程序 需要增强的类&#xff1a; public class ApiTest1 {public Integer strToInt(String str01, String str02) {return Integer.parseInt(str01);}}插桩类 package com.dahuyou.javassist.huohuo.aa;import…

【数据结构】线性表----栈详解

栈 栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它具有**后进先出&#xff08;Last In, First Out, LIFO&#xff09;**的特点。栈的运作类似于物理世界中的叠盘子&#xff1a;最新放上去的盘子最先被拿走&#xff0c;而最底部的盘子最后才能被取出。 如…

C语言学习记录Day2

for循环 for&#xff08;表达式1&#xff1b;表达式2&#xff1b;表达式3&#xff09; 循环语句&#xff1b; 注&#xff1a;表达式1&#xff1a;初始化部分.表达式2&#xff1a;条件判断部分 表达式3&#xff1a;调整部分 不可再for循环体内修改循环变量&#xff0c;防止f…

【5G VoNR】VoNR流程简述

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

支持向量机 (support vector machine,SVM)

支持向量机 &#xff08;support vector machine&#xff0c;SVM&#xff09; flyfish 支持向量机是一种用于分类和回归的机器学习模型。在分类任务中&#xff0c;SVM试图找到一个最佳的分隔超平面&#xff0c;使得不同类别的数据点在空间中被尽可能宽的间隔分开。 超平面方…

const 修饰不同内容区分

1.修饰局部变量 const int a 1;int const a 1; 这两种是一样的 注意&#xff1a; const int b; 该情况下编译器会报错&#xff1a;常量变量"b”需要初始值设定项 将一个变量没有赋初始值直接const修饰后&#xff0c;在以后时无法更改内容的。 2.修饰常量字符串 a.…

Python前沿技术:机器学习与人工智能

Python前沿技术&#xff1a;机器学习与人工智能 一、引言 随着科技的飞速发展&#xff0c;机器学习和人工智能&#xff08;AI&#xff09;已经成为了计算机科学领域的热门话题。Python作为一门易学易用且功能强大的编程语言&#xff0c;已经成为了这两个领域的首选语言之一。本…

U盘管理软件有哪些?3款好用的软件亲测有效!

在数字化办公与数据交换日益频繁的今天&#xff0c;U盘作为便携的存储设备&#xff0c;其重要性不言而喻。 然而&#xff0c;U盘的使用也带来了数据泄露、病毒感染等安全隐患。为了有效管理U盘&#xff0c;确保数据安全与合规性&#xff0c;市场上涌现出了众多U盘管理软件。 小…

电脑选购全解析!你需要知道的一切!

在选择电脑类型时&#xff0c;你可以考虑以下因素&#xff1a; 你的主要用途是什么&#xff1f; 你是否需要携带电脑&#xff1f; 你的预算是多少&#xff1f; 你对性能和图形要求有多高&#xff1f; 你是否需要特定的软硬件功能&#xff1f;根据这些因素&#xff0c;你可以…

生成式人工智能:开发者的得力助手还是职业威胁?

在过去的几年里&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在软件开发领域引发了广泛关注。AI工具在代码生成、错误检测、自动化测试等方面的应用&#xff0c;正在迅速改变开发者的工作方式。AI究竟是在帮助开发者提高效率&#xff0c;还是在逐渐取代他们&#xf…