当前位置: 首页 > news >正文

【6】阿里面试题整理

[1]. ThreadLocal原理

ThreadLocal提供了一种线程隔离的机制,使得每个线程拥有自己独立的变量副本。

它的底层实现是ThreadLocalMap,以ThreadLocal对象为键,变量副本为值的键值对。

为了避免内存泄漏,ThreadLocalMap的Key使用了弱引用。使用完毕后,需要手动调用remove()方法清理。

[2]. ThreadLocal与线程池一起使用可能发生的问题?

ThreadLocal和线程池一起使用时,主要有两个问题:内存泄漏和数据错乱。

内存泄漏是因为线程池复用线程,导致ThreadLocal变量的副本一直存在于线程的ThreadLocalMap中。

数据错乱是因为线程没有正确重置ThreadLocal变量,导致下一次任务使用到上一次任务遗留下来的值。

[3]. CMS和垃圾回收器G1的区别。

CMS和G1都是旨在减少停顿时间的垃圾回收器,但G1的目标是在减少停顿时间的同时实现高吞吐量。

CMS基于标记-清除算法,容易产生内存碎片,而G1通过分区和复制算法来减少碎片。

CMS适用于对停顿时间敏感,CPU资源充足的应用,而G1适用于大堆内存,对停顿时间有要求的应用。

[4]. JDK自带的两个调优工具是什么?

JDK自带的两个主要的调优工具是JConsoleVisualVM

JConsole是一个图形化的监控和管理工具,可以连接到JVM,实时监控内存使用、线程状态、类加载等信息。

可以用它来观察JVM的运行状况,比如内存是否溢出,线程是否存在死锁。

VisualVM是一个功能更强大的工具,不仅包含了JConsole的所有功能,还提供了性能分析器,可以分析CPU和内存的使用情况,帮助定位性能瓶颈。

此外,VisualVM还可以分析线程堆栈和堆转储文件,帮助诊断线程问题和内存泄漏。

[5]. 分布式缓存项目如何进行磁盘持久化的?

分布式缓存常见的持久化方案:

全量快照:定期将整个缓存数据集完整地保存到磁盘文件。优点是简单,恢复速度快。缺点是占用大量磁盘空间和I/O资源,快照期间可能影响性能。适用于数据量较小,对数据丢失不敏感的场景。

增量日志:将每次写操作都记录到日志文件中。优点是可以实现更细粒度的持久化,对性能影响较小。缺点是恢复速度较慢,日志文件会不断增长。适用于对数据一致性要求较高,写操作频繁的场景。

混合持久化:结合全量快照和增量日志的优点。定期进行全量快照,同时记录增量日志。在缓存服务重启后,先加载快照,然后重放快照之后的日志。优点是既能保证恢复速度,又能降低数据丢失的风险。

[6]. JVM内存模型中堆区的结构?

JVM内存模型主要包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。

堆是JVM管理的最大的一块内存区域,所有线程共享。它的结构主要分为新生代和老年代两个部分。

新生代又分为Eden区和两个大小相等的幸存者区(Survivor 0和Survivor 1)。新创建的对象通常分配在Eden区,经过Minor GC后仍然存活的对象会进入幸存者区。

老年代用于存放经过多次Minor GC仍然存活,并且年龄达到一定阈值的对象。

[7]. ZGC是哪个版本出现的?

ZGC最初是在JDK 11中以实验特性引入的,并在后续版本中不断改进和完善。
从JDK 15开始,ZGC已经从实验状态转为正式可用。

[8]. G1为什么要给Region设置分代?

主要原因有以下几点:

提高垃圾回收效率:分代垃圾回收基于“弱分代假设”和“强分代假设”,认为大部分对象都是朝生夕灭的。因此,G1可以优先回收年轻代Region,因为年轻代Region通常包含大量的垃圾对象,回收成本较低。

优化GC停顿时间:G1的目标是可预测的停顿时间。通过优先回收年轻代Region,G1可以快速释放内存,降低GC停顿时间,保证应用的流畅运行。

提升空间利用率:通过分代,能更快的清理掉死亡对象,从而释放空间,提升空间利用率。

[9]. Redis的AOF和RDB的优缺点?应用场景?

Redis提供了两种持久化机制:RDB和AOF。

RDB是通过快照的方式将内存中的数据保存到磁盘上,AOF是通过追加写命令的方式将每个写命令保存到磁盘上。

RDB的优点是文件紧凑、恢复速度快、对性能影响小,缺点是存在数据丢失的风险。AOF的优点是数据安全性高、可读性强、支持损坏修复,缺点是文件体积大、恢复速度慢、对性能有一定影响。

RDB适合用于数据备份、灾难恢复和大规模数据恢复等场景,例如,定期备份Redis数据到云存储上。AOF适合用于数据安全性要求高的场景,例如,金融系统的缓存层,需要保证数据的完整性和可靠性。

[10]. 如何理解Spring IoC?

IoC,即控制反转,是一种设计思想,它将对象之间的依赖关系的控制权从对象自身转移到外部容器。以前是由对象自己负责创建依赖对象,现在是由IoC容器负责创建和管理这些对象,并将它们注入到需要的对象中。

Spring通过依赖注入来实现IoC,常用的依赖注入方式有构造器注入和Setter方法注入。可以使用XML配置文件或注解来声明Bean之间的依赖关系,然后由Spring IoC容器负责创建和管理Bean的实例。

[11]. InnoDB和MyISAM之间的区别?

事务支持:InnoDB支持事务,提供ACID事务特性,可以保证数据的一致性。而MyISAM不支持事务。

锁机制:InnoDB支持行级锁,可以并发地对不同的行进行操作,提高并发性能。而MyISAM只支持表级锁,并发性能较差。

外键约束:InnoDB支持外键约束,可以定义表之间的关系,保证数据的完整性。而MyISAM不支持外键约束。

[12]. 手撕算法题:leetcode129. 求根到叶子节点数字之和

class Solution {
    public int sumNumbers(TreeNode root) {
        return dfs(root,0);
    }

    public int dfs(TreeNode root, int prevSum){
        // 如果当前节点为空,返回0
        if(root==null){
            return 0;
        }
        // 计算当前路径的和
        int sum = prevSum*10 + root.val;
        // 如果当前节点是叶子节点,返回当前路径的和
        if(root.left==null && root.right==null){
            return sum;
        } else {
            // 递归遍历左子树和右子树,并将当前路径的和传递给子树
            return dfs(root.left, sum) + dfs(root.right, sum);
        }
    }

}

[13]. 手撕:leetcode230.二叉搜索树中第K小的元素

public class KthSmallestBST{

    private int count = 0;
    private int result = -1; // 默认值,表示没找到

    public int kthSmallest(TreeNode root, int k){
        inorderTraversal(root, k);
        return result;
    }

    private void inorderTraversal(TreeNode root, int k){
        if (root == null){
            return;
        }

        inorderTraversal(root.left, k); // 先遍历左子树

        count++;  // 访问当前节点,计数器加一

        if (count == k){
            result = root.val; // 找到第 k 个元素
            return; // 提前结束,避免不必要的遍历
        }

        inorderTraversal(root.right, k); // 再遍历右子树
    }

}

相关文章:

  • 嵌入式知识点总结 网络编程 专题提升(一)-TCP/UDP
  • 快速上手——.net封装使用DeekSeek-V3 模型
  • 二十八、vue项目预览pdf文档示例
  • 算法与数据结构(多数元素)
  • 数据可视化+SpringBoot+协同过滤推荐算法的美食点餐管理平台
  • 消息队列之-springcloud-mq-stream 学习
  • 开发基础(8):鸿蒙图表开发
  • C++之线程池(Thread Pool)
  • 数智化时代的工单管理:从流程驱动到数据驱动-亿发
  • 【测试开发】Python+Django实现接口测试工具
  • DeepSeek自动批量写作的AI软件
  • WIN11上使用GraalVM打包springboot3项目为本地可执行文件exe
  • 笔试-士兵过河
  • android 的抓包工具
  • Vue 入门到实战 十
  • 【算法】【位运算】acwing算法基础 801. 二进制中1的个数
  • 计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
  • 开启AI绘画的魔法大门!探索Stable Diffusion的无限魅力~
  • Python学习笔记 ver1.0
  • vue3 ref/reactive 修改数组的方法
  • 浙能集团原董事长童亚辉被查,还是杭州市书法家协会主席
  • 2025年中国网络文明大会将于6月10日在安徽合肥举办
  • 国台办:实现祖国完全统一是大势所趋、大义所在、民心所向
  • 生态环境保护督察工作条例对督察对象和内容作了哪些规定?有关负责人答问
  • 农林生物安全全国重点实验室启动建设,聚焦重大有害生物防控等
  • 贵州省总工会正厅级副主席梁伟被查,曾任贵州省纪委副书记