
大杂烩
文章平均质量分 75
由于分类专栏的数量限制,暂且全部放在这里。
姜希成
岁月流逝,将来的某时某处,我会在叹息中想起,林间的路分成两股,而我选择了人迹罕至之徒,那一刻起,一切差别已成定铸。
展开
-
Obsidian 将编辑界面设为半透明
【代码】Obsidian 将编辑界面设为半透明。原创 2024-09-03 09:50:42 · 635 阅读 · 0 评论 -
基于 AQS 和 StringRedisTemplate 的 Redis 分布式可重入独占锁实现
重点在于:如果一台机器中没有线程获取到锁,那么它就应该不断的自旋拿锁,避免无限等待使用守护线程周期性的给锁续命,避免持有锁的线程down机后发生死锁问题public class RedisReentrantLock implements Lock { private final Sync sync; public RedisReentrantLock(StringRedisTemplate stringRedisTemplate, String key) { sy原创 2021-04-21 12:09:34 · 367 阅读 · 1 评论 -
JVM 常用参数
JVM 参数类型:标准: -开头,所有的 HotSpot 都支持非标准:-X 开头,特定版本 HotSpot 支持特定命令,不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化。高级选项:-XX 开头,这些是开发人员选项,用于调整 Java HotSpot 虚拟机操作的特定区域,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数的特权访问。也不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化。可以使用 java -XX:+PrintFlagsFinal –version原创 2021-04-07 16:21:13 · 212 阅读 · 1 评论 -
JVM JIT
Java 程序在运行的时候,主要就是执行字节码指令,一般这些指令会按照顺序解释执行,这种就是解释执行。那些被频繁调用的代码,比如调用次数很高或者在 for 循环里的那些代码,如果按照解释执行,效率是非常低的。这些代码称为热点代码。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。完成这个任务的编译器,就称为即时编译器(Just In Time Compiler),简称 JIT 编译器。在 HotSpot 虚拟机中,内置了两个 JIT,分别为 C原创 2021-04-07 15:25:16 · 261 阅读 · 0 评论 -
JVM 调优
优化策略内存优化策略高并发业务场景下,应增加新生代的大小Minor GC 时间 = T1(扫描新生代)+ T2(复制存活对象)在 JVM 中,复制对象的成本要远高于扫描成本。如果在堆内存中存在较多的长期存活的对象,此时增加年轻代空间,反而会增加 Minor GC 的时间。如果堆中的短期对象很多,那么扩容新生代,单次 Minor GC 时间不会显著增加。因此,单次 Minor GC 时间更多取决于 GC 后存活对象的数量,而非 Eden 区的大小。新生代大小选择响应时间优先的应用:尽可能设大原创 2021-04-07 14:25:36 · 203 阅读 · 0 评论 -
JVM 调优工具
JDK 命令行工具命令作用参数备注jps列出当前机器上正在运行的虚拟机进程,jps 从操作系统的临时目录上去找(所以有一些信息可能显示不全)-q : 仅仅显示进程,-m: 输出主函数传入的参数-l: 输出应用程序主类完整 package 名称或 jar 完整名称.-v: 列出 jvm 参数jstat监视虚拟机各种运行状态信息,可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据jstat-gc 13616 250 10每 250 ms 查询原创 2021-04-07 09:33:44 · 326 阅读 · 2 评论 -
JVM 泛型语法糖
常用参数名称:符号作用E元素,主要由 Java 集合(Collections)框架使用K键,主要用于表示映射中的键的参数类型V值,主要用于表示映射中的值的参数类型N数字,主要用于表示数字T S U V通用型参数JVM 实现原理泛型擦除Java 语言中的泛型,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的 Java 语言来说,A原创 2021-04-06 16:57:47 · 169 阅读 · 0 评论 -
JVM 方法调用的底层实现
方法调用的字节码指令:字节码指令作用invokestatic调用静态方法invokespecial调用私有实例方法、构造器及 super 关键字等invokevirtual调用非私有实例方法,比如 public 和 protectedinvokeinterface和上面这条指令类似,不过作用于接口类invokedynamic调用动态方法非虚方法(静态绑定)在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。invokestatic静原创 2021-04-06 16:04:55 · 198 阅读 · 0 评论 -
JVM 类加载
类的生命周期加载(Loading)交给虚拟机的具体实现来自由把控,大多数都是懒加载没有指定一定得从某个 class 文件中获取通过一个类的全限定名来获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口什么时候需要开始类第一个阶段“加载”,虚拟机规范没有强制约束,这点交给虚拟机的具体实现来自由把控。JVM 虚拟机的实现都是使用的懒加载。注意:比如“通过原创 2021-04-06 10:42:21 · 139 阅读 · 0 评论 -
JVM 字节码指令
字节码指令属于方法表中的内容。Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于限制了 Java 虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过 256 条。大多数的指令都包含了其操作所对应的数据类型信息。例如:iload 指令用于从局部变量表中加载 int 型的数据到操作数栈中,而 fload 指令加载的则是 float 类型的数据。大原创 2021-04-05 17:56:23 · 347 阅读 · 0 评论 -
Class 文件结构
反汇编:javap -c xxxx.class 使用 -v 可以多打印一些信息Java 技术能够一直保持非常好的向后兼容性,这点 Class 文件结构的稳定性功不可没。class 文件结构的内容,绝大部分在 JDK1.2 时代就已经定义好了。每次基本上只是在原有结构基础上新增内容、扩充功能,并未对定义的内容做修改。任何一个Class 文件都对应着唯一一个类或接口的定义信息,但反过来说,Class 文件实际上它并不一定以磁盘文件的形式存在(比如可以动态生成、或者直接送入类加载器中)。Class 文件是一组原创 2021-04-05 16:51:42 · 137 阅读 · 1 评论 -
JVM GC
垃圾回收机制分代回收理论新生代:绝大部分的对象都是朝生夕死老年代:熬过多次垃圾回收的对象就越难回收GC 分类新生代回收(Minor GC/Young GC)老年代回收(Major GC/Old GC)只有 CMS 垃圾回收器会有这个单独的回收老年代的行为Major GC 有说指是老年代,有说是做整个堆的收集整堆回收(Full GC):收集整个 Java 堆和方法区(注意包含方法区)STW (Stop The World)进行垃圾回收时,必须暂停所有的工作线程,直到它回收结原创 2021-04-05 14:49:56 · 208 阅读 · 0 评论 -
JVM 简介
JVM 的两大特性:跨平台性跨语言性:只识别 class 文件JVM、JRE、JDK 的关系:常见的 JVM 实现:JVMHotspot目前使用的最多的 Java 虚拟机Jrocket原属 BEA 公司,曾号称世界上最快的 JVM,后被 Oracle 公司收购,合并于 HotspotJ9主要是用在 IBM 产品LiquidVM针对硬件的虚拟机TaobaoVMHotspot 的定制版,专门为淘宝准备的,阿里、天猫都是用的这款虚拟机zi原创 2021-04-04 23:13:43 · 141 阅读 · 0 评论 -
JVM 内存和对象分配
内存模型方法区(Method Area)假如两个线程都试图访问方法区中的同一个类信息,而这个类还没有装入 JVM,那么此时就只允许一个线程去加载它,另一个线程必须等待。方法区是 JVM 对内存的”逻辑划分”,在 HotSpot 虚拟机中:JDK1.7 及之前 ,使用永久代; JDK1.8 及以后使用元空间。JDK1.7 中将永久代的静态变量和运行时常量池转移到了堆中,其余部分则存储在非堆内存中JDK1.8 用元空间(class metadata)代替了之前的永久代,并且存储位置是本地内存,大小只原创 2021-04-04 22:47:19 · 249 阅读 · 0 评论