![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java面试题
文章平均质量分 86
面试题
踏遍三十六岸
万般皆是命 半点不由人……
展开
-
常见 JVM 面试题补充
JVM 采用的是可达性分析算法。JVM 是通过 GC Roots 来判定对象存活的,从 GC Roots 向下追溯、搜索,会产生一个叫做 Reference Chain 的链条。当一个对象不能和任何一个 GC Root 产生关系时,就判定为垃圾,如下图所示。Java 线程中,当前所有正在被调用的方法的引用类型参数、局部变量、临时值等。也就是与我们栈帧相关的各种引用。所有当前被加载的 Java 类。Java 类的引用类型静态变量。原创 2024-05-22 19:59:52 · 945 阅读 · 0 评论 -
线程池的种类,区别和使用场景
java.util.concurrent.Executors 类中有很多线程池。原创 2024-05-19 20:15:10 · 695 阅读 · 0 评论 -
介绍一下 ThreadLocal
如果不为null,则尝试获取threadLocals中TL1所在的键值对,如果该键值对为null,则向threadLocals中通过set方法插入<TL1,null>,最后返回nul,如果键值对不为null,则返回键值对中的值。ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。Thread类下 有两个。原创 2024-05-18 20:30:30 · 264 阅读 · 0 评论 -
内存泄漏——为何每次用完 ThreadLocal 都要调用 remove()?
内存泄漏指的是,当某一个对象不再有用的时候,占用的内存却不能被回收,这就叫作内存泄漏。因为通常情况下,如果一个对象不再有用,那么我们的垃圾回收器 GC,就应该把这部分内存给清理掉。这样的话,就可以让这部分内存后续重新分配到其他的地方去使用;否则,如果对象没有用,但一直不能被回收,这样的垃圾对象如果积累的越来越多,则会导致我们可用的内存越来越少,最后发生内存不够用的 OOM 错误。下面我们来分析一下,在 ThreadLocal 中这样的内存泄漏是如何发生的。原创 2024-05-18 20:10:42 · 1239 阅读 · 0 评论 -
Java中的ThreadLocal
ThreadLocal是JDK1.2开始就提供的一个用来存储线程本地变量的类。ThreadLocal中的变量是在每个线程中独立存在的,当多个线程访问ThreadLocal中的变量的时候,其实都是访问的自己当前线程的内存中的变量,从而保证的变量的线程安全。我们一般在使用ThreadLocal的时候都是为了解决线程中存在的变量竞争问题。其实解决这类问题,通常大家也会想到使用synchronized来加锁解决。例如在解决SimpleDateFormat的线程安全的时候。原创 2024-05-18 19:28:12 · 890 阅读 · 0 评论 -
Fail-safe机制与Fail-fast机制分别有什么作用
Fail-safe:表示失败安全,也就是在这种机制下,出现集合元素的修改,不会抛出ConcurrentModificationException。定义了一个CopyOnWriteArrayList,在对这个集合遍历过程中,对集合元素做修改后,不会抛出异常,但同时也不会打印出增加的元素。定义一个Map集合,使用Iterator迭代器进行数据遍历,在遍历过程中,对集合数据做变更时,就会发生Fail-fast。原因是采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,原创 2024-05-11 19:53:03 · 324 阅读 · 0 评论 -
JVM 如何完成垃圾回收?
但无论使用哪种垃圾回收器,我们的编码方式还是会影响垃圾回收的效果,减少对象的创建,及时切断与不再使用对象的联系,是我们平常编码中一定要注意的。这就是程序计数器的功能。JVM 的垃圾回收器更新很快,也有非常多的 JVM 版本,比如 Zing VM、Dalvik,目前被广泛应用的是 Hotspot,提供了海量的配置参数来支持我们的性能微调。如 JVM 内存区域划分图所示,JVM 中占用内存最大的区域,就是堆(Heap),我们平常编码创建的对象,大多数是在这上面分配的,也是垃圾回收器回收的主要目标区域。原创 2024-04-22 17:13:50 · 667 阅读 · 0 评论 -
谈谈JVM内存区域的划分
Java 的常量池可以存放各种常量信息,不管是编译期生成的各种字面量,还是需要在运行时决定的符号引用,所以它比一般语言的符号表存储的信息更加宽泛。同理,在一个时间点,对应的只会有一个活动的栈帧,通常叫作当前帧,方法所在的类叫作当前类。这也是所有线程共享的一块内存区域,用于存储所谓的元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等。理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,最有名的就是新生代、老年代的划分。原创 2024-04-21 19:35:52 · 585 阅读 · 0 评论 -
MySQL中char与varchar的区别
因为char多存储一些空格,意味着需要从磁盘读写更多的数据、耗费更多内存、查找数据时删除空格可能也会耗费一些CPU性能。注意:这是MySQL层的描述,具体怎么存储由存储引擎决定。根据MySQL的官方文档。原创 2024-03-26 00:30:00 · 268 阅读 · 0 评论 -
Redis 大 Key 对持久化有什么影响?
当 AOF 写回策略配置了 Always 策略,如果写入是一个大 Key,主线程在执行 fsync() 函数的时候,阻塞的时间会比较久,因为当写入的数据量很大的时候,数据同步到硬盘这个过程是很耗时的。AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过fork()函数创建一个子进程来处理任务。创建子进程的途中,由于要复制父进程的页表等数据结构,阻塞的时间跟页表的大小有关,页表越大,阻塞的时间也越长;原创 2024-03-22 10:02:35 · 1040 阅读 · 0 评论 -
Redis面试题 - Redis实战
lazyfree-lazy-server-del:有些指令在处理已存在的键时,会带有一个隐式的 del 键的操作,比如 rename 命令,当目标键已存在,Redis 会先删除目标键,如果这些目标键是一个 big key,就会造成阻塞删除的问题,此配置表示在这种场景中是否开启 lazy free 机制删除;可以看到,解锁是有两个操作,这时就需要 Lua 脚本来保证解锁的原子性,因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,保证了锁释放操作的原子性。原创 2024-03-18 18:48:27 · 876 阅读 · 0 评论 -
数据库和缓存如何保证一致性?
一天,老板说「最近公司的用户越来越多了,但是服务器的访问速度越来越差的,阿旺帮我优化下,程序员阿旺听到老板口中的「画饼」后就非常期待,没有任何犹豫就接下了老板给的这个任务。阿旺登陆到了服务器,经过一番排查后,确认服务器的。这好办,给服务器加上 Redis,让其作为数据库的缓存。这样,在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用在去查询数据库,从而减轻数据库的压力,提高服务器的性能。原创 2024-03-17 00:45:00 · 966 阅读 · 0 评论 -
什么是缓存雪崩、击穿、穿透?
引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。原创 2024-03-17 00:15:00 · 829 阅读 · 0 评论 -
MySQL 一行记录是怎么存储的?
MySQL 的 NULL 值是怎么存放的?MySQL 的 Compact 行格式中会用「NULL值列表」来标记值为 NULL 的列,NULL 值并不会存储在行格式中的真实数据部分。NULL值列表会占用 1 字节空间,当表中所有字段都定义成 NOT NULL,行格式中就不会有 NULL值列表,这样可节省 1 字节的空间。MySQL 怎么知道 varchar(n) 实际占用数据的大小?MySQL 的 Compact 行格式中会用「变长字段长度列表」存储变长字段实际占用的数据大小。原创 2024-03-16 14:51:25 · 1031 阅读 · 0 评论 -
为什么单线程的 Redis 能那么快?
大家好我是苏麟 , 给大家找一些好的文章看看 .原创 2024-03-16 10:16:33 · 1102 阅读 · 0 评论 -
重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
大家好我是苏麟 , 今天开始又一个专栏开始了(又一个坑 哈哈) .原创 2024-03-03 17:42:14 · 388 阅读 · 0 评论