面试总结
文章平均质量分 94
Joey Liao
这个作者很懒,什么都没留下…
展开
-
JVM 类加载器
根据官方 API 文档的介绍:类加载器是一个负责加载类的对象。是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个 Java 类都有一个引用指向加载它的。不过,数组类不是通过创建的,而是 JVM 在需要的时候自动创建的,数组类通过方法获取的时候和该数组的元素类型的是一致的。类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。原创 2023-04-10 12:36:05 · 1141 阅读 · 1 评论 -
JVM 类的加载过程
所以,在 JVM 生命周期内,由 jvm 自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。不过,数组类不是通过 ClassLoader 创建的,而是 JVM 在需要的时候自动创建的,数组类通过。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符 7 类符号引用进行。方法获取 ClassLoader 的时候和该数组的元素类型的 ClassLoader 是一致的。类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载由。原创 2023-04-03 14:52:08 · 525 阅读 · 0 评论 -
JVM 垃圾回收
JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种(引用强度逐渐减弱)强引用(Strong Reference):强引用是指程序中普遍存在的引用方式,如果一个对象具有强引用,垃圾回收器就不会回收该对象。只有当该对象不再具有任何强引用时,垃圾回收器才会回收该对象。软引用是一种相对强引用弱化的引用方式。如果一个对象只有软引用,当系统内存不足时,垃圾回收器可能会回收该对象。软引用通常用于实现内存敏感的高速缓存系统。弱引用(Weak Reference)原创 2023-03-31 20:20:36 · 343 阅读 · 0 评论 -
JVM 内存区域
在servivor区中,“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。与程序计数器一样,Java 虚拟机栈(后文简称栈)也是线程私有的,它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。:在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始,原创 2023-03-29 22:05:34 · 269 阅读 · 0 评论 -
java并发 ThreadLocal
多线程充分利用了多核CPU的威力,为我们程序提供了很高的性能。但是有时候,我们需要多个线程互相协作,这里可能就会涉及到数据一致性的问题。数据一致性指问题的是:发生在多个主体对同一份数据无法达成共识。这里的多个主体,可能是多线程,也可能是多个服务器节点。当然了,这里的“多个主体”也可以指朋友之间,夫妻之间,所谓“道不同,不相为谋”,说的就是这个理。提供了线程局部变量,一个线程局部变量在多个线程中,分别有独立的值(副本。原创 2023-03-27 22:17:17 · 399 阅读 · 0 评论 -
java并发-通信工具类
Semaphore翻译过来是信号的意思。顾名思义,这个工具类提供的功能就是多个线程彼此“打信号”。而这个“信号”是一个int类型的数据,也可以看成是一种“资源”。可以在构造函数中传入初始资源总数,以及是否使用“公平”的同步器。默认情况下,是非公平的。// 默认情况下使用非公平 public Semaphore(int permits) {最主要的方法是acquire方法和release方法。acquire()方法会申请一个permit,而release方法会释放一个permit。原创 2023-03-25 16:29:01 · 307 阅读 · 0 评论 -
java并发 AQS
AQS是一个构建锁和同步器的框架(模板)。Semaphore,其他的诸如FutureTask等等皆是基于AQS的。我们也可以使用AQS构建符合自己需求的同步器。原创 2023-03-21 17:34:57 · 198 阅读 · 0 评论 -
线程池原理
但如果你及团队本身对线程池非常熟悉,又确定业务规模不会大到资源耗尽的程度(比如线程数量或任务队列长度可能达到Integer.MAX_VALUE)时,其实是可以使用JDK提供的这几个接口的,它能让我们的代码具有更强的可读性。核心线程:线程池中有两类线程,核心线程和非核心线程。创建线程的工厂 ,用于批量创建线程,统一在创建线程时设置一些参数,如是否守护线程、线程的优先级等。线程池本身有一个调度线程,这个线程就是用于管理布控整个线程池里的各种任务和事务,例如创建线程、销毁线程、任务队列管理、线程队列管理等等。原创 2023-03-16 22:12:03 · 315 阅读 · 0 评论 -
消息队列基础
RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。Kafka 是 LinkedIn 开源的一个分布式流式处理平台,已经成为 Apache 顶级项目,早期被用来用于处理海量的日志,后面才慢慢发展成了一款功能全面的高性能消息队列。我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。原创 2023-03-09 22:05:11 · 278 阅读 · 0 评论 -
Mysql总结
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。原创 2022-12-21 14:54:49 · 442 阅读 · 0 评论 -
分布式锁详解
由于 Redis 集群数据同步到各个节点时是异步的,如果在 Redis 主节点获取到锁后,在没有同步到其他节点时,Redis 主节点宕机了,此时新的 Redis 主节点依然可以获取锁,所以多个应用服务就可以同时获取到锁。所谓可重入锁指的是在一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法即可重入 ,而无需重新获得锁。当可重入计数器大于 0 时,则锁被占有,需要判断占有该锁的线程和请求获取锁的线程是否为同一个。原创 2023-03-02 21:54:28 · 657 阅读 · 0 评论 -
分布式ID实现方法
分布式 ID 是分布式系统下的 ID。分布式 ID 不存在与现实生活中,属于计算机系统中的一个概念。我简单举一个分库分表的例子。我司的一个项目,使用的是单机 MySQL。但是,没想到的是,项目上线一个月之后,随着使用人数越来越多,整个系统的数据量将越来越大。单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC)。在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了。我们如何为不同的数据节点生成全局唯一主键呢?这个时候就需要生成。原创 2023-02-27 21:14:42 · 370 阅读 · 2 评论 -
java 多线程总结
程序:指一段静态的代码,静态对象。进程:是程序的一次执行过程,是系统资源的最小分配单位线程:进程可进一步细化为线程,是时间片的最小分配单位并行:多个CPU同时执行多个任务,比如:多个人同时做不同的事并发:一个CPU(采用时间片)同时执行多个任务,比如秒杀平台,多个人做同件事。原创 2022-09-13 19:44:40 · 90 阅读 · 0 评论