jvm内存模型,类加载机制,GC算法,垃圾回收器,jvm线上调优等常见的面试题及答案

news2025/3/4 5:21:52

JVM内存模型

  • JVM内存模型包括哪些区域
    • 答案:JVM内存模型主要包括以下区域:
      • 程序计数器:是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节码指令的地址。
      • Java虚拟机栈:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
      • 本地方法栈:与Java虚拟机栈类似,不过它是为Native方法服务的。
      • Java堆:是JVM所管理的内存中最大的一块,是被所有线程共享的一块内存区域,几乎所有的对象实例以及数组都在这里分配内存。
      • 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在Java 8及之后版本中,永久代被移除,取而代之的是元空间,元空间并不在堆内存中,而是使用本地内存。
  • 堆内存的结构是怎样的
    • 答案:堆内存分为年轻代和老年代,年轻代又分为Eden空间和两个Survivor空间(一般称为Survivor from和Survivor to)。新创建的对象一般会先分配到Eden区,当Eden区满了之后,会触发Minor GC,存活下来的对象会被移动到Survivor区。在Survivor区经过多次GC后仍然存活的对象,会被移动到老年代。老年代主要存放生命周期较长的对象。

类加载机制

  • 什么是类加载
    • 答案:类加载是指将Java类的字节码文件(.class文件)转换成内存中运行时数据结构(如java.lang.Class对象)的过程。这个过程由Java虚拟机的类加载器完成,是Java动态性的基础。
  • 类加载的时机有哪些
    • 答案:Java虚拟机采用惰性加载策略,类会在以下几种情况下被加载:
      • 创建类的实例,通过new关键字或反射机制。
      • 访问类的静态变量或静态方法,注意是主动访问。
      • 反射调用,如通过Class.forName()等方法显式加载类。
      • 初始化类的子类,此时父类也会被加载(若尚未加载)。
      • JVM启动时指定的主类,即包含main方法的类。

GC算法

  • GC有哪些常见的判定对象可回收的方法
    • 答案
      • 引用计数法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1,当计数器为0时,就认为这个对象可以被回收。但这种方法存在循环引用的问题,导致对象无法被回收。
      • 可达性分析算法:通过一系列的“GC Roots”对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,即可以被回收。
  • GC的三种收集方法及其原理与特点
    • 答案
      • 标记-清除算法:分为标记和清除两个阶段。首先标记出所有需要回收的对象,在标记完成后,统一回收所有被标记的对象。优点是实现简单,缺点是容易产生内存碎片,导致后续大对象无法分配内存。
      • 复制算法:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。优点是不会产生内存碎片,缺点是内存利用率低,只使用了一半的内存。
      • 标记-压缩(标记-整理)算法:标记阶段和标记-清除算法一样,标记出所有需要回收的对象,清除阶段不是直接清理被标记的对象,而是将所有存活的对象向一端移动,然后直接清理掉边界以外的内存。优点是解决了内存碎片问题,同时内存利用率比复制算法高,缺点是移动对象时需要一定的开销。

垃圾回收器

  • 常见的垃圾回收器有哪些
    • 答案:常见的垃圾回收器有Serial、Serial Old、ParNew、Parallel Scavenge、Parallel Old、CMS、G1等。
  • CMS收集器与G1收集器的特点
    • 答案
      • CMS收集器:是一种以获取最短回收停顿时间为目标的收集器。采用“标记-清除”算法,具有并发收集、低停顿的特点,但是会产生内存碎片,并且对CPU资源非常敏感,在并发阶段会和用户线程抢占CPU资源。
      • G1收集器:是一种面向堆内存任何部分进行回收的收集器,将堆内存划分为多个大小相等的独立区域(Region),可以预测停顿时间,兼具高吞吐量和低延迟的特点,采用“标记-整理”算法,不会产生内存碎片,能更好地处理大对象和巨型对象。

JVM线上调优

  • 什么情况下需要进行JVM调优
    • 答案:出现以下情况时通常需要进行JVM调优:
      • Heap内存(老年代)持续上涨达到设置的最大内存值。
      • Full GC次数频繁。
      • GC停顿(Stop The World)时间过长(超过1秒,具体值按应用场景而定)。
      • 应用出现OutOfMemory等内存异常。
      • 应用中有使用本地缓存且占用大量内存空间。
      • 系统吞吐量与响应性能不高或下降。
      • 应用的CPU占用过高不下或内存占用过高不下。
  • JVM调优时关注哪些指标
    • 答案
      • 吞吐量:用户代码时间/(用户代码执行时间+垃圾回收时间),吞吐量越高算法越好。
      • 低延迟:STW越短,响应时间越好,暂停时间越短算法越好。
      • Minor GC尽可能多的收集垃圾对象:遵守这一原则可以降低应用程序Full GC的发生频率,因为Full GC较耗时,可能会影响应用程序的延迟要求或吞吐量。

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

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

相关文章

[Windows] 免费电脑控制手机软件 极限投屏_正式版_3.0.1 (QtScrcpy作者开发)

[Windows] 极限投屏_正式版 链接:https://pan.xunlei.com/s/VOKJf8Z1u5z-cHcTsRpSd89tA1?pwdu5ub# 新增功能(Future): 支持安卓14(Supports Android 14)提高投屏成功率(Improve the success rate of mirror)加快投屏速度(Accelerate screen mirrorin…

C++初阶—list类

第一章:list的介绍及使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指…

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器:Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…

入门基础项目(SpringBoot+Vue)

文章目录 1. css布局相关2. JS3. Vue 脚手架搭建4. ElementUI4.1 引入ElementUI4.2 首页4.2.1 整体框架4.2.2 Aside-logo4.2.3 Aside-菜单4.2.4 Header-左侧4.2.5 Header-右侧4.2.6 iconfont 自定义图标4.2.7 完整代码 4.3 封装前后端交互工具 axios4.3.1 安装 axios4.3.2 /src…

车载以太网-基于linux的ICMP协议

对于车载以太网-ICMP的技术要求: /** ICMP报文格式解析* -----------------* ICMP协议用于网络诊断和错误报告,常见应用包括Ping测试。* ICMP报文结构包括:IP头部、ICMP头部和ICMP数据部分。* 下面详细介绍每个部分的结构、字段的作用以及如何解析它们。* * ICMP头部结构:*…

虚拟机快照与linux的目录结构

虚拟机快照是对虚拟机某一时刻状态的完整捕获,包括内存、磁盘、配置及虚拟硬件状态等,保存为独立文件。 其作用主要有数据备份恢复、方便系统测试实验、用于灾难恢复以及数据对比分析。具有快速创建和恢复、占用空间小、可多个快照并存的特点。在管理维…

Unity小功能实现:鼠标点击移动物体

1、功能描述 当玩家点击鼠标时,场景中的物体会移动到鼠标点击的位置。这个功能可以用于控制角色移动、放置物体等场景。 2、实现步骤 创建Unity项目:首先,打开Unity并创建一个新的3D项目。 添加3D物体:在场景中创建一个3D物体&am…

算法题笔记(自用)——Python

目录 一. 进制&位运算&ASCAII 二. format格式化输出 1. 基本用法 2. 位置参数 3. 格式化数字 4. 对齐和填充 5. 格式化二进制、八进制、十六进制 6. 格式化百分比 7. 格式化科学计数法 8. 格式化字符串字面量(f-string) 三. 字符串 使…

爬虫系列之【数据解析之JSON】《三》

目录 前置知识 一、 json.loads():JSON 转 Python 数据 二、json.dump():python数据 转 json 并写入文件 三、json.loads() :json 转 python数据 四、json.load() :json 转 python数据(在文件操作中更方便&#xf…

了解Java集合的概念和体系:Collection<T>、Collections与Stream的使用

学习目标 本文知识是对集合层级的介绍,应用开发中实际使用的是他们的子级,感兴趣的小伙伴或者想深入了解有关Java集合知识的朋友可以选择阅读! Stream的方法使用使用部分代码块内大多有两种实现方式,是为了更好的理解方法底层的代…

进程优先级和进程切换 ─── linux第12课

目录 Z(zombie)-僵尸进程 僵尸进程危害 孤儿进程 ​编辑 进程优先级 查看系统进程 用top命令更改已存在进程的nice: 其他概念 进程切换 进程如何切换 进程的调度 进程 内核数据结构 代码和数据 创建进程时 ,先创建内核数据结构 再加载代码和数据 进程退…

光速解决phpstudy无法启动MySQL服务

问题描述 在初步安装使用phpstudy时,会出现mysql服务启动失败的情况,具体表现为点击一键启动后,mysql启动又立即停止 原因及解决方法: phpstudy数据库无法启动有以下几个原因,可以看看自己是第几种: 服务名…

txt 转 json 使用python语言

需求: 把如下的txt文档转成json输出 代码 import jsondef txt_to_json(input_file, output_file):data_list []with open(input_file, r, encodingutf-8) as f:for line in f:# 分割数据并去除换行符parts line.strip().split(,)print(f"{parts}")print(type(par…

Cargo, the Rust package manager, is not installed or is not on PATH.

今天在Windows操作系统上通过pip 安装jupyter的时候遇到这个报错,Cargo, the Rust package manager, is not installed or is not on PATH.。 解决办法 官网:https://rustup.rs/# 下载:https://win.rustup.rs/x86_64 安装完成之后&#xff0c…

JavaWeb个人笔记

技术栈 前端 : HTML CSS JavaScript ES6 Nodejs npm vite vue3 router pinia axios element-plus 后端&#xff1a;HTTP xml Tomcat Servlet Request Response Cookie Sesssion Filter Listener MySQL JDBC Druid Jackson lombok jwt . HTML <!DOCTYPE html> 文档声…

http报文的content-type参数和spring mvc传参问题

很早之前博主聊过HTTP的报文结构以及其中和传参相关的重要参数content-type还有spring mvc&#xff0c;以前的三篇文章&#xff1a; HTTP与HTTPS协议详解&#xff1a;基础与安全机制-CSDN博客 详解Http的Content-Type_content-type application-CSDN博客 如何在Spring Boot中…

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …

FPGA开发,使用Deepseek V3还是R1(6):以滤波器为例

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

JVM常用概念之垃圾回收设计与停顿

在我们应用程序运行期间&#xff0c;我们是需要尽可能避免垃圾回收。 图1&#xff1a;不同垃圾回收器的设计&#xff08;黄色代表STW&#xff0c;绿色代表并发&#xff09; 实验 计算机配置 Hardware Overview:Model Name: MacBook ProModel Identifier: MacBookPro14,2Pro…

uniapp-原生android插件开发摘要

uni-app在App侧的原生扩展插件&#xff0c;支持使用java、object-c等原生语言编写&#xff0c;从HBuilderX 3.6起&#xff0c;新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…