![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。
crazy-tiger
开弓没有回头箭
展开
-
操作系统线程的实现(基于JAVA)
读《深入理解Java虚拟机》第三版,周志明著。我们知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调用分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度。目前线程是 Java 里面进行处理器资源调度的最基本单位,不过如果日后 Loom 项目(https://wiki.openjdk.java.net/display/loom/Main)能成功为 Java 引入纤程(Fiber)的话,可能就会改变这一点。主流的操作系统都提供了线程实现,J.原创 2020-10-08 10:16:03 · 775 阅读 · 2 评论 -
什么是线程安全性(Java Concurrency in Practice)
当多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类时线程安全的。原创 2020-09-16 22:09:35 · 246 阅读 · 0 评论 -
Java 先行发生原则(Happens-Before)
先行发生原则可以判断数据是否存在竞争,线程是否安全。 如果两个操作之间缺乏 happens-before关系,那么 JVM 可以对它们任意地排序。原创 2020-09-16 03:08:05 · 517 阅读 · 0 评论 -
Java 内存模型(Java Memory Model)——深入理解Java虚拟机
读《深入理解Java虚拟机》第三版,周志明著,笔记。了解Java内存模型是开始Java并发编程的基础。官方文档 https://download.oracle.com/otndocs/jcp/memory_model-1.0-pfd-spec-oth-JSpec/《Java虚拟机规范》Java SE 6 https://docs.oracle.com/javase/specs/jvms/se6/html/Threads.doc.html在后续的jsr-133中定义有所差异,这里主要以书和虚拟机规范.原创 2020-09-15 03:43:31 · 280 阅读 · 0 评论 -
即时编译器优化技术列表
编译器策略、基于性能监控的优化技术、基于证据的优化技术、数据流敏感重写、语言相关的优化技术、内存及代码位置变换、循环变换、全局代码调整、控制流图变换https://wiki.openjdk.java.net/display/HotSpot/PerformanceTacticIndex原创 2020-09-13 20:51:30 · 262 阅读 · 0 评论 -
HotSpot虚拟机的分层编译(Tiered Compilation)
一、基本概念名词用于 HotSpot 虚拟机中。提前编译(Ahead Of Time,AOT)即时编译(Just In TIme,JIT)解释器(Interpreter)编译器(Compiler)客户端编译器(Client Compiler,C1)服务端编译器(Server Compiler,C2,也叫Opto编译器)Graal编译器(JDK 10 出现用于替代 C2)混合模式(Mixed Mode)默认解释模式(Interpreted Mode)-Xint编译模式(Com原创 2020-09-10 21:33:04 · 2592 阅读 · 0 评论 -
测试:插入式注解处理器
读《深入理解Java虚拟机》第三版,周志明著。记录第十章最后实战测试过程。一、插入式注解处理器使用JSR-296中定义的插入式注解处理器 API 对 Java 编译子系统的行为施加影响。具体通过继承 javax.annotation.processing.AbstractProcessor 抽象类实现。二、具体功能目标驼峰命名检查类或者接口:符合驼式命名法,首字母大写。方法: 符合驼式命名法,首字母小写。字段:类或实例变量。符合驼式命名法,首字母小写。常量。要求全部由大写字母或下.原创 2020-09-09 21:30:04 · 294 阅读 · 0 评论 -
IntelliJ IDEA 打开 OpenJDK 8 Javac 源码
最近在读《深入理解Java虚拟机》第三版,周志明著,第十章时,作者使用 Eclipse 编译了 Javac 的源码,但是我想用IntelliJ IDEA 编译一下平时使用的JDK 8 的 Javac 源码,测试一波,中途踩到了一些坑,一直没有办法编译,最后终于编译成功了,记录一下。准备IntelliJ IDEAJDK 8OpenJDK 源码第一步、获取源码官方下载。可以下载zip包,或者gz 都可以。下载后解压。https://hg.openjdk.java.net/jdk8/jdk8.原创 2020-09-07 03:57:19 · 2123 阅读 · 0 评论 -
手动实现远程执行功能(JDK8+SpringCloudFeign-Eureka)
最近读《深入理解Java虚拟机》第三版,周志明著时,发现第九章最后一个例子,实现远程执行功能。原文使用了Jsp和本地编译,现在后端大部分使用 Spring Cloud 做分布式,所以这里测试了一下使用Spring Cloud OpenFeign和spring-cloud-netflix Eureka Server需求分析如何编译提交到服务器的 Java 代码?如何执行编译之后的 Java 代码?如何收集 Java 代码的执行结果?思路一第一种,在服务器上编译,在 JDK 6 以后可以使.原创 2020-09-05 22:19:22 · 247 阅读 · 0 评论 -
一个简单的动态代理例子
读《深入理解Java虚拟机》第三版,周志明著。import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author hyl * @version v1.0: DynamicProxyTest.java, v 0.1 2020/9/3 19:45 $ */public class DynamicProxyTest {.原创 2020-09-03 20:09:50 · 284 阅读 · 0 评论 -
Java虚拟机方法调用字节指令(JDK 8)
读《深入理解Java虚拟机》第三版,周志明著。官方文档 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1.9.invokedynamic内容概述Java 虚拟机支持五种方法调用字节码:invokestatic。用于调用静态方法。invokespecial。用于调用实例构造器<init>()方法、私有方法和父类中的方法。invokevirtual。用于调用所有的虚方法。默认实例方法.原创 2020-09-02 00:03:36 · 271 阅读 · 0 评论 -
Java虚拟机运行时栈帧结构——深入理解Java虚拟机
读《深入理解Java虚拟机》第三版,周志明著。官方文档 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6概要说明Java 虚拟机以方法作为最基本的执行单元,“ 栈帧 ” (Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机.原创 2020-09-01 23:03:04 · 177 阅读 · 0 评论 -
INDY工具的使用(读深入理解java虚拟机验证)
什么是INDY由于invokedynamic指令所面对的使用者并非java语言,而是其他java虚拟机支持的动态语言,因此仅依靠java语言的编译器javac没有办法生成带有invokedynamic指令的字节码,所以要使用java语言来演示invokedynamic指令只能用一些变通的办法。John Rose编写了一个把程序的字节码转换未使用invokedynamic的简单工具INDY来完成这件事情,我们要用这个工具来产生最终要的字节码。代码验证转换类 InvokeDynamicTestimpor原创 2020-08-31 17:35:27 · 854 阅读 · 0 评论 -
双亲委派模型(Parents Delegation Model)(JDK 8)
类加载器的双亲委派模型在 JDK 1.2 时期被引入,并被广泛应用于此后几乎所有的 Java 程序中,但它并不是一个具有强制性的约束力的模型,而是 Java 设计者们推荐给开发者的一种加载器实现的最佳实践。一、类加载器Java 虚拟机设计团队有意把类加载阶段中的 “ 通过一个类的全限定名来获取描述该类的二进制字节流 ” 这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为 “ 类加载器 ”(Class Loader)。判断两个类的是否 .原创 2020-08-14 20:51:42 · 567 阅读 · 0 评论 -
class 类加载过程(JDK 8)
读《深入理解 Java 虚拟机》第三版,周志明著,笔记。官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html这里我采用官方给出的三个阶段来说明:加载(Loading)、连接(Linking)、初始化(Initializing)。一、加载(Loading)Java 虚拟机需要完成三件事情:通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中.原创 2020-08-13 13:00:48 · 366 阅读 · 0 评论 -
手工解读 Java 的 Class 文件(JDK8)
通过手工解析一个简单的 Java 程序所编译的 Class 文件,来了解,学习 Class 文件结构。一、工具准备原创 2020-08-07 17:45:50 · 591 阅读 · 0 评论 -
维基百科Java字节码表
维基百科Java字节码表转载 2020-08-07 07:29:34 · 519 阅读 · 0 评论 -
如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)
先看下效果左边是java代码,中间是字节码,右边是汇编。并且一一对应。一、使用的工具说明 操作系统 MacOS Java 版本 java version “1.8.0_231” IDE 使用 IntelliJ IDEA 2020.2 (使用其他完全可以) apache-maven-3.5.4 反汇编 HSDIS 查看工具 JITWatch二、准备工具重点准备后两个。2.1、HSDIS2.1.1、介绍HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反原创 2020-08-01 19:29:22 · 1614 阅读 · 3 评论 -
Java虚拟机工具总结
记录来自《深入理解Java虚拟机》第三版,周志明。一、命令行工具1.1、jps:虚拟机进程状况工具和 ps 命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。jps 命令格式:jps [ options] [ hostid ]jps 执行样例:C:\Users\jack>jps -l38560 sun.tools.jps.Jps35672 org.原创 2020-07-31 17:08:25 · 855 阅读 · 0 评论 -
Serial收集器的内存分配和回收的策略
对象优先在 Eden 区分配。大对象直接进入老年代。长期存在的对象将进入老年代。动态对象年龄判定。当 Survivor 空间中相同年龄对象大于 Survivor 空间的一半,直接进入老年代。空间分配担保。/** * 分配测试 * <p> * vm 参数:-Xms15M -Xmx15M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDi.原创 2020-07-29 14:42:09 · 156 阅读 · 0 评论 -
一个可以把windows系统跑死的Java程序——深入理解Java虚拟机
public class JavaVMStackOOM { private void dontStop(){ while (true){} } public void stackLeakByThread(){ while (true){ Thread thread = new Thread(){ ...原创 2018-07-23 23:16:28 · 321 阅读 · 2 评论 -
HotSpot虚拟机面向局部收集的收集器(G1、Shenandoah、ZGC)
HotSpot虚拟机进化到1.8以后虚拟机内的收集器越来越先进,越来越复杂。从G1到Shenandoah GC(OpenJDK)到ZGC。一、G1(Garbage First)G1 收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。1.1、内存布局G1 不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、.原创 2020-07-28 14:32:31 · 695 阅读 · 0 评论 -
三色标记(Tri-color marking)
原文https://en.wikipedia.org/wiki/Tracing_garbage_collection#TRI-COLORBecause of these performance problems, most modern tracing garbage collectors implement some variant of the tri-color marking abstraction, but simple collectors (such as the mark-and-swe翻译 2020-07-21 19:08:38 · 2114 阅读 · 0 评论 -
HotSpot虚拟机的经典垃圾收集器
读《深入理解Java虚拟机》第三版笔记。关系Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。如图:1、Serial 和 Serial Old 收集器2、ParNew 收集器3、Parallel Scavenge 和 Parallel Scavenge Old 收集器4、CMS (Concurrent Mark S.原创 2020-07-10 10:06:15 · 468 阅读 · 0 评论 -
理解java虚拟机内存收集
学习《深入理解Java虚拟机》时个人的理解笔记1、为什么要去了解垃圾收集和内存回收技术?当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。2、“哲学三问”内存收集what?when?how?那些内存需要回收?什么时候回收?如何回收?这是一个整体的问题,确定了什么状态的内存可以回收,才可以在内存“死”掉时及时地回收它们。只有了解了“死”掉内存的特性,才可以确定合理的回收方式。3、如何确定内存.原创 2020-07-06 13:58:56 · 132 阅读 · 0 评论 -
HotSpot虚拟机理解
这里写目录标题HotSpot虚拟机一、对象创建JVM参数说明对象头的一些信息二、对象的内存布局对象头实例数据对齐填充三、对象的访问定位HotSpot虚拟机一、对象创建new 指令 class。检查class是否被加载。java堆分配内存。对象内存空间初始化,对象头初始化。java的init方法。JVM参数说明-XX:+/-UseTLAB解决内存分配时线程安全两种方式对分配内存空间的动作进行同步处理——实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性。把内存分配原创 2020-05-23 04:05:02 · 494 阅读 · 1 评论 -
Java运行时数据区域——《深入理解Java虚拟机》
文章目录说明1.运行时数据区域1.1 程序计数器1.2 Java虚拟机栈1.3 本地方法栈1.4 Java堆1.5 方法区引用说明本文为我读《深入理解Java虚拟机》周志明著的读书笔记,不定期更新,并不作为学习的指导,如有需要请购买正版书籍学习。1.运行时数据区域这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有区域则依赖用户线程的启动和结束而建立和销毁。...原创 2020-05-04 03:00:29 · 337 阅读 · 0 评论