沭阳县建设局网站,阳春ycqq人才招聘信息,做污事网站,北京海淀网站建设1. Java类加载#xff0c;如何打破双亲委派#xff1f; 创建自定义类加载器#xff1a;创建一个新的类加载器类#xff0c;继承自 ClassLoader 或其任何已有的子类。 重写 loadClass 方法#xff1a;在你的自定义类加载器中重写 loadClass 方法。 加载类数据#xff1a…1. Java类加载如何打破双亲委派 创建自定义类加载器创建一个新的类加载器类继承自 ClassLoader 或其任何已有的子类。 重写 loadClass 方法在你的自定义类加载器中重写 loadClass 方法。 加载类数据在 loadClass 方法中首先尝试使用当前类加载器来加载类数据。你可以从文件系统、网络或其他源获取类的二进制数据。 定义类如果在步骤 3 中成功加载了类的数据使用 defineClass 方法将二进制数据转换为 Class? 对象。 委派给父类加载器如果步骤 3 和 4 失败作为回退机制将加载任务委派给父类加载器。 测试自定义类加载器创建一个测试程序使用你的自定义类加载器来加载某个类验证它是否可以正确地工作
2. 线程池使用场景参数
可以复用线程减少线程创建和销毁的开销。应用场景
Web 服务器用于处理高并发的 HTTP 请求。大数据处理用于并行处理大量的数据例如 MapReduce。实时应用在实时应用中用于处理多用户的并行请求或操作。文件上传和下载在文件上传和下载服务中可以使用线程池来并行处理多个文件传输任务。后台任务执行用于定时或周期性的执行后台任务例如日志清理数据同步等。
线程池参数 corePoolSize 描述线程池的基本大小。作用当线程池中的线程数少于 corePoolSize 时即使线程是空闲的也不会被销毁。 maximumPoolSize 描述线程池的最大线程数。作用当线程池中的线程数超过 corePoolSize 并且队列已满时线程池可以扩展到 maximumPoolSize。 workQueue 描述用于存放待处理的任务的队列。作用当线程池中的线程数达到 corePoolSize 时新的任务将被放在队列中等待。 threadFactory 描述用于创建新线程的工厂。作用可以用来设置线程的名称优先级等。 handler 描述拒绝策略当线程池和队列都满了之后用于处理新来的任务。常见策略 ThreadPoolExecutor.AbortPolicy直接抛出异常。ThreadPoolExecutor.CallerRunsPolicy将任务回退给调用者。ThreadPoolExecutor.DiscardPolicy忽略新来的任务。ThreadPoolExecutor.DiscardOldestPolicy抛弃队列中最老的任务。 keepAliveTime 描述空闲线程的保持时间。作用当线程池中的线程数量超过 corePoolSize 时多余的空闲线程将在等待新任务的时候最多保持 keepAliveTime 时间。 timeUnit 描述keepAliveTime 的时间单位
3. 线程池异常处理
使用 Future如果你通过 submit 方法提交任务而不是 execute你会得到一个 Future 对象可以用它来捕获异常在任务内部捕获异常你可以在每个任务内部捕获和处理异常使用 uncaughtExceptionHandler你可以为线程池中的线程设置一个UncaughtExceptionHandler 来捕获未捕获的异常
有哪些异常 RejectedExecutionException 描述当线程池已关闭或线程池和工作队列都已满时尝试提交新任务将抛出此异常。解决方案可以考虑调整线程池的大小或队列长度或者更改拒绝策略来处理这种情况。 OutOfMemoryError 描述如果线程池中的线程数或队列大小配置得太大或者任务创建了太多大对象你可能会遇到内存溢出错误。解决方案优化代码以减少内存使用或增加JVM的最大堆大小。 NullPointerException 描述当尝试提交的任务为null时将抛出此异常。解决方案确保提交到线程池的任务不是null。 IllegalStateException 描述当线程池处于不正确的状态时例如尝试多次关闭线程池可能会抛出此异常。解决方案检查代码以确保线程池的正确使用。 RuntimeException 或 ExecutionException 描述当任务抛出运行时异常时如果你使用了 Future.get() 方法来获取结果将包装为 ExecutionException 抛出。解决方案捕获这些异常并适当处理
4. Redis 基本数据结构 字符串String可以存储文本或二进制数据。 哈希表Hashes存储字段和字段值的映射适合用来存储对象。 列表Lists有序的字符串列表常用于实现队列。 集合Sets无序的字符串集合可以快速查找、添加、删除元素。 有序集合Sorted Sets与集合类似但每个元素都会关联一个分数元素间有序。 位图Bitmaps通过位操作来存储和查询数据。 超日志HyperLogLogs用于统计唯一值的数量但会有一定的误差。 流Streams:用于实现消息队列的功能支持多个消费者。
5. 如何保证数据库缓存一致性
事务性尽可能将缓存操作和数据库操作包含在一个事务中这样可以确保要么都成功要么都失败。使用队列使用消息队列来缓冲数据库的写操作并按顺序处理它们以保证缓存和数据库的一致性。一致性哈希在分布式缓存场景中可以使用一致性哈希来保证数据的一致性。数据库触发器利用数据库触发器在数据变更时自动更新或清除缓存。
6. mysql底层数据结构为什么选用B树 磁盘I/O效率 数据块的读写B树将数据存储在叶子节点而非叶子节点仅存储键值和指向孩子节点的指针。这意味着磁盘I/O操作通常能够一次读取更多的数据。顺序扫描优化B树的叶子节点之间通过指针相连这为范围查询和顺序扫描提供了高效的路径减少了磁盘I/O次数。 空间使用效率 空间局部性B树的层级更少更多的节点可以被加载到内存中这提高了空间局部性和缓存命中率。节约空间由于B树的内部节点不存储数据这可以更有效地利用空间来存储索引信息从而节约存储空间。 查询效率 查询时间可预测B树保证了所有叶子节点都在同一层这使得所有的查找操作路径长度相等提供了可预测的查询时间。范围查询优势通过顺序访问叶子节点可以更快地完成范围查询。 插入和删除操作效率 高效的插入和删除B树提供了高效的插入和删除操作因为它只需在叶子节点进行修改而不需要频繁地重新平衡树结构。 支持事务和并发控制 易于实现锁机制B树结构便于实现各种锁机制如行锁这对于支持事务和并发控制是非常重要的
7.幻读了解吗
幻读Phantom Reads是数据库事务管理中的一个概念是一种并发控制现象。在一个事务的执行过程中如果由于另一个事务的插入或删除操作导致第一个事务重新执行一个相同的查询时返回的结果集不同那么就出现了幻读
幻读通常可以通过使用更高级别的事务隔离来避免比如可串行化Serializable隔离级别。在此级别事务是完全隔离的意味着在一个事务开始到结束的过程中不会看到其他事务所做的任何修改。
8.索引什么情况下索引会失效 不使用索引列的前缀 如果查询条件没有包括索引的前缀列即索引中的第一列索引可能不会被使用。 使用函数或表达式 当在查询条件中对索引列使用函数、表达式、类型转换等操作时索引可能不会被使用。例如WHERE UPPER(column) VALUE。 使用通配符前缀 当查询条件中使用通配符前缀如 %value时索引可能不会被使用因为通配符前缀无法利用索引的有序性。 对列进行计算 如果查询中对索引列进行计算或运算索引可能会失效。例如WHERE column * 2 10。 不等于!操作符 在某些情况下使用不等于操作符!或可能导致索引失效因为它不适用于某些类型的索引优化。 OR条件 使用OR条件连接多个不同的索引列时优化器可能无法有效地使用索引
9.线程安全如何实现 互斥锁 使用互斥锁Mutex或信号量来保护共享资源确保一次只有一个线程可以访问它。Java中的 synchronized 关键字和 ReentrantLock 类可以用来创建互斥锁。 原子操作 利用原子操作来执行多个步骤的操作确保它们在多线程环境下是不可中断的。在Java中可以使用 java.util.concurrent.atomic 包中的原子类如 AtomicInteger、AtomicLong来实现原子操作。 线程安全的数据结构 使用线程安全的数据结构如 ConcurrentHashMap、CopyOnWriteArrayList 等来代替传统的集合类。这些数据结构内部使用了锁或其他机制来确保线程安全。 不可变对象 设计不可变对象这些对象在创建后不能被修改因此可以被多个线程安全地共享。使用 final 关键字来标记字段确保它们不可变。 线程局部存储 使用线程局部存储Thread-Local StorageTLS来为每个线程提供独立的变量副本从而避免竞争条件。在Java中可以使用 ThreadLocal 类来管理线程局部变量
10. 负载均衡算法
(1RandomLoadBalance根据权重随机选择对加权随机算法的实现。这是Dubbo默认采用的一种负载均衡策略。 2LeastActiveLoadBalance最小活跃数负载均衡。 Dubbo 就认为谁的活跃数越少谁的处理速度就越快性能也越好这样的话我就优先把请求给活跃数少的服务提供者处理。
3ConsistentHashLoadBalance一致性Hash负载均衡策略。 ConsistentHashLoadBalance 中没有权重的概念具体是哪个服务提供者处理请求是由你的请求的参数决定的也就是说相同参数的请求总是发到同一个服务提供者。另外Dubbo 为了避免数据倾斜问题节点不够分散大量请求落到同一节点还引入了虚拟节点的概念。通过虚拟节点可以让节点更加分散有效均衡各个节点的请求量。
4RoundRobinLoadBalance加权轮询负载均衡。 轮询就是把请求依次分配给每个服务提供者。加权轮询就是在轮询的基础上让更多的请求落到权重更大的服务提供者上。
11. java设计模式了解过哪些 12. spring循环依赖为什么需要三级缓存两级缓存不行吗
Spring的三级缓存是为了解决循环依赖问题而引入的。在Spring容器中如果两个Bean相互依赖那么在创建Bean时就会出现循环依赖问题。为了解决这个问题Spring使用了三级缓存1。
三级缓存包括
singletonObjects: 一级缓存存储单例对象Bean已经实例化并初始化完成。earlySingletonObjects: 二级缓存存储singletonObject这个Bean实例化了但还没有初始化。singletonFactories: 三级缓存存储singletonFactory。
当一个Bean被创建时Spring会首先从一级缓存中获取Bean实例。如果一级缓存中不存在该Bean实例则Spring会从二级缓存中获取该Bean实例。如果二级缓存中也不存在该Bean实例则Spring会从三级缓存中获取该Bean实例的工厂对象并调用工厂方法创建该Bean实例。
13. tcp粘包和拆包 14. CP和AP的区别 15. Java线程通信方式 16. CMS和C1区别 17. JVM调优的手段
调整JVM参数例如可以设置堆大小、新生代比例、GC算法等参数以及启用垃圾回收器的Ergonomics机制。分析和定位当前系统的瓶颈对于JVM的核心指标我们的关注点和常用工具如下 CPU指标 JVM内存指标 JVM GC指标
选择合适的GC收集器串行收集器、并行收集器、并发收集器。架构调优和代码调优架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行明确优化目标、发现性能瓶颈、性能调优、通过监控及数据统计工具获得数据、确认是否达到目标
18. 新生代频繁Minor GC原因解决办法
新生代空间设置过大如果新生代空间设置过大会导致每次Minor GC的时间变长从而影响系统的性能。因此需要根据应用程序的实际情况来调整新生代的大小。对象引用链较长如果对象引用链较长进行可达性分析时间较长也会导致Minor GC的频繁发生。因此需要尽量减少使用全局变量和大对象。新生代survivor区设置的比较小如果新生代survivor区设置的比较小清理后剩余的对象不能装进去需要移动到老年代造成移动开销。因此需要根据应用程序的实际情况来调整survivor区的大小。
19. 频繁Full GC老年代GC的原因解决办法参考17
System.gc()方法的调用虽然只是建议而非一定但很多情况下它会触发Full GC从而增加Full GC的频率也即增加了间歇性停顿的次数。强烈建议能不使用此方法就别使用让虚拟机自己去管理它的内存可通过通过-XX:DisableExplicitGC来禁止RMI调用System.gc。老年代空间不足老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象。为避免此种状况引起的Full GC调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。永生区空间不足当系统中要加载的类、反射的类和调用的方法较多时永生区可能会被占满在未配置为采用CMS GC的情况下也会执行Full GC。为避免Perm Gen占满造成Full GC现象可采用的方法为增大Perm Gen空间或转为使用CMS GC。CMS GC时出现promotion failed和concurrent mode failure对于采用CMS进行老年代GC的程序而言尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况当这两种状况出现时可能会触发Full GC。措施为增大survivor space、老年代空间或调低触发并发GC的比率。统计得到的Minor GC晋升到旧生代的平均大小大于老年代的剩余空间这是一个较为复杂的触发情况。Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象在进行Minor GC时做了一个判断如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间那么就直接触发Full GC。
20. Java内存区域内存模型 21. Java运行一个程序的过程 22. 静态变量在什么阶段分配内存 23. TCP和UDP的原理区别
TCP是面向连接的UDP是无连接的TCP是可靠的UDP是不可靠的TCP是面向字节流的UDP是面向数据报文的TCP只支持点对点通信UDP支持一对一一对多多对多TCP报文首部20个字节UDP首部8个字节TCP有拥塞控制机制UDP没有TCP协议下双方发送接受缓冲区都有UDP并无实际意义上的发送缓冲区但是存在接受缓冲区
24. 平时用SpringBoot经常会用注解注解开发是怎么实现的你提到了AOPAOP和OOP是什么关系呢
Spring Boot中的注解开发是通过Java的反射机制实现的。 AOP与OOPObject Oriented Programming是面向不同领域的两种设计思想。OOP针对业务处理过程的实体及其属性和行为进行抽象封装以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中的切面进行提取它所面对的是处理过程中的某个步骤或阶段以获得逻辑过程中各部分之间低耦合性的隔离效果
25. Java默认的垃圾收集器是哪个GC的过程是由谁来调度的GC线程是谁启动的
Java默认的垃圾收集器是 G1 垃圾收集器Java的垃圾收集过程是由 JVM 来调度的。JVM会在程序运行时根据内存使用情况自动触发垃圾回收GC线程是由 JVM 启动的。在JVM启动时会启动一个或多个GC线程用于执行垃圾回收
26. 平时使用MySQL增加索引可以提高查询效率如何理解
27. 查询第50条到100条记录
在SQL中可以使用 LIMIT 和 OFFSET 子句来查询指定范围内的记录。假设你要查询第50条到100条记录可以使用以下语句
SELECT * FROM table_name LIMIT 50, 50;28.InnoDB的索引类型
29. 主键索引、唯一索引和联合索引
在MySQL中主键索引是一种特殊的唯一索引用于标识一条记录。主键索引的值必须唯一且不能为NULL。如果表中没有定义主键MySQL会自动创建一个名为PRIMARY的主键索引唯一索引是指索引列的值必须唯一但是可以为NULL。如果一个表中有多个唯一索引那么每个唯一索引都可以保证索引列的值唯一.联合索引是指将多个列组合在一起创建的索引。联合索引可以包含多个列但是要注意联合索引的顺序非常重要。如果查询条件中只涉及到联合索引中的第一个或前几个列则该查询可以使用联合索引进行优化否则该查询无法使用联合索引进行优化
30. 一张表用a,b,c三个字段作为联合索引一条SQL命中了a和b是否会走索引
在MySQL中如果一张表使用a,b,c三个字段作为联合索引一条SQL命中了a和b那么这条SQL会走索引。但是如果SQL命中了a和c或者b和c则不会走索引
31. mysql的事务特性、隔离级别
读未提交 (READ UNCOMMITTED)
在这个隔离级别中一个事务可以读取另一个未提交事务的修改。 问题这种级别可能会导致脏读即一个事务读取到另一个事务还未提交的数据如果那个事务最终回滚那么读取的数据就是无效的。 这是最低的隔离级别锁定的需求最少。
读提交 (READ COMMITTED)
在这个隔离级别中一个事务只能读取其他事务已经提交的修改。 问题尽管可以避免脏读但是可能会发生不可重复读即在同一个事务中后续的查询可能会看到前一个查询中未看到的行或列的不同值。 这是大多数数据库系统的默认隔离级别。
可重复读 (REPEATABLE READ)
在这个隔离级别中其他事务不能在事务执行期间插入新行从而防止了幻读。 问题该隔离级别可以避免脏读和不可重复读但是可能会导致幻读。幻读是指当某个事务在读取某个范围内的所有行时另一个事务又在该范围内插入了新行导致前一个事务再次读取时看到了额外的、早先不存在的行。 在MySQL的InnoDB存储引擎中这是默认的隔离级别。
串行化 (SERIALIZABLE)
这是最严格的隔离级别。当一个事务选择了该隔离级别后其他事务就不能并发执行它们必须等待该事务完成。 问题这种级别可以避免脏读、不可重复读和幻读但是性能开销最大因为事务之间完全是串行执行的。
32. mysql的锁机制悲观锁和乐观锁的区别 33. 讲一下collection和map 34. list和set有什么区别set里面可以有null值吗list是不是可以有多个null值 35. hashmap和hashtable有什么区别hashmap的底层原理如何解决hash冲突
36. concurrentHashMap和hashmap有什么区别
线程安全性HashMap是线程不安全的当出现多线程操作时会出现安全隐患而ConcurrentHashMap是线程安全的。并发操作HashMap不支持并发操作没有同步方法ConcurrentHashMap支持并发操作。锁机制ConcurrentHashMap采用锁分段技术将整个Hash桶进行了分段segment每个小的片段segment上面都有锁存在这样只要保证每个Segment是线程安全的也就实现了全局的线程安全。而HashMap没有采用锁分段技术
37. IOC和AOP的概念、IOC的实现机制即依赖注入的方式
38.spring bean 的生命周期
Bean 的生命周期指的是 Bean 在 SpringIoC中从创建到销毁的整个过程。Bean 的生命周期主要包含以下 5 个流程
1实例化为 Bean 分配内存空间
2设置属性将当前类依赖的 Bean 属性进行注入和装配
3初始化
执行各种通知。 执行初始化的前置方法。 执行初始化方法。 执行初始化的后置方法。 (4)使用 Bean在程序中使用 Bean 对象
(5)销毁 Bean将 Bean 对象进行销毁操作。
39. springboot配置文件的加载顺序yml和properties
在 Spring Boot 中当同时存在 .properties 和 .yml 配置文件时Spring Boot 会优先使用 yaml 格式的配置文件而 properties 格式的配置文件时使用
在加载配置文件时Spring Boot 会按照以下顺序加载
优先加载 application.yml 或者 application.properties 文件。其次加载 classpath:/config/application.yml 或者 classpath:/config/application.properties 文件。最后加载 classpath:/application.yml 或者 classpath:/application.properties 文件。