随笔分类 - JVM
对JVM的学习总结记录
摘要:G1之前收集器的特点 年轻代和老年代是各自独立且连续的内存块 年轻代收集器使用 eden + S0 + S1 进行复制算法 老年代收集必须扫描整个老年代区域 都是以尽可能的少而快速地执行 GC 为设计原则 G1 是什么 G1 是一种面向服务端的垃圾收集器,应用在多核处理器和大容量内存环境中,在实现高
阅读全文
摘要:垃圾回收算法 复制 标记清除 标记整理 分代收集算法 垃圾回收器 串行垃圾回收器(Serial) 它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,所以不适合服务环境 并行垃圾回收器(Parallel) 多个垃圾收集线程并行工作,此时用户线程是暂停的,用于科学计算、大数据处理等弱
阅读全文
摘要:-Xms 初始大小内存,默认为物理内存 1/64 等价于 -XX:InitialHeapSize -Xmx 最大分配内存,默认为物理内存的 1/4 等价于 -XX:MaxHeapSize -Xss 设置单个线程栈的大小,一般默认为 512-1024k 等价于 -XX:ThreadStackSize
阅读全文
摘要:查看初始默认值:-XX:+PrintFlagsInitial HuandeMacBook-Air:~ huanliu$ java -XX:+PrintFlagsInitial [Global flags] uintx AdaptiveSizeDecrementScaleFactor = 4 {pro
阅读全文
摘要:标配参数 -version -help X 参数 -Xint:解释执行 -Xcomp:第一次使用就编译成本地代码 -Xmixed:混合模式 XX 参数 Boolean 类型:-XX:+ 或者 - 某个属性值(+ 表示开启,- 表示关闭) -XX:+PrintGCDetails:打印 GC 收集细节
阅读全文
摘要:什么是垃圾 简单来说就是内存中已经不在被使用到的空间就是垃圾 如何判断一个对象是否可以被回收 引用计数法(有循环引用无法回收的问题) 枚举根节点做可达性分析(Java采用的方式) 哪些对象可以作为 GC Roots 虚拟机栈(栈帧中的局部变量表)中引用的对象 方法区中的类静态属性引用的对象 方法区常
阅读全文
摘要:CountDownLatch 让一些线程堵塞直到另一个线程完成一系列操作后才被唤醒。CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被堵塞,其他线程调用 countDown 方法会将计数减一(调用 countDown 方法的线程不会堵塞),当计数其值
阅读全文
摘要:JVM学习目录 JVM的整体结构 1、类加载子系统 类加载子系统 2、运行时数据区 运行时数据区总览 堆、栈、方法区的详细图解 2.1、程序计数器 程序计数器 2.2、本地方法栈 本地方法栈 2.3、虚拟机栈 基础知识 栈帧的内部结构--局部变量表 栈帧的内部结构--操作数栈 栈帧的内部结构--动态
阅读全文
摘要:在HotSpot VM中内嵌有两个JIT编译器,分别为Client Compiler和Server Compiler,但大多数情况下我们简称为C1编译器和C2编译器。开发人员可以通过如下命令显式指定Java虚拟机在运行时到底使用哪一种即时编译器,如下所示: -client: 指定Java虚拟机运行在
阅读全文
摘要:Java代码的执行分类: 第一种是将源代码编译成字节码文件,然后再运行时通过解释器将字节码文件转为机器码执行 第二种是编译执行(直接编译成机器码)。现代虚拟机为了提高执行效率,会使用即时编译技术(JIT,Just In Time)将方法编译成机器码后再执行 HotSpot VM是目前市面上高性能虛拟
阅读全文
摘要:解释器 JVM设计者们的初衷仅仅只是单纯地为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。 解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行
阅读全文
摘要:概述 执行引擎是Java虚拟机的核心组成部分之一 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些
阅读全文
摘要:有些人认为方法区(如Hotspot,虚拟机中的元空间或者永久代)是没有垃圾收集行为的,其实不然。《Java 虚拟机规范》对方法区的约束是非常宽松的,提到过可以不要求虚拟机在方法区中实现垃圾收集。事实上也确实有未实现或未能完整实现方法区类型卸载的收集器存在(如 JDK11 时期的 2GC 收集器就不支
阅读全文
摘要:过程 只有HotSpot才有永久代。 BEA JRockit、IBM J9等来说,是不存在永久代的概念的。原则上如何实现方法区属于虛拟机实现细节,不受《Java虚拟机规范》管束,并不要求统一 Hotspot中 方法区的变化: jdk1.6及之前:有永久代(permanent generation)
阅读全文
摘要:《深入理解Java虚拟机》书中对方法区存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等 类型信息 对每个加载的类型( 类class、接口interface、枚举enum、注解annotation),JVM必须在方法区中存储以下类型信息: 这个类型的完
阅读全文
摘要:配置 jdk7及以前: -XX:PermSize来设置永久代初始分配空间。默认值是20.75M -XX:MaxPermSize来设定永久代最大可分配空间。32位机器默认是64M,64位机器模式是82M 当JVM加载的类信息容量超过了这个值,会报异常OutOfMemoryError : PermGen
阅读全文
摘要:堆、栈、方法区堆关系 概述 方法区与堆区一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的 方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢
阅读全文
摘要:引言 在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了 在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种
阅读全文
摘要:-XX:PrintFlagsInitial: 查看所有参数的默认初始值 -XX:PrintFlagsFinal:查看所有的参数的最终值(可能会存在修改,不再是初始值) 具体查看某个参数的指令: jps:查看当前运行中的进程 jinfo -flag SurvivorRatio 进程id(Survivo
阅读全文