随笔分类 - JVM
摘要:下载源码,安装 Cygwin、JDK 和 VS2010:https://www.cnblogs.com/jhxxb/p/12558970.html 创建 VS 工程 # 打开 CMD cd jdk8u\hotspot\make\windows C:\VS2010\VC\bin\amd64\vcvar
阅读全文
摘要:只是编译,不调试。 一、安装 Cygwin 32 位和 64 位都可以试试。 https://cygwin.com/install.html 把这些装上(https://hg.openjdk.java.net/jdk8u/jdk8u/raw-file/tip/README-builds.html)
阅读全文
摘要:Agent 为 JVMTI 的客户端。 这里记录的是基于Java Instrument 的 Agent 实现,还有直接基于 JVMTI 的 Agent 实现。 在 JDK1.5 以后,我们可以使用 Agent 技术构建一个独立于应用程序的代理程序,用来协助监测、运行甚至替换其他 JVM 上的程序。使
阅读全文
摘要:JPDA:Java 平台调试架构(Java Platform Debugger Architecture) 它是 Java 虚拟机为调试和监控虚拟机专门提供的一套接口。 一、JPDA https://docs.oracle.com/javase/8/docs/technotes/guides/jpd
阅读全文
摘要:Unsafe 是 sun.misc 包下的一个类,可以直接操作堆外内存,可以随意查看及修改 JVM 中运行时的数据,使 Java 语言拥有了类似 C 语言指针一样操作内存空间的能力。 Unsafe 的操作粒度不是类,而是内存地址和所对应的数据,增强了 Java 语言操作底层资源的能力。 一、获得 U
阅读全文
摘要:JVM 运行时内存结构(Run-Time Data Areas) 内存溢出分为两大类:OutOfMemoryError 和 StackOverflowError。 一、HeapOomError (JVM 堆内存溢出) -Xms:初始值 -Xmx:最大值 -Xmn:最小值 public static
阅读全文
摘要:原本想在 Windows 下编译调试,但过程中遇到了诸多错误(老是报路径错误。。。),最后只好放弃。(已成功搭建:https://www.cnblogs.com/jhxxb/p/12589712.html) 此次记录调试的方法为 CentOS7 上编译,Windows 上使用 Clion 远程调试(
阅读全文
摘要:一、概述 栈帧位置 JVM 执行 Java 程序时需要装载各种数据到内存中,不同的数据存放在不同的内存区中(逻辑上),这些数据内存区称作运行时数据区(Run-Time Data Areas)。 其中 JVM Stack(Stack 或虚拟机栈、线程栈、栈)中存放的就是 Stack Frame(Fra
阅读全文
摘要:synchronized 锁的优化过程:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 一、不同锁对象的状态表示(需要了解 Java 对象头) https://wiki.openjdk.java.net/display/HotSpot/Synchronization 二、关于 Lock Reco
阅读全文
摘要:synchronized 的实现方式是用 Monitor 进行加锁,这是一种互斥锁,为了表示它对性能的影响我们称之为重量级锁。 Java 的线程是映射到操作系统原生线程之上的,要阻塞或唤醒一个线程就需要操作系统的协助,让线程从用户态转换到内核态,而状态转换需要耗费 CPU 很多的时间。 锁优化仅在
阅读全文
摘要:synchronized 具有使每个线程依次排队操作共享变量的功能。这种同步机制效率很低,但 synchronized 是其它并发容器实现的基础。 一、锁对象及 synchronized 的使用 synchronized 通过互斥锁(Mutex Lock)来实现,同一时刻,只有获得锁的线程才可以执行
阅读全文
摘要:前提:内存屏障 内存屏障(Memory Barrier)与内存栅栏(Memory Fence)是同一个概念。 用于阻止指令重排序。保证了特定操作的执行顺序和某些变量的内存可见性。 JMM 内存屏障分为四类: Store:将处理器缓存的数据刷新到内存中。 Load:将内存存储的数据拷贝到处理器的缓存中
阅读全文
摘要:Java 内存模型(Java Memory Model,JMM)名字看上去和 Java 内存结构(JVM 运行时内存结构)差不多,但这两者并不是一回事。JMM 并不像 JVM 内存结构一样是真实存在的,它只是一个抽象的概念。 Java 的线程间通过共享内存(Java堆和方法区)进行通信,在通信过程中
阅读全文
摘要:垃圾收集器为垃圾收集算法的具体实现,是执行垃圾收集算法的,是守护线程。 HotSpot 虚拟机采用分代收集(JVM 规范并未对堆区进行划分),将堆分为年轻代和老年代,垃圾收集器也按照这样区分。不过已有通用垃圾收集器出现。 一、新生代垃圾收集器 Serial 垃圾收集器(单线程) 在垃圾收集过程中停止
阅读全文
摘要:程序计数器、虚拟机栈、本地方法栈随线程而生,随线程而灭。 栈帧随着方法的开始而入栈,随着方法的结束而出栈。 这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。 对于 Java 堆和方法区,只有在程序运行期间才能知道会创
阅读全文
摘要:jps # -l 输出主类全名或 jar 路径 # -q 只输出 LVMID # -m 输出 JVM 启动时传递给 main() 的参数 # -v 输出 JVM 启动时显式指定的 JVM 参数 jps -lmv jinfo # 查看 jvm 参数 jinfo pid # 修改 jvm 参数(仅支持可
阅读全文
摘要:类加载(类的生命周期) 类从被加载到虚拟机内存开始,到卸载出内存结束。 一、Creation and Loading(加载) JVM 需要完成 3 件事: 通过类的全限定名获取该类的二进制字节流。 将二进制字节流所代表的静态结构转化为方法区的运行时数据结构。 在内存中创建一个代表该类的 java.l
阅读全文
摘要:Java 虚拟机定义了在程序执行期间使用的各种运行时数据区域。 其中一些数据区域所有线程共享,在 Java 虚拟机(JVM)启动时创建,仅在 Java 虚拟机退出时销毁。 还有一些数据区域是每个线程的。线程数据区域是在线程启动时创建,线程结束时销毁。 一、运行时数据区划分(JDK8) 1、The p
阅读全文