类的卸载:由JVM自带的类加载器所加载的类,在JVM的生命周期中,始终不会被卸载。JVM本身会始终引用这些类加载器,而这些类加载器始终引用它们所加载的类的Class对象。所以说,这些Class对象始终是可触及的。
由用户自定义的类加载器所加载的类是可以被卸载的。
类的卸载:由JVM自带的类加载器所加载的类,在JVM的生命周期中,始终不会被卸载。JVM本身会始终引用这些类加载器,而这些类加载器始终引用它们所加载的类的Class对象。所以说,这些Class对象始终是可触及的。
由用户自定义的类加载器所加载的类是可以被卸载的。
本文不回答SPI是什么?而是结合源码深入剖析SPI该怎么使用。
12月10日凌晨,Apache 开源项目 Log4j 的远程代码执行漏洞细节被公开,由于其利用简单、危害巨大,一时引起不小的热度。本文将以该事件为切入点,浅析其中涉及的一些技术点。
引用类型变量
也要实现Serializable接口;JDK Serializable
, FST
只适用于Java;Protobuf
, Thrift
, Avro
支持多种语言,但都需要先通过IDL(接口描述语言,Interface description language)定义Schema;Avro
和Kryo
序列化后的数据最小,FST
和Kryo
序列化时间开销表现最好;Hessian
支持多语言,无需IDL定义Schema,对Java数据类型、语法的支持最佳。
JDK的异步处理,一直相对较弱,这方面也有很强的第三方框架。最近在学习这方面的内容,将学习过程记录在这里。
这篇文章里,主要了解Java中异步流处理的顶级概念:Reactive Streams。
上一篇文章中,我们介绍了Reactive Streams规范,现在学习一个Reactive Streams规范的流行实现:Project Reactor
的核心项目Reactor Core
。
JVM volatile用于保证程序可见性
、顺序性
,但是不保证原子性
。volatile实现原理是通过在操作变量之前,多加一个lock前缀指令
,通过汇编可以看到这个前缀指令。
当谈到顺序性时常会提到内存屏障
,常见的硬件层面内存屏障
有:sfence
lfence
mfence
,lock前缀指令
不是内存屏障,而是一种锁,执行时会锁住内存子系统来确保执行顺序,甚至跨多个CPU,JVM利用lock前缀指令的特点实现了可见性
和 顺序性
,lock前缀指令实现可见性比较好理解,主要是利用CPU提供的缓存一致性协议(例如Intel的MESI),当然更差一点的还有lock总线的方式(限制CPU访问内存)。
JMM层面为了实现顺序性
,又抽象出四个内存屏障
的概念:LoadLoad
StoreStore
LoadStore
StoreLoad
,字节码层面并没有内存屏障
的指令,JVM的C++代码会有四个同名函数与之对应,JVM遇到volatile变量便会在其前后执行对应的函数,从而实现内存屏障,具体来说:
LoadLoadBarrier
volatile 读操作
LoadStoreBarrier
StoreStoreBarrier
volatile 写操作
StoreLoadBarrie