不久之前,我遇到了一个Java GC问题。有个服务在高峰期耗时增加,触达上游超时配置,导致上游调用失败率增加。经过初步排查确认这并非因为个别接口的性能恶化,而是服务整体上性能恶化。 最终定位原因是,高峰期 YoungGC和 FullGC 频率过高,导致耗时增加。遂决定从GC方向优化性能,经过两周的治理,GC问题得到大幅改善,接口耗时下降30%。…
JDK在线程的Stop方法时明确不得强行销毁一个线程,要优雅的退出线程。 何谓优雅退出线程,即业务将进行中请求正确被处理,取消待执行请求,执行资源回收,最终Thread Runable run 方法return 结束执行。 首先问为什么要退出一个线程,再提问如何退出一个线程 任务执行完成,或异常终止,任务认为无需再占用线程。…
前言 本文将介绍 Tomcat 中的 NIO 使用,使大家对 Java NIO 的生产使用有更加直观的认识。 虽然本文的源码篇幅也不短,但是 Tomcat 的源码毕竟不像 Doug Lea 的并发源码那么“变态”,对于大部分读者来说,阅读难度比之前介绍的其他并发源码要简单一些,所以读者不要觉得有什么压力。 本文基于 Tomcat…
Java IO Java IO的基础知识已在前文讲过 Socket编程 socket是操作系统提供的网络编程接口,他封装了对于TCP/IP协议栈的支持,用于进程间的通信,当有连接接入主机以后,操作系统自动为其分配一个socket套接字,套接字绑定着一个IP与端口号。通过socket接口,可以获取tcp连接的输入流和输出流,并且通过他们进行读取和写入此操作。…
1. 自动拆箱出现 null 包装器类型自动拆箱为基础类型时极容易出现NPE。如下图示例,方法void initTask(int taskId),调用时taskId如果为 null ,则会出现NPE。正确做法是 可能为 null 的属性,一律声明为包装器,此外从外部获取的变量一定要检查 null ,进行防御式编程。 public void…
摘要: I/O复用模型,是同步非阻塞,这里的非阻塞是指I/O读写,对应的是recvfrom操作,因为数据报文已经准备好,无需阻塞。 说它是同步,是因为,这个执行是在一个线程里面执行的。有时候,还会说它又是阻塞的,实际上是指阻塞在select上面,必须等到读就绪、写就绪等网络事件。 一、I/O复用模型解读…
1.什么是qwen:0.5b? 模型介绍: Qwen1.5是阿里云推出的一系列大型语言模型。 Qwen是阿里云推出的一系列基于Transformer的大型语言模型,在大量数据(包括网页文本、书籍、代码等)进行了预训练。 硬件要求: CPU配置:CPU最低第六代intel酷睿4核,AMD ZEN 4核以上;推荐12代intel酷睿8核,AMD ZEN…
1.什么是pf4j? 一个插件框架,用于实现插件的动态加载,支持的插件格式(zip、jar)。 核心组件 Plugin :是所有插件类型的基类。每个插件都被加载到一个单独的类加载器中以避免冲突。 PluginManager:用于插件管理的所有方面(加载、启动、停止)。您可以使用内置实现作为JarPluginManager,…
Spring Boot 提供了不同的测试方法,例如单元测试、集成测试和端到端测试。本文我们将学习如何使用 Junit 5 和 Mockito 为 Spring Boot 应用程序编写单元测试。 什么是单元测试 单元测试是一种软件测试技术,其中对软件应用程序的各个单元或组件进行单独测试,以验证它们是否按预期运行。 Spring Boot Starter…
假设您想创建一个供团队成员审核的 PR,同时团队需要确保 PR 符合团队标准,包括技术验证和测试用例有效性等。在这种情况下,我们需要使用工具来触发存储库的 PR 流程,并在 PR 不符合合并要求时向我们发出警报。 GitHub Actions 是一个持续集成和持续交付 (CI/CD)…