write and debug by 张艳涛 wait()和notify()的通常用法 A线程取得锁,执行wait(),释放锁; B线程取得锁,完成业务后执行notify(),再释放锁; B线程释放锁之后,A线程取得锁,继续执行wait()之后的代码: 关于synchronize修饰的代码块通常,对于synchronize(lock){-}这样的代码块,编译后会生成monitorenter和monitorexit指令,线程执行到monitorenter指令时会尝试取得lock对应的monitor…
drawwed by 张艳涛 and get info from openjdk8 还有一个图…
t点击上方"涤生的博客",关注我 转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注. 前言 本文内容是基于 JDK 8 在文章 JVM 源码解读之 CMS GC 触发条件 中分析了 CMS GC 触发的五类情况,并且提到 CMS GC 分为 foreground collector 和 background collector.不管是 foreground collector 还是 background collector 使用的都是 mark-sweep 算法,分阶段…
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Java对象头实现 HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头.实例数据和对齐填充. 对象头 对象头包括两部分:Mark Word 和 类型指针. Mark Word Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳等等,占用内存大小与虚拟机位长一致.…
之前分析的已经加载的.Class文件中都没有Static 静态变量,所以也就没这部分的解析,自己也是不懂hotspot 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对于,java.lang.String的Class文件进行解析,String类有5个变量,其中有俩个静态变量 private final char value[]; private int hash; // Default to 0 private static final long serialVe…
写一个java文件 public static void main(String[] args) { String str1="abc"; String str2 ="abc"; String str3=new String("abc"); boolean b1= str1==str2; boolean b2= str1==str3; } 查看字节码code 0 ldc #4 <abc> 2 astore_1 3 ldc #4 <…
粘贴源码 package com.test; import java.util.Random; public class Test { static int number=12; private int age; private String name; public Test(int i, String string) { // TODO Auto-generated constructor stub this.age=i; this.name=string; } public Test()…
CAS的意思是campare and sweep比较交换 这个如果不用代码会比较抽象,那么在源码中进行解释 void ATTR ObjectMonitor::enter(TRAPS) { // The following code is ordered to check the most common cases first // and to reduce RTS->RTO cache line upgrades on SPARC and IA32 processors. Thread * c…
源码中对于枚举类型WKID的使用 static bool initialize_wk_klass(WKID id, int init_opt, TRAPS); static void initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS); static void initialize_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) { int limi…