随笔分类 - Java
摘要:先上结论: 一切互斥操作的依赖是 自旋锁(spin_lock),互斥量(semaphore)等其他需要队列的实现均需要自选锁保证临界区互斥访问。 而自旋锁需要xcmpchg等类似的可提供CAS操作的硬件指令提供原子性 和 可见性,(xcmpchg会锁总线或缓存行,一切会锁总线或缓存行的操作都会刷St
阅读全文
摘要:1.Java7 多线程 put put -> 容量到达上限 -> 扩容(resize) -> transfer (转移旧散列表上的节点到新散列表) 在 transfer 这一步,因为Java7 使用了头插法,可能会导致某个线程的新散列表的某个槽成环 本质问题是 假如一个线程已经 transfer 完
阅读全文
摘要:上述有三个队列,这些队列中的节点,都是线程包装成的 ObjectWaiter 在默认策略情况下: 1.entry_list 中的 节点是等待被唤醒的节点,持有重量级锁的线程执行 exit 方法(Java层面:退出上述 synchronized区或调用 wait()方法 会调用 (C++层面)exit
阅读全文
摘要:来年代的回收可分为 标记-压缩回收 和 标记清理回收 前者会将存活对象在对象头中打标,回收的时候,把被打标的对象复制到一块,使得存活对象在内存上是连续分布的。 需要注意的是,这里说的连续分布,不是物理意义上的,因为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
阅读全文
摘要:先给出结论:get,set两个方法都不能完全防止内存泄漏,还是每次用完ThreadLocal都勤奋的remove一下靠谱。 前言: 看到有的博客说在把ThreadLocal的所有强引用置空前,调用 set 或 get 方法的话,则可以防止这个失去所有强引用的ThreadLocal对应的value内存
阅读全文
摘要:仅供参考 Propagate 的作用: 学习AQS的过程中,发现Propagate这个状态并没有被显示地使用 比如 if(ws == PROPAGATE) { 操作 } 读了一些博客,感觉都是讲的模模糊糊,于是直接看源码。 当然,下面这篇文章也需要读者对源码有一定了解,本文不贴大量源码,因为本文不是
阅读全文
摘要:希望能帮到有需要的人,不要像我一样花费了许多时日 问题1: com.jetbrains.cidr.execution.debugger.backend.gdb.GDBDriver$GDBCommandException: Error creating process /cygdrive/f/jdk8
阅读全文
摘要:JDK8中的HashMap相对JDK7中的HashMap做了些优化。 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起 (如果你不想深入理解 请不要看括号里的内容,可以简化阅读过程) 首先,有一个问题:假如我们现在有一个容
阅读全文