备战秋招008(20230713)

news2024/11/23 4:17:00

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、关于问题的答案
    • 1.集合
    • 2.JUC
          • 02、底层原理
          • 03、内存泄漏
  • 总结


前言

提示:这里为每天自己的学习内容心情总结;

Learn By Doing,Now or Never,Writing is organized thinking.

目前的想法是,根据 Java Guide 和 JavaLearning 和 小林coding进行第一轮复习,之后根据 Tiger 和 CS-Notes 进行最后的重点复习。

先多,后少。


提示:以下是本篇文章正文内容

一、今天学习了什么?

  • 复习集合;
  • JUC;

二、关于问题的答案

1.集合

Q:集合的框架,你能说一下你对集合的了解吗?

单列集合(Collection):

  • List、链表有序且可重复;
  • Set、无序不可重复;
  • Queue;队列,FIFO;

双列集合(Map),键值对。

Q:ArrayList 介绍一下?

底层是一个数组,默认容量10,每次扩容变为原来的 1.5 倍,是懒惰初始化的,只有当新增第一个元素的时候,才会真正的初始化。

线程不安全的,新加入元素之前,需要判断数组容量大小是否需要扩容,再去添加元素到集合中。

Q:LinkedList 介绍一下?

底层是Node的双向链表。

Q:HashMap?

底层是 数组+链表/红黑树,默认数组大小16,每次扩容变为原来的2倍,数组的大小始终是2的幂次方。

当链表的长度大于等于8且数组大于64,才会树化,当红黑树的节点个数小于等于6时,红黑树会转化为链表。

2.JUC

今天看了一下 JUC 的 ThreadLocal 的视频:

大厂面试题:

  • ThreadLocalThreadLocalMap 的数据结构和关系?
  • ThreadLocalkey 是弱引用,这是为什么?
  • ThreadLocal 内存泄漏问题你知道吗?
  • ThreadLocal 最后为什么要加入 remove() 方法呢?

ThreadLocal 是什么?

ThreadLocal 提供线程局部变量,每个线程访问 ThreadLocal 实例的时候都有自己的、独立初始化的变量副本(自己用自己的变量,不和其他线程共享),可以让每个线程存储私有数据,从而在某种程度上避免了线程安全的问题。


02、底层原理

Thread 中包含 ThreadLocal ,而 ThreadLocal 类中有一个内部类 ThreadLocalMap

public class Thread implements Runnable {
    //与此线程有关的ThreadLocal值。由ThreadLocal类维护
    ThreadLocal.ThreadLocalMap threadLocals = null;

    //与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
}

当每 new 一个线程的时候,该线程就会有 ThreadLocal.ThreadLocalMap 这个属性。

public class ThreadLocal<T> {
    static class ThreadLocalMap {}
}    

ThreadLocal 的「底层实现原理」是基于 ThreadLocalMap 实现的,当调用 ThreadLocalget()set() 方法,其实调用的是 ThreadLocalMapget()set() 方法。

  • set() :首先获取当前线程,然后取出 Thread 类中静态内部类 ThreadLocalMap ,将线程实例为key,需要存储到线程的变量为value,作为键值对,存储到 ThreadLocalMap 中;
  • get() :在 ThreadLocalMap 中获取当前线程实例存储到 ThreadLocalMap 中存储的数据;

ThreadLocal 对象并不负责保存数据,它只是一个访问入口

public void set(T value) {
    // 获取当前请求的线程
    Thread t = Thread.currentThread();
    // 取出 Thread 类内部的 threadLocals 变量(哈希表结构)
    ThreadLocalMap map = getMap(t);
    if (map != null)
        // 将需要存储的值放入到这个哈希表中
        map.set(this, value);
    else
        createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}

ThreadLocalMap 的「底层数据结构」是,Entry 数组,一个以 ThreadLocal 实例为 key ,任意对象为 valueEntry 对象。

static class ThreadLocalMap {

    // 键值对
    static class Entry extends WeakReference<ThreadLocal<?>> {
        /** The value associated with this ThreadLocal. */
        Object value;

        Entry(ThreadLocal<?> k, Object v) {
            super(k);
            value = v;
        }
    }

    private static final int INITIAL_CAPACITY = 16;

    private Entry[] table;
}    

ThreadLocal 数据结构


03、内存泄漏

「内存泄漏」 是指,不会再被使用的对象或者变量占用内存,不能回收。

ThreadLocalMap 中,Entry 对象中的 key 是被 WeakReference 修饰的,使用弱引用,但是 value 是强引用。这个样子设计的目的是,避免内存泄漏。

根据 JVM 垃圾回收时的可达性分析,一直存在 Thread -> ThreadLocalMap -> Entry 的引用链路,如下:

img

ThreadLocalMap 根据 key 是否为 null 来判断是否清理 Entry,如果 key 不被设置成为 WeakReference 类型,是强引用的话,就一直不会被 GC 回收,key 就永远不为 null,那么 Entry 元素就不会被清理。

被弱引用着的对象,无论当前内存是否充足,只要发生垃圾回收都会被回收掉。

ThreadLocal 的设计者认为只要 ThreadLocal 所在的作用域结束了工作被清理了,GC 回收的时候就会把 key 引用对象回收,key 置为 null,ThreadLocal 会尽力保证 Entry 清理掉来最大可能避免内存泄露。

如果 ThreadLocal 一直有强引用应该怎么办,是不是有内存泄露的风险?

最佳实践是用完 ThreadLocal 对象时手动调用 remove 函数。

必须使用 remove() 回收自定义的 ThreadLocal 变量,尤其是在线程池场景下,线程经常会被复用,如果不清理自定义的 ThreadLocal 变量,可能会影响后续业务逻辑和造成内存泄漏等问题,尽量在代码中使用使用 try-finally 代码块进行回收。


总结

提示:这里对文章进行总结:

学习进度需要加快。

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

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

相关文章

python - leetcode - 64. 最小路径和【经典题解 - 矩阵数组动态规划】

一. 题目&#xff1a;64. 最小路径和 描述&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#…

【SpringBoot3】--02.Web开发

文章目录 SpringBoot3-Web开发0.WebMvcAutoConfiguration原理1.生效条件2.效果3.WebMvcConfigurer接口4. 静态资源规则源码5. EnableWebMvcConfiguration 源码6. 为什么容器中放一个WebMvcConfigurer就能配置底层行为7. WebMvcConfigurationSupport 1.Web场景1.1自动配置1.2默认…

51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)

文章目录 前言一、串行通信口的功能以及串行通信口的结构及原理1.1 串行通信口的功能1.2 51单片机串口的结构 二、串行通信口的控制寄存器2.1 串行控制寄存器SCON2.2 电源控制寄存器PCON2.3 配置寄存器配置SCON寄存器配置PCON寄存器配置中断 2.4 实验单片机向pc发送数据PC向单片…

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;58&#xff09;-- 算法导论6.4 2题 二、试分析在使用下列循环不变量时&#xff0c;HEAPSORT 的正确性&#xff1a;在算法的第 2~5行 for 循环每次迭代开始时&#xff0c;子数组 A[1…i]是一个包含了数组A[1…n]中第i小元素的最大…

[疑难杂症2023-005]dcmtk-movescu访问dcm4chee模拟PACS Server报错问题解析

本文由Markdown语法编辑器编辑完成。 1. 背景 由于要在医院上线一个服务&#xff0c;用来定时从医院的PACS Server上面拉取dicom图像并进行分发。因此&#xff0c;需要首先在公司的内网环境上进行开发&#xff0c;测试和验证。 目前比较流行和开源的PACS Server模拟是基于dc…

python 面向对象编程(2)

文章目录 前言封装多态类属性和实例属性定义以及访问类属性修改类属性实例属性 类方法静态方法 前言 前面我们介绍了 python 类和对象以及继承、私有权限&#xff0c;那么今天我们将来介绍 python面向对象 剩下的两大特性封装、多态&#xff0c;以及如何访问、修改类属性、类方…

机器学习李宏毅学习笔记37

文章目录 前言一、ChatGPT做的事情二、ChatGPT基础介绍三、ChatGPT带来的研究问题总结 前言 ChatGPT简单原理介绍 一、ChatGPT做的事情 Chatgpt以句子为输入&#xff0c;输出这个句子后面接的词汇的概率分布&#xff0c;给每一个可能的符号一个概率&#xff0c;根据这个分布进…

【雕爷学编程】Arduino动手做(160)---HLK-V20离线语音模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

RabbitMQ知识掌握 【进阶篇】

一、如何保证消息的可靠性 &#x1f349; 1.保证消息的可靠性投递 &#x1f95d; 在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0…

微信小程序活动抽奖简单实现,包教包会

问题&#xff1a; 针对用户使用活动抽奖&#xff0c;获得抽奖得到商品的成就以及满足感&#xff0c;那么我们应该怎么去实现小程序去转盘抽奖活动呢 例如&#xff1a;项目需要抽奖实现相应的奖品奖励 实现方法 实现的效果如下&#xff1a; 实现的主要代码&#xff1a; Page…

ANSYS Workbench项目分析与案例实操详解

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言准备工作创建项目导…

盘点5款Cesium三维GIS渲染引擎

目前&#xff0c;以Cesium为核心的各类产品繁多&#xff0c;本文将挑选一些以Cesium为核心的软件案例&#xff0c;为大家进行介绍。 1. CesiumJS CesiumJS相信凡是GIS行业相关人员都特别熟悉了&#xff0c;CesiumJS是一款开源的JavaScript库&#xff0c;用于创建高性能的地球…

以太网(Ethernet)入门了解

以太网&#xff08;Ethernet&#xff09;是一种常见的局域网&#xff08;LAN&#xff09;通信协议&#xff0c;它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议&#xff0c;它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

如何做到有效的项目质量管理?这三点很关键

“项目管理中&#xff0c;大家都遇到过的哪些绊脚石&#xff1f;” 近期看到了这样一个话题&#xff0c;大家纷纷吐槽了在项目中遇到的各种困难。除了常见的范围无限蔓延、进度不停延误、成本严重超支、内部沟通困难等一系列问题&#xff1b;其中提到次数较多的还有项目的质量…

QOwnNotes Mac版-QOwnNotes for Mac(事务笔记管理)

QOwnNotes for Mac是一款Mac平台上的笔记记录和待办事项软件&#xff0c;可以将你的笔记保存为纯文本文件&#xff0c;它支持 MarkDown 支持&#xff0c;并与 ownCloud 云服务紧密集成。 QOwnNotes 的亮点就是它集成了 ownCloud 云服务&#xff08;当然是可选的&#xff09;。…

JavaWeb 速通XML

目录 一、XML快速入门 1.基本介绍 : 2.入门案例 : 二、XML语法 0.文件结构 : 1.文档声明 &#xff1a; 2. 元素 : 3.属性 : 4.注释 : 5.CDATA节 : PS : XML转义符 : 三、Dom4j 1.关于XML解析技术 : 2 Dom4j介绍 : 3.Dom4j使用 : 1 获取Document对象的三种方式 2 …

ROS:Gazebo详解

目录 一、前言二、URDF与Gazebo基本集成流程2.1创建功能包2.2编写URDF文件2.3启动Gazebo并显示模型 三、URDF集成Gazebo相关设置3.1collision3.2inertial3.3颜色设置 四、URDF集成Gazebo实操4.1需求4.2流程4.3编写封装惯性矩阵算法的 xacro 文件4.4底盘 Xacro 文件4.5摄像头 Xa…

5个值得收藏字体网站,优秀字体不用再找

如何在大量的字体网站中选择安全可靠的字体呢&#xff1f;这里本文收集整理了5个好用的字体网站&#xff0c;一起来看看吧&#xff01; 1、即时设计 对于设计师来说&#xff0c;一个好的字体网站要具备两个基本要素:美观和免费。如果你对字体有同样的要求&#xff0c;那么即时…

给测试开发工程师的5条建议——你一定要知道

目录 前言 质量心态 获取其他测试领域的知识 探索性测试 数据测试 可视化测试 可访问性测试 安全测试 混沌测试 获得正确的帮助 自动化不仅仅是执行测试脚本 分享也是学习的一种途径 最后 前言 近些年可以看出测试开发工程师是热度比较高的测试职位&#xff0c;除…

【深度学习】多任务学习

多任务学习是一个很火的话题&#xff0c;在自动驾驶领域以及其他对存储资源要求较高的端侧任务&#xff0c;都会考虑这种方式。之前面试的时候也有被问题多任务学习。前几天看到一个写得很好的例子&#xff0c;在此记录一下&#xff0c;也好久没有写博客了。 1.参考 论文是20…