编程语言:Java
JDK11升级JDK17最全实践干货来了
2021年9月14日,Oracle发布了可以长期支持的JDK17版本,那么从JDK11到JDK17,到底带来了哪些特性呢?亚毫秒级的ZGC效果到底怎么样呢?值得我们升级吗?而且升级过程会遇到哪些问题呢?带着这些问题,本篇文章将带来完整的JDK11升级JDK17最全实践。
Javaagent入门
Java Agent 是 jdk1.5 以后可以在运行时 hook 字节码的技术。
字节码增强技术在java中的应用
我们都知道java是一门解释型语言,大致执行过程如下图所示,首先需要将.java文件编译成字节码文件,然后再通过jvm解释执行,最终运行在对应的操作系统上。这也是java号称一次编译,到处运行的关键。同时我们也能看到,其中的关键是java通过遵循jvm规范而编译出来的字节码文件,它是实际被解释执行的逻辑。
Java多线程之CompletableFuture
CompletableFuture是java.util.concurrent库在java 8中新增的主要工具,同传统的Future相比,其支持流式计算、函数式编程、完成通知、自定义异常处理等很多新的特性。Future接口相对简单些,提供了取消(cancel)、获取结果(get)、检测是否完成或者取消(isCancelled、isDone)这些方法,Future接口提供了异步获取结果的能力。CompletableFuture还能够将任务放到不同的线程中执行, 既可以在当前线程中直接执行任务,也可以将其放到其他任务线程中执行,这个过程是自动的,无需干预。
CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。CompletionStage相当于“阶段”,一个CompletionStage对象是异步计算中的一个阶段,当 一个CompletionStage完成时会触发下一个动作或计算。 CompletionStage解决了Future的一些问题: Future没有提供通知机制,Future是否执行完任务需要不断的检查或者调用get()方法阻塞任务执行,CompletionStage完美的解决了该问题,前一个任务 执行成功后可以自动触发下一个任务的执行,中间无需等待。CompletableFuture 和 FutureTask 同属于 Future 接口的实现类,都可以获取线程的执行结果 。
Java线程和CPU调度
java 中的线程和操作系统中的线程分别存在于虚拟机和操作系统中,一个 Java 线程是直接通过一个操作系统线程来实现的......
Java服务总在半夜挂,背后的真相竟然是...
近期业务反馈Java服务频繁宕机,服务无流量突增,无定时任务,排查发现是crontab任务导致...
我在前端写Java SpringBoot项目
本文采用 Nest + Sequelize + MySQL 框架介绍前端 Node服务端 。Nest 主要使用装饰器语法, 整体开发结构跟 Java SpringBoot极其相似,能一睹服务端开发的结构,更好地做好前后端协作开发。
解决GC毛刺问题——转转搜索推荐服务JDK17升级实践
随着转转业务规模的不断增长,我们的搜索推荐服务正在面临严峻的GC毛刺问题。为此,我们计划通过升级到JDK来实现GC问题的改善。
Java应用堆外内存泄露问题排查
Java应用堆外内存持续增长,直到服务器内存全部耗尽,本文分享详细排查过程。
ChatGPT助力编写JAVA框架!
本文介绍了使用 ChatGPT逐步创建 一个简单的Java框架,包括构思、交流、深入优化、逐步完善和性能测试等步骤。
一种关于Java的hook技术-JavaAgent初识
Java是一种当前广泛使用的编程语言,它可以用于开发各种类型的应用程序,包括桌面应用程序。Java的跨平台性和易于学习的特点使得它成为开发桌面应用程序的理想选择,然而软件都有出现漏洞的可能性,一旦出现漏洞利用,影响广泛,例如前些年著名的apache log4j2漏洞。
在预研一种对用户侧Java程序进行监控和防护的方式过程中,遇到的问题是Java编译的代码是字节码,在jvm中运行,不是可以执行的CPU指令,无法以常规windows hook方式对程序进行注入和拦截。最终经过探讨,以asm+ JavaAgent方式来实现,后续本文将针对JavaAgent技术进行说明。
如何通过变异测试助力Java项目单测覆盖率提升
通常在软件测试过程中,我们会关注测试用例的代码覆盖率。理想情况下,测试用例应该能够覆盖所有业务代码的函数、方法和模块,从而实现100%的代码覆盖率。然而,达到理想目标并不意味着测试用例已经健全。接下来,笔者将向您介绍一种称为“变异测试”的方法,它可以帮助我们实现目标覆盖率并补充测试用例。
Java 类型擦除与泛型信息恢复
Java的泛型在运行时会进行类型擦除,这意味着在JVM中无法知道泛型的具体类型。因此无法直接使用泛型创建对象和数组,也无法对泛型进行实例判断。不过,Java编译器仍会保留泛型信息,以便解决数据对象的反序列化问题。在涉及泛型赋值处,Java编译器会插入checkcast
指令,保证类型安全。如果指令失败(返回类型与目标类型不匹配),JVM会抛出ClassCastException
异常。这是为了保证泛型体系与非泛型体系的兼容性。例如,将泛型的List赋值给裸类型的List,可能会导致类型转换异常。
Java的AQS源码浅析
本文主要介绍了AQS的部分实现机制,并通过ReentrantLock的实现简单讲解了AQS的源代码。
了解Java可见性的本质
前一段时间重温了伪共享(false sharing)问题,了解到深处有几个问题一直想不明白,加上开发过程中遇到volatile时总觉得理解不够透彻,借着这次脑子里这几个问题,探究下Java可见性的本质到底是什么。
去哪儿一站式 Java 应用诊断解决方案 - Bistoury
对bistoury的底层实现和核心功能进行了介绍和分析。