随笔分类 - JVM
摘要:仅供参考,如有不妥之处,请多指正 在网上看到许多博客说 java 的 volatile 修饰的 double 和 long 在 32 位机上也是保证原子性的。 但是没有说明为什么,怎么具体实现,是使用互斥量吗,但是要访问的 volatile 修饰的 long,double 变量的地址是随机的,而且数
阅读全文
摘要:先上结论: 一切互斥操作的依赖是 自旋锁(spin_lock),互斥量(semaphore)等其他需要队列的实现均需要自选锁保证临界区互斥访问。 而自旋锁需要xcmpchg等类似的可提供CAS操作的硬件指令提供原子性 和 可见性,(xcmpchg会锁总线或缓存行,一切会锁总线或缓存行的操作都会刷St
阅读全文
摘要:Chunk HandlArea 等继承了 CheapObj 的类,都是需要重载 new,delete 等方法的,而这些new,delete方法,其实就是 平常C的 malloc (通过os::malloc)和 free(通过os::delete)方法 而JVM的Heap对象堆和上面的C堆是不同概念
阅读全文
摘要:上述有三个队列,这些队列中的节点,都是线程包装成的 ObjectWaiter 在默认策略情况下: 1.entry_list 中的 节点是等待被唤醒的节点,持有重量级锁的线程执行 exit 方法(Java层面:退出上述 synchronized区或调用 wait()方法 会调用 (C++层面)exit
阅读全文
摘要:1.偏向锁的获取逻辑主要在汇编实现的 biased_locking_enter 方法中 请求线程进入这个方法之后,会直接判断锁依赖对象的对象头是否有 偏向锁 成分(101是偏向锁成分)。 如果没有,直接跳出,退出后直接尝试把自己栈上的BiasLock 地址写入对象头,写入成功的前提是锁依赖对象没加锁
阅读全文
摘要:来年代的回收可分为 标记-压缩回收 和 标记清理回收 前者会将存活对象在对象头中打标,回收的时候,把被打标的对象复制到一块,使得存活对象在内存上是连续分布的。 需要注意的是,这里说的连续分布,不是物理意义上的,因为JVM向操作系统申请老年代和年轻代这样的大块内存时,使用的是mmap系统调用,操作系统
阅读全文
摘要:下图的 各个区域的 C++ 实现是 一般情况下的 年轻代的计算是会动态调整的,假如年龄阈值是 3 的对象占用了 Survivor (为什么不是 eden+survivor?) 的 50%以上 并且年轻代对象的年龄是 1 ~ 5 并且一开始设置的年龄阈值是 15, 那么年龄阈值将被调整到 3 下次 y
阅读全文
摘要:图解分析:https://www.cnblogs.com/lqlqlq/p/13912325.html Hotspot为每一个代 都设置了 各自的 level,也就是等级,年轻代 level 一般为 0, 老年代 level 一般为 1。 在默认的年轻代(/vm/memory/defNewGener
阅读全文
摘要:代码图片来自:https://blog.csdn.net/qq_31865983/article/details/103788358 VM_Thread 就是大家平时说的 JVM线程,只有一个实例,也就是虚拟机创建过程中只会被创建一次(C++层面),并且在虚拟机销毁的时候被销毁 具体的作用是 开启一
阅读全文
摘要:JVM 在解释模式下使用的比较多的是模板解释器,该解释器将每个字节码都用一段汇编代码表示,并且给出这段汇编代码的入口地址 实际上字节码在JVM中可执行的对等表示即 这段汇编。字节码是从C++层面的Method对象的ConstMethod对象中的code内存段(字节码内存段) 获取的,Class文件解
阅读全文
摘要:希望能帮到有需要的人,不要像我一样花费了许多时日 问题1: com.jetbrains.cidr.execution.debugger.backend.gdb.GDBDriver$GDBCommandException: Error creating process /cygdrive/f/jdk8
阅读全文