Java之JVM、JUC面试题笔记(持续更新)

CountDownLatchCyclicBarrier

JUC 并发编程_juc并发编程-CSDN博客

 java 类加载机制?如何实现自定义类加载器?findClass 与 loadClass 的区别?

在Java中,自定义类加载器通常是通过继承java.lang.ClassLoader类并重写其findClass方法来实现的,该方法首先调用从文件系统获取类的字节码,然后使用defineClass方法将这些字节码转换成Class对象实例。需要注意的是,loadClass方法已经被ClassLoader实现过了,它会首先尝试调用父类加载器来加载类,只有在父类加载器加载失败的情况下,才会调用findClass方法。

自定义类加载器:

public class MyClassLoader extends ClassLoader{@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {String path="E:\\demo\\"+name+".class";try {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();Files.copy(Paths.get(path),byteArrayOutputStream);//得到class文件的字节数组byte[] bytes = byteArrayOutputStream.toByteArray();// 调用defineClass将字节码转化为Class实例return defineClass(name,bytes,0,bytes.length);}catch (IOException e){e.printStackTrace();throw new ClassNotFoundException("类文件未找到",e);}}
}

注意:在Java中,一个类的身份不仅由其完整名字(包括包名)决定,还由加载它的类加载器决定。换句话说,即使两个类来自同一份字节码文件,如果它们被不同的类加载器实例加载,那么在JVM中,它们也会被视为不同的类。

  MyClassLoader classLoader=new MyClassLoader();Class<?> aClass = classLoader.loadClass("Demo");Class<?> aClass1 = classLoader.loadClass("Demo");System.out.println(aClass==aClass1); //trueMyClassLoader myClassLoader=new MyClassLoader();Class<?> aClass2 = myClassLoader.loadClass("Demo");System.out.println(aClass==aClass2); //false

loadClass方法

loadClass是类加载的入口点。当你的代码尝试加载一个类时(通过Class.forName、反射等方式),最终都会调用到类加载器的loadClass方法。loadClass方法的主要职责是按照双亲委派模型来加载类:

  1. 检查类是否已加载:首先检查这个类是否已经被加载过了。如果已加载,就直接返回该类的Class对象。这保证了每个类在JVM内部只有一个Class实例。
  2. 双亲委派:如果类还没有被加载,loadClass会先委托给父类加载器尝试加载这个类。只有当父类加载器无法加载该类时(因为它不在父类加载器的搜索范围内),才会尝试自己加载。
  3. 调用findClass方法:如果所有父类加载器都无法加载这个类,loadClass方法最终会调用类加载器自己的findClass方法来加载这个类。

findClass方法

findClass方法是ClassLoader的一个受保护方法,它在类加载器的类加载机制中起到实际加载类的作用。当一个类加载器的父类加载器都无法加载某个类时,这个类加载器的findClass方法就会被调用。

栈会不会溢出?栈溢出一般抛什么异常?jvm 在哪里设置栈的大小?设置的参数是什
么?

如果线程请求分配的栈容量超过java虚拟机栈允许的最大容量的时候,java虚拟
机将抛出一个StackOverFlowError异常,可以通过命令行参数设置栈的大小,java -Xss512k Application,-Xms设置堆的初始大小,-Xmx设置堆的最大大小。

JIT 、逃逸分析、锁消除、栈上分配、标量替换

java 线程池?线程池构造函数的几个参数含义?keepAliveTime 解释一下?

 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,  // 核心线程数量6,              //最大线程数60,             //空闲临时线程最大存活时间(数值)TimeUnit.SECONDS,//空闲临时线程最大存活时间(单位)new ArrayBlockingQueue<>(3),//任务队列,也就是一个堵塞队列,也可以使用LinkedBlockingQueue这个阻塞队列Executors.defaultThreadFactory(),//用线程池工具类Executors创建线程的工厂new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略中其中一个,丢弃任务并抛出RejectedExecutionException);

线程等待和唤醒的实现方式

  • Object 类下的 wait()、notify() 和 notifyAll() 方法;
  • Condition 类下的 await()、signal() 和 signalAll() 方法;
  • LockSupport 类下的 park() 和 unpark() 方法。

LockSupport 类的方法说明:

  1. LockSupport.park():休眠当前线程。
  2. LockSupport.unpark(线程对象):唤醒某一个指定的线程。

线程池拒绝策略

判断线程池中的任务已经全部执行完,等所有任务都执行完之后,进行数据的组装和返回

1. 使用 CountDownLatch 或 CyclicBarrier 等待所有线程都执行完之后,再执行后续流程。

2. CompletableFuture

ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));CompletableFuture<Void> a = CompletableFuture.runAsync(() -> {System.out.println(Thread.currentThread().getName());}, pool);CompletableFuture<Void> b = CompletableFuture.runAsync(() -> {System.out.println(Thread.currentThread().getName());}, pool);//等待两个线程执行完毕CompletableFuture.allOf(a,b).get();

ConcurrentHashMap为什么不允许插入Null

 volatile有序性

死锁

解决方案:

  1. 按照顺序加锁:尝试让所有线程按照同一顺序获取锁,从而避免死锁。
  2. 设置获取锁的超时时间:尝试获取锁的线程在规定时间内没有获取到锁,就放弃获取锁,避免因为长时间等待锁而引起的死锁。

死锁排查工具:jconsole 和 JVisualVM:这些是 Java 自带的监视工具,可以用于监视线程、内存、CPU 使用率等信息,从而帮助排查死锁问题。

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

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

相关文章

全网短剧搜索源码+短剧API接口 短剧下载 热门短剧 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 pc端h5手机端全网短剧搜索前端源码分享 内含7000短剧资源(不支持在线播放&#xff09; 搜索API接口&#xff1a;文件内查看 全部短剧API接口&#xff1a;文件内查看 每日更新API接…

面试经典150题 买卖股票的最佳时机 II

面试经典150题 day8 题目来源我的题解方法一 动态规划方法二 贪心一次遍历 题目来源 力扣每日一题&#xff1b;题序&#xff1a;122 我的题解 方法一 动态规划 与 买卖股票的最佳时机 的区别在于&#xff1a;可以多次买入、卖出。 时间复杂度&#xff1a;O(n) 空间复杂度&am…

vs2019 - detected memory leak

文章目录 vs2019 - detected memory leak概述笔记vs2019 consolevs2019 MFC Dlg但是&#xff0c;工程大了之后&#xff0c;VS2019提示的就变了样整好的内存泄漏侦测头文件和实现my_debug_new_define.hmy_debug_new_define.cpp在所有.cpp文件入口处包含my_debug_new_define.h包含…

模板的进阶

目录 非类型模板参数 C11的静态数组容器-array 按需实例化 模板的特化 函数模板特化 类模板特化 全特化与偏特化 模板的分离编译 总结 非类型模板参数 基本概念&#xff1a;模板参数类型分为类类型模板参数和非类类型模板参数 类类型模板参数&#xff1a;跟在class…

Covalent Network(CQT)宣布推出面向 Cronos 生态的捐赠计划与 API 积分,为 Web3 创新赋能

为了促进 Web3 领域的创新&#xff0c;Covalent Network&#xff08;CQT&#xff09;宣布将其捐赠计划向 Cronos 生态系统中的开发者拓展。这一战略性举措&#xff0c;旨在通过向 Cronos 网络中基于 Covalent Network&#xff08;CQT&#xff09;API 构建的项目提供支持和资源&…

k8s调度场景

15个KUBERNETES调度情景实用指南 Kubernetes调度是确保集群中的Pod在适当节点上运行的关键组件。通过灵活配置调度策略&#xff0c;可以提高资源利用率、负载平衡和高可用性。 在本文中&#xff0c;我们将深入探讨一些实际的Kubernetes调度场景&#xff0c;并提供相应的配置示…

Java实现优先级队列(堆)

前言 在学习完二叉树的相关知识后&#xff0c;我们对数据结构有了更多的认识&#xff0c;本文将介绍到优先级队列(堆&#xff09; 1.优先级队列 1.1概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能…

leetcode做题记录 3011(计算二进制中一的个数)3012

3011. 判断一个数组是否可以变为有序 [题目的“有序”等价于“升序”] 思考 题目要求两个相邻元素在二进制下数位为1的数目相同才可以交换&#xff0c;那就要判断1相同的一块是否是按顺序排序的。从大到小和从小到大都测试一遍。找到一块中最大的和最小的&#xff0c;放在sta…

Android 车载应用开发概述

前言 介绍 Android 车载应用开发 文章目录 前言一、Android Automotive OS 概述二、Android Automotive OS 架构三、常见的车载应用1、系统应用1&#xff09;SystemUI是什么开发工作 2&#xff09;Launcher是什么开发工作 3&#xff09;Settings是什么开发工作 4&#xff09;多…

使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题

环境&#xff1a;python3.8.10 uc的安装方法&#xff1a; pip38 install undetected-chromedriver 上测试代码&#xff1a; import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://www.baidu.com) driver.save_screenshot(baidu.png)报错&#xff…

【结构型模式】组合模式

一、组合模式概述 组合模式的定义与意图&#xff1a;将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。&#xff08;对象结构型&#xff09; 组合模式分析&#xff1a; 1.当容器对象的某一个方法被调用时&#xff0c;将遍…

算法|基础算法|高精度算法

基础算法|位运算 1.高精度加法 2.高精度减法 3.高精度乘法 4.高精度除法 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 高精度加法 …

【C++学习】map和set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set 4.1 set的介绍 4.2 set的使用 4.2.1 set的模板参数列表 4.2.2 set的构造 4.2.3 set的容量 4.2.4 set修改操作 4.2.5 set的使用举例 五、map 5.1 map的介绍 5.2 map的使用 5.2.1 map的模板参数说…

7.C++:多态

一、 virtual关键字 //1.可以修饰原函数&#xff0c;为了完成虚函数的重写&#xff0c;满足多态的条件之一&#xff1b; //2.可以在菱形继承中&#xff0c;完成虚继承&#xff0c;解决数据冗余和二义性&#xff1b; 两个地方使用同一关键字&#xff0c;但二者间没有一点关联 二…

淘宝扭蛋机小程序开发:开启购物娱乐新纪元

在数字时代浪潮的推动下&#xff0c;小程序作为新兴的交互平台&#xff0c;正在不断引领着购物方式的革新。淘宝扭蛋机小程序的开发&#xff0c;便是这一变革中的一颗璀璨明星&#xff0c;它将传统扭蛋机的趣味与电商购物的便捷完美融合&#xff0c;为用户带来了前所未有的购物…

Python+人工智能

Python人工智能 一、Python基础语法 涵盖Python基础知识&#xff0c;让大家掌握基础的编程能力 Python注释 单行注释&#xff1a;#注释内容多行注释&#xff1a;‘’‘注释内容’‘’ 变量和数据类型 变量 变量就是用来存储数据的。赋值变量时不需要指定数据类型&#xff0c;…

【R: mlr3:超参数调优】

本次分享官网教程地址 https://mlr3book.mlr-org.com/chapters/chapter4/hyperparameter_optimization.html 型调优 当你对你的模型表现不满意时&#xff0c;你可能希望调高你的模型表现&#xff0c;可通过超参数调整或者尝试一个更加适合你的模型&#xff0c;本篇将介绍这些操…

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息&#xff1a; 发表于&#xff1a;IEEE TRANSACTIONS ON MULTIME…

【Redis 神秘大陆】006 灾备方案

六、Redis 灾备方案 6.1 存储方案 6.1.1 基础对比 RDB持久化AOF持久化原理周期性fork子进程生成持久化文件每次写入记录命令日志文件类型二进制dump快照文件文本appendonly日志文件触发条件默认超过300s间隔且有1s内超过1kb数据变更永久性每秒fsync一次文件位置配置文件中指…

政安晨:【深度学习神经网络基础】(十)—— 反向传播网络中计算输出节点增量与计算剩余节点增量

目录 简述 二次误差函数 交叉熵误差函数 计算剩余节点增量 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…