摘要: 在HotSpot VM中内嵌有两个JIT编译器,分别为Client Compiler和Server Compiler,但大多数情况下我们简称为C1编译器和C2编译器。开发人员可以通过如下命令显式指定Java虚拟机在运行时到底使用哪一种即时编译器,如下所示: -client: 指定Java虚拟机运行在 阅读全文
posted @ 2020-06-10 17:09 叮叮叮叮叮叮当 阅读(279) 评论(0) 推荐(0) 编辑
摘要: Java代码的执行分类: 第一种是将源代码编译成字节码文件,然后再运行时通过解释器将字节码文件转为机器码执行 第二种是编译执行(直接编译成机器码)。现代虚拟机为了提高执行效率,会使用即时编译技术(JIT,Just In Time)将方法编译成机器码后再执行 HotSpot VM是目前市面上高性能虛拟 阅读全文
posted @ 2020-06-10 17:03 叮叮叮叮叮叮当 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 解释器 JVM设计者们的初衷仅仅只是单纯地为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。 解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行 阅读全文
posted @ 2020-06-10 16:49 叮叮叮叮叮叮当 阅读(781) 评论(0) 推荐(0) 编辑
摘要: 概述 执行引擎是Java虚拟机的核心组成部分之一 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些 阅读全文
posted @ 2020-06-10 16:30 叮叮叮叮叮叮当 阅读(2912) 评论(0) 推荐(1) 编辑
摘要: 附:JVM学习目录 阅读全文
posted @ 2020-06-10 15:27 叮叮叮叮叮叮当 阅读(516) 评论(0) 推荐(0) 编辑
摘要: 有些人认为方法区(如Hotspot,虚拟机中的元空间或者永久代)是没有垃圾收集行为的,其实不然。《Java 虚拟机规范》对方法区的约束是非常宽松的,提到过可以不要求虚拟机在方法区中实现垃圾收集。事实上也确实有未实现或未能完整实现方法区类型卸载的收集器存在(如 JDK11 时期的 2GC 收集器就不支 阅读全文
posted @ 2020-06-10 15:25 叮叮叮叮叮叮当 阅读(1031) 评论(0) 推荐(0) 编辑
摘要: 过程 只有HotSpot才有永久代。 BEA JRockit、IBM J9等来说,是不存在永久代的概念的。原则上如何实现方法区属于虛拟机实现细节,不受《Java虚拟机规范》管束,并不要求统一 Hotspot中 方法区的变化: jdk1.6及之前:有永久代(permanent generation) 阅读全文
posted @ 2020-06-10 15:17 叮叮叮叮叮叮当 阅读(430) 评论(0) 推荐(0) 编辑
摘要: 《深入理解Java虚拟机》书中对方法区存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等 类型信息 对每个加载的类型( 类class、接口interface、枚举enum、注解annotation),JVM必须在方法区中存储以下类型信息: 这个类型的完 阅读全文
posted @ 2020-06-10 15:05 叮叮叮叮叮叮当 阅读(443) 评论(4) 推荐(0) 编辑
摘要: 配置 jdk7及以前: -XX:PermSize来设置永久代初始分配空间。默认值是20.75M -XX:MaxPermSize来设定永久代最大可分配空间。32位机器默认是64M,64位机器模式是82M 当JVM加载的类信息容量超过了这个值,会报异常OutOfMemoryError : PermGen 阅读全文
posted @ 2020-06-10 14:38 叮叮叮叮叮叮当 阅读(365) 评论(0) 推荐(0) 编辑
摘要: 堆、栈、方法区堆关系 概述 方法区与堆区一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的 方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢 阅读全文
posted @ 2020-06-10 14:24 叮叮叮叮叮叮当 阅读(1046) 评论(0) 推荐(0) 编辑
摘要: 引言 在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了 在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种 阅读全文
posted @ 2020-06-10 10:54 叮叮叮叮叮叮当 阅读(426) 评论(0) 推荐(0) 编辑
摘要: -XX:PrintFlagsInitial: 查看所有参数的默认初始值 -XX:PrintFlagsFinal:查看所有的参数的最终值(可能会存在修改,不再是初始值) 具体查看某个参数的指令: jps:查看当前运行中的进程 jinfo -flag SurvivorRatio 进程id(Survivo 阅读全文
posted @ 2020-06-10 10:09 叮叮叮叮叮叮当 阅读(267) 评论(0) 推荐(0) 编辑
摘要: TLAB产生的原因 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度 TLAB是什么 从内存模型而不是垃圾收集的角度,对Eden区域继续 阅读全文
posted @ 2020-06-10 09:56 叮叮叮叮叮叮当 阅读(786) 评论(0) 推荐(0) 编辑