【华为OD技术面试真题 - 技术面】- Java面试题(8)

本文汇总了华为OD技术面试中关于Java的热门问题,包括JVM内存模型、垃圾回收机制、Spring容器加载、多线程处理、MyBatis操作、单例模式内存管理、Java 8 Optional的使用、代码质量工具和单元测试框架的应用,以及如何应对内存频繁回收的问题。这些问题涵盖了Java开发的关键知识点,有助于面试者准备技术面试。

华为OD面试真题题库

专栏:华为OD面试真题题库
目录: 最新华为OD面试手撕代码真题目录以及八股文真题目录

封面

1. 请解释一下Java虚拟机(JVM)的内存模型以及垃圾回收(GC)的时机。同时,比较一下年轻代和老年代的垃圾回收的区别,并介绍一下它们的底层实现方式。

Java虚拟机(JVM)的内存模型主要分为堆(Heap)和栈(Stack)两部分。其中,堆用于存储对象实例和数组,而栈用于存储方法调用和局部变量等数据。垃圾回收(GC)是JVM的一项重要功能,用于自动释放不再使用的内存资源。

GC的时机由JVM自动决定,一般在以下情况下触发:

  1. 堆内存不足:当堆内存中的对象数量达到一定阈值时,JVM会启动垃圾回收,回收不再使用的对象,以释放内存空间。

  2. 系统空闲时:当系统空闲时,JVM可以利用这段时间进行垃圾回收。例如,在一些请求量较低的时间段或者系统负载较轻的时候。

年轻代(Young Generation)和老年代(Old Generation)是堆内存的两个部分,它们的垃圾回收有一些区别:

  1. 年轻代的垃圾回收:年轻代主要存放新创建的对象,一般分为Eden区和两个Survivor区。当年轻代的Eden区满时,会触发Minor GC,将存活的对象移动到Survivor区。在多次Minor GC后,仍然存活的对象会被移动到老年代。

  2. 老年代的垃圾回收:老年代主要存放长时间存活的对象。当老年代的空间不足时,会触发Major GC(也称为Full GC),对整个堆进行垃圾回收。Major GC的过程会停止应用程序的执行,因此需要尽量减少Major GC的频率。

底层实现方式方面,不同的JVM厂商可能有不同的实现方式,但一般会采用以下技术:

  1. 标记-清除算法(Mark and Sweep):该算法首先通过根节点(如方法区中的类静态变量、本地变量等)标记所有可达对象,然后清除未被标记的对象。但该算法会产生内存碎片,影响堆内存的连续分配。

  2. 复制算法(Copying):该算法将堆内存划分为两个相等大小的区域,每次只使用其中一个区域。当发生垃圾回收时,将存活的对象复制到另一个区域,然后清除当前区域中的所有对象。这样可以保证内存连续,但会浪费一部分内存空间。

  3. 标记-整理算法(Mark and Compact):该算法在标记可达对象后,将存活的对象向一端移动,然后清除端边界以外的所有对象。这样可以保证内存连续,但需要移动对象,影响性能。

2. Spring容器加载哪些bean以及加载哪些配置文件 。

Spring容器加载的bean包括两部分:配置类(Configuration Class)和组件类(Component Class)。

    ### 华为OD技术面试真实题目及答案 #### 技术常见问题与解答 #### 跨域请求解决方案 在前端开发中,跨域请求问题是常见的挑战之一。以下是几种常用的解决跨域问题的方法: - **CORS(跨源资源共享)** CORS是一种基于HTTP头的机制,允许服务器声明哪些资源可以被其他域名下的页访问。通过设置`Access-Control-Allow-Origin`响应头来指定允许访问该资源的外部域名[^2]。 ```javascript // 浏览器发起跨域请求的例子 fetch('https://api.example.com/data', { method: 'GET', mode: 'cors' }) .then(response => response.json()) .then(data => console.log(data)); ``` #### Java基础知识问答 关于Java的基础知识也是华为OD技术面试中的一个重要部分。下是一些典型的问题及其解答: - **Java堆栈的概念** Java程序运行时会创建两种类型的内存区域:堆和栈。其中,**栈(Stack)**用于存储局部变量、方法参数以及返回地址等短期存在的数据;而**堆(Heap)**则用来保存对象实例和其他动态分配的数据结构。两者的主要区别在于生命周期管理和垃圾回收机制的不同[^3]。 - **线程安全的Map实现类** 在多线程环境中使用的线程安全映射表主要有以下几种: - `ConcurrentHashMap`: 提供高效的并发读写操作支持; - `Hashtable`: 是较早版本中提供的同步化哈希表容器; - `Collections.synchronizedMap()`: 可以将任意Map转换成具有基本同步特性的新Map实例。 - **常用的数据结构** 对于日常工作或算法练习来说,经常接触到的一些重要Java集合框架成员包括但不限于: - List接口下实现了数组列表(`ArrayList`)、链表(`LinkedList`); - Set接口提供了不可重复元素集合的功能, 如HashSet; - Map接口定义了键值对关联关系, 上述提到过的ConcurrentHashMap就是其一种具体形式. - **ArrayList特性** ArrayList内部采用连续空间存储元素,默认情况下按照插入顺序保持稳定排列,因此它是**有序**的序列容器. ```java List<String> list = new ArrayList<>(); list.add("first"); list.add("second"); System.out.println(list); // 输出:[first, second] ```
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    算法大师

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值