随笔分类 - JVM
摘要:JVM G1垃圾回收机制 简介 G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个J
阅读全文
摘要:JAVA并发-Thread.sleep(0)深入理解 Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。 通过调用 Thread.sleep(0) 的目的是为了让 GC 线程有机会被操作系统选中,从而进行垃圾清理的工作。它的副作用是,可能会更频繁地运行 GC,毕竟
阅读全文
摘要:简介 Java 程序运行时,JVM 会将 .class 字节码转换成机器能够识别的指令,指令转换过程会产生耗时,延缓程序的运行速度,为了解决这种问题出现了「JIT(即时编译)」技术。JIT 主要有两个功能: 缓存「Hot Spot Code(热点代码:频繁运行的方法或代码块)」对应的机器指令,方便下
阅读全文
摘要:JVM 三色标记 增量更新 原始快照 三色标记法 2.1 基本算法 要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象: 最终结果:A/D/E/F/G 可达 我们把遍历对象图过程中遇到的对象,按“是否访问过”这个条件标记成以下三种颜色: 白色:尚未访问过。 黑色:
阅读全文
摘要:基本概念 指针碰撞 一般情况下,JVM的对象都放在堆内存中(发生逃逸分析除外)。当类加载检查通过后,Java虚拟机开始为新生对象分配内存。如果Java堆中内存是绝对规整的,所有被使用过的的内存都被放到一边,空闲的内存放到另外一边,中间放着一个指针作为分界点的指示器,所分配内存仅仅是把那个指针向空闲空
阅读全文
摘要:内置锁(ObjectMonitor) Monitor可以理解为一个同步工具或一种同步机制,通常被描述为一个对象。每一个Java对象就有一把看不见的锁,称为内部锁或者Monitor锁。 通常所说的对象的内置锁,是对象头Mark Word中的重量级锁指针指向的monitor对象,该对象是在HotSpot
阅读全文
摘要:JAVA 对象头分析及Synchronized锁 对象内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分: Mark
阅读全文
摘要:JVM-卡表(Card Table) 简介 现代JVM,堆空间通常被划分为新生代和老年代。由于新生代的垃圾收集通常很频繁,如果老年代对象引用了新生代的对象,那么,需要跟踪从老年代到新生代的所有引用,从而避免每次YGC时扫描整个老年代,减少开销。 对于HotSpot JVM,使用了卡标记(Card M
阅读全文
摘要:JAVA对象方法-wait 最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java中所有对象的基类,其存在的价值不言而喻,其中wait和notify方法的实现多线程协作提供了保证。 案例 public class WaitTestDemo { publ
阅读全文
摘要:垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况发生。 提升失败(promotion failed) 在 Minor GC 过程中,Survivor Unuse
阅读全文
摘要:BTrace简介 GitHub地址: "BTrace" 下载地址: "v1.3.11.3" 官方使用教程: "Btrace使用教程" 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存在以下问题的时候,可以用 BTrace。 1. 比如哪些方法执行太慢,例如监控执行
阅读全文
摘要:本文主要是对《深入理解java虚拟机 第二版》第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分。 简述 说到垃圾收集(Garbage Collection,GC),很多人可能会认为这是 Java 自有的特性,曾经我也一度这样想,后来才知道 GC 的历史要远远长于
阅读全文
摘要:代码: public class HeapTest { private static final int _1M = 1024 * 1024; public static void main(String[] args) throws InterruptedException { System.gc
阅读全文
摘要:CMS垃圾回收机制 简介 Concurrent Mark Sweep,是一款基于并发、使用标记清除算法的垃圾回收算法,只针对老年代进行垃圾回收。CMS收集器工作时,GC工作线程和用户线程可以并发执行,以达到降低STW时间的目的。 开起VM选项-XX:+UseConcMarkSweepGC,表示对老年
阅读全文
摘要:Java Volatile关键字 以及long,double在多线程中的应用 概念: volatile关键字,官方解释:volatile可以保证可见性、顺序性、一致性。 可见性:volatile修饰的对象在加载时会告知JVM,对象在CPU的缓存上对多个线程是同时可见的。 顺序性:这里有JVM的内存屏
阅读全文
摘要:CPU高速缓存/伪共享 Code: public class Main { static long[][] arr; public static void main(String[] args) { long sum = 0L; arr = new long[1024 * 1024][8]; //
阅读全文
摘要:简介: java启动参数共分为三类; 其一是 标准参数 ( ),所有的JVM实现都必须实现这些参数的功能,而且向后兼容; 其二是 非标准参数 ( X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容; 其三是 非Stable参数 ( XX),此类参数各个jvm实现会
阅读全文
摘要:打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions 文件,需针对不同的JDK进行配置: 采用CMS垃圾回收配置: -server -Xms1024m -Xmx2048m -XX:MaxPermSize=1024m -XX:ReservedCodeCacheSize=5
阅读全文
摘要:JVM内存区域模型: 线程私有的 程序计数器:程序计数器是一块较小的区域,可以看做是当前线程所执行的字节码的行号指示器,是Java虚拟机中唯一没有定义OutOfMemory异常的区域。 虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作
阅读全文
摘要:Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack Stack的特点为LIFO,即后进先出(Last in, first out)。 一般与之比较的是队列Queue,队列是两个口,先进先出。 二:内存区域 系统一般在内存中划分出两种不同的内存空间,一种是S
阅读全文