-
局部变量表中槽的问题
jvm的槽为啥是32位,64JVM也是32位呢 1. 什么是 JVM 的“槽”(slot) 在 Java 虚拟机中,局部变量表(Local Variable Table) 是方法栈帧的一部分。 它由一组 slot(槽位) 组成,每个 slot 的基本单位是 32 位(4字节)。 slot 可以存放: int, float, reference, returnAddress 等单槽类型。 long,…- 53
- 0
-
jvm的垃圾回收是如何暂停所有线程的
jvm的垃圾回收是如何暂停所有线程的 1. 为什么需要暂停线程? GC 需要对堆内存中的对象做可达性分析(reachability analysis),判断哪些对象是垃圾。如果应用线程(Mutator Threads)还在继续运行,就可能: 在 GC 标记过程中修改对象引用,导致结果不一致; 在对象回收时还在访问已被标记回收的对象。 因此,GC 必须让所有应用线程在某个点暂停,保证堆结构的一致性。…- 70
- 0
-
既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?
🧠 为什么 MESI 协议并不足以保证 Java 中的“可见性”语义? 1. MESI 是硬件层级的缓存一致性,volatile 是语言层级的可见性保证 MESI 主要解决“同一物理地址在多核缓存中的副本一致性问题”; 根据MESI,CPU某核(假设CPU0)的缓存行(包含变量x)是M S 或E的时候,如果总线嗅探到了变量x被其其他核(比如CPU1)执行了写操作(remote write)那么CP…- 41
- 0
-
HashMap负载因子
HashMap 1. Hash 冲突后的数据结构变化(JDK8 之后的优化) 在 JDK8 之前,HashMap 发生冲突后使用的是链表结构,导致在极端情况下时间复杂度退化为 O(n)。 JDK8 开始引入红黑树结构优化: 当某个桶(链表)中的元素个数超过 TREEIFY_THRESHOLD = 8 且容量超过 MIN_TREEIFY_CAPACITY = 64 时,该桶的链表会被转化为红黑树; …- 55
- 0
-
-
java.sleep()
java的thread.sleep方法是会响应中断的,cpu会使用定时器,定时器到时会触发中断让cpu调度这个线程,但是我不明白java中将线程设置中断,为什么sleep可以响应中断指令,是怎么做到的? Java 的 Thread.sleep() 为什么可以响应 interrupt()? 在 Java 中,Thread.sleep() 会放弃 CPU 执行权,并由 硬件定时器 触发中断来唤醒线程。…- 98
- 0
-
JDK12新特性及旧版本变更
新的字符串和文件方法 在 Java 11 中,我们已经获得了一些新的 String 方法,以及Files.readString() 和 writeString() 方法。而在 Java 12,JDK 开发人员对这两个类进一步扩展,新增了一些实用的方法。 String.indent() —— 方便的字符串缩进 在 Java 12 之前,如果我们想给字符串添加缩进,通常需要编写一个辅助方法,在字符串前…- 106
- 0
-
java-11-features
Lambda 参数的局部变量语法 JDK 增强提案 323允许在隐式类型 lambda 表达式的中使用“var”关键字。 先来看 显式类型 的 Lambda 表达式。在下面的代码中,参数 l 和 s 的类型 被明确声明(List<String> 和 String): (List<String> l, String s) -> l.add(s); 然而,Java 编译器…- 120
- 0
-
java-10-features
局部变量类型推断("var") 从 Java 10 开始,我们可以使用关键字 var 来声明局部变量(局部意味着在方法内部)。例如,以下定义是允许的: var i = 10; var hello = "Hello world!"; var list = List.of(1, 2, 3, 4, 5); var httpClient = HttpClient.n…- 97
- 0
-
Java 生态下想搞大流量下的 ws,是不是暂时只能 netty?
最近项目想上直播和拍卖业务,自身流量也是比较大,想问下目前业界 ws 方案下是不是更推荐 netty 或者有没有其他可以参考的方案呢? 直播推流这快准备用阿里云的,直播上会用到 ws 的也就是评论,拍卖可能就是出价和评论。 1. 使用 Netty 的建议 sagaxu:不要直接用 Netty,建议使用 Vert.x 或者 Quarkus。 wxw752:我们公司使用 Netty 处理 WebSoc…- 60
- 0
-
生产OOM排查
简化版代码: package com.mystic.ycc.blog.test; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre…- 101
- 0
-
线程和同步性能
线程和同步性能 线程和硬件 💡 CPU 增加线程并不能使应用程序性能倍增 任务被提交到一个队列(可能不止一个队列),然后一定数量的线程会从队列中取出任务并执行它们 线程池的大小对实现最佳性能至关重要 在某些情况下,过大的线程池会导致性能急剧下降 线程池大小应根据系统负载、CPU 和 I/O 任务比例来决定 线程数超出 CPU 数量可能会降低吞吐量 💡 CPU 不是瓶颈,外部资源是瓶颈时,增加的线程…- 87
- 0
-
JDK 8 到 JDK 23 的 语法糖(语言特性) 和 垃圾回收(GC)优化
JDK 8 到 JDK 23 的 语法糖(语言特性) 和 垃圾回收(GC)优化 语法糖(语言特性)演进 从 Lambda 表达式到模式匹配,Java 逐步引入更简洁的语法和现代编程范式。 JDK 8(2014) Lambda 表达式: List list = Arrays.asList("a", "b", "c"); list.forEa…- 131
- 0
-
关于 JDK 不同版本对 指令集支持
关于 JDK 不同版本对 指令集支持 1. JDK 8(2014年) 指令集支持: 基线指令集:主要针对 SSE2/SSE4.1/AVX1(如 Intel Haswell 之前的处理器)。 不支持 AVX-512(Skylake 及之后的新指令集)。 AES-NI 深度优化(仅部分支持)。 向量化运算优化有限。 适用场景: 传统企业应用,无需高性能计算。 兼容性优先,不追求最新硬件性能。 2. J…- 168
- 0
-
JAVA 对象头分析及Synchronized锁
JAVA 对象头分析及Synchronized锁 对象内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 [] 从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分: Mark Word(标记字段):对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻…- 447
- 0
-
问题排查
问题排查 JDK自带的定位问题的工具? jps jps是jdk提供的一个查看当前java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写。 jps –l # 输出输出完全的包名,应用主类名,jar的完全路径名 jstack jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。 # 基本…- 117
- 0
-
Java性能权威指南学习笔记-1
Java性能权威指南学习笔记-1 导论 JVM调优标志 布尔标志 -XX:+FlagName 表示开启 -XX:-FlagName 表示关闭 附带参数的标志 -XX:FlagName=something,表示将标志flagName的值设置为something Client和Server类虚拟机 Java的自动优化前提是机器被分为"Client"和"Server&quo…- 641
- 0
-
Java性能权威指南学习笔记-2
垃圾收集器入门 最主流的四个垃圾收集器 Serial收集器(常用于单CPU环境) Throughput(或Parallel)收集器 Concurrent收集器(CMS) G1收集器 垃圾收集器概述 所有应用线程都停止运行所产生的停顿被称为时空停顿(stop-the-world)。 垃圾收集由两步构成:查找不再使用的对象,以及释放这些对象所管理的内存。 分代垃圾收集器 根据情况将堆划分成不同的代(G…- 525
- 0
-
synchronized 锁机制的分析和验证
synchronized 锁机制的分析和验证 原文:https://www.moralok.com/2023/12/19/analysis-and-verification-of-the-synchronized-lock-mechanism/ 本文详细介绍了 Java 中 synchronized 锁的机制、存储结构、优化措施以及升级过程,并通过 jol-core 演示 Mark Word 的变…- 915
- 0
-
arthas使用
arthas使用 获取当前的实例属性值 vmtool 测试使用的类 @Service public class UserService { @Value("${user.default.pwd}") private String userDefaultPwd; } 配置文件 [可以使用appllo或者其他支持热更新配置的框架来测试属性是否刷新成功] user: default:…- 574
- 0
-
如何看懂字节码文件
如何看懂字节码文件 测试使用的类 public class Test { public int i; public long y; } 基础概念 每个Class文件的头4个字节被称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。不仅是Class文件,很多文件格式标准中都有使用魔数来进行身份识别的习惯,譬如图片格式,如GIF或者JPEG等在文件…- 531
- 0
-
JHSDB:基于服务性代理的调试工具
JHSDB:基于服务性代理的调试工具 JHSDB是一款基于服务性代理(Serviceability Agent,SA)实现的进程外调试工具。服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言(含少量JNI代码)实现的API集合。服务性代理以HotSpot内部的数据结构为参照物进行设计,把这些C++的数据抽象出Java模型对象,相当于HotSpot的C++代…- 598
- 0
-
JVM GC 的安全点与安全区域
JVM GC 的安全点与安全区域 OopMap JVM 采用的可达性分析法有个缺点,就是从 GC Roots 找引用链耗时。 都说他耗时,他究竟耗时在哪里? GC 进行扫描时,需要查看每个位置存储的是不是引用类型,如果是,其所引用的对象就不能被回收;如果不是,那就是基本类型,这些肯定是不会引用对象的;这种对 GC 无用的基本类型的数据非常多,每次 GC 都要去扫描,显然是非常浪费时间的。 而且迄今…- 1.4k
- 0
-
Java性能权威指南学习笔记-3
原生内存最佳实践 内存占用 概述 JVM也会为内部操作分配一些内存,这些非堆内存就是原生内存 应用中也可以分配原生内存(通过JNI调用malloc()和类似方法,或者是使用New I/O,即NIO时) JVM使用的原生内存和堆内存的总量,就是一个应用总的内存占用(Footprint) 测量内存占用 之所以存在已分配内存和保留内存之分,使用JVM(及所有程序)管理内存的方式导致的 线程栈是个例外。J…- 615
- 0