JVM系列-01-1、内存与垃圾回收篇---JVM与Java体系结构
JVM系列-第1章-JVM与Java体系结构。
JVM系列-26-3、性能监控与调优篇---JVM常用参数设置与GC日志分析
JVM运行时参数 JVM 参数选项类型 类型一:标准参数选项 特点 比较稳定,后续版本基本不会变化,以-开头。 各种选项 运行 Java 或者 java -help 可以看到所有的标准选项。 补充内容:-server 与 -client HotSpot JVM 有两种模式,分别是 server 和 client,分别通过 -server 和 -client 模式设置: 在 32 位 Windows 系统上,默认使用 Client 类型的 JVM。要想使用 Server 模式,则机器配置至少有 2 个以上的 CPU 和 2G 以上的物理内存。Client 模式适用于对内存要求较小的桌面应用程序,默认使用 Serial 串行垃圾收集器。 64 位机器上只支持 Server 模式的 JVM,适用于需要大内存的应用程序,默认使用并行垃圾收集器。 关于 Server 和 Client 的官网介绍为:https://docs.oracle.com/javase/8/docs/techontes/guides/vm/server-class.html 类型二:-X 参数选项 特点 非标准化参数, ...
JVM系列-22-3、性能监控与调优篇---性能调优概述、部分命令行与GUI监控与诊断工具、再谈内存泄漏
性能调优概述 大厂面试题 支付宝: 1支付宝三面:JVM 性能调优都做了些什么? 小米: 12有做过 JVM 内存优化吗?从 SQL、JVM、架构、数据库四个方面讲讲优化思路 蚂蚁金服: 12345JVM 的编译优化JVM 性能调优都做了什么?JVM 诊断调优工具用过哪些?二面:JVM 怎样调优,堆内存、栈空间设置多少合适?三面:JVM 相关的分析工具使用过的有哪些?具体的性能调优步骤是什么? 阿里: 12如何进行 JVM 调优?有哪些方法?如何理解内存泄漏问题?有哪些情况会导致内存泄漏?如何解决? 字节跳动: 1三面:JVM 如何调优、参数怎么调? 拼多多: 1从 SQL、JVM、架构、数据库四个方面讲讲优化思路 京东: 12345JVM 诊断调优工具用过哪些?每秒几十万并发的秒杀系统为什么会频繁发生 GC?日均百万级交易系统如何优化 JVM?线上生产系统 OOM 如何监控及定位与解决?高并发系统如何基于 G1 垃圾回收器优化性能? 背景说明 生产环境中的问题 生产环境繁盛了内存溢出该如何处理? 生产环境应该给服务器分配多少内存合适? 如何对垃圾回收器的性能进行调优? 生产环境 C ...
JVM系列-20-2、字节码与类加载篇---类的加载过程详解【概述、Class文件结构、javap】
类的加载过程详解概述 在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。 按照 Java 虚拟机规范,从 Class 文件到加载到内存中的类,到类卸载出内存位置,它的整个生命周期包括如下七个阶段: 其中,验证、准备、解析 3 个部分统称为链接(Linking)。 从程序中类的使用过程看: 大厂面试题 蚂蚁金服: 描述一下 JVM 加载 Class 文件的原理机制? 一面:类加载过程 百度: 类加载的机制 Java 类加载过程? 简述 Java 类加载机制? 腾讯: JVM 中类加载机制,类加载过程? 滴滴: JVM 类加载机制 美团: Java 类加载过程 描述一下 JVM 加载 Class 文件的原理机制 过程一:Loading(加载)阶段 加载完成的操作 加载的理解 所谓加载,简而言之就是将 Java 类的字节码文件加载到机器内存中,并在内存中构建出 Java 类的原型——类模板对象。所谓类模板对象,其实就是 Java 类在 JVM 内存中的一个快照,JVM 将从字节码文件中解析出的常量池、类字段、类方法等信息 ...
JVM系列-18-2、字节码与类加载篇---Class文件结构【概述、Class文件结构、javap】
1、Class 文件结构概述 字节码文件的跨平台性 Java 语言,跨平台的(write once,run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译。 这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp 等有强大的解释器。 跨平台似乎已经快称为一门语言必选的特性。 Java 虚拟机:跨语言的平台 Java 虚拟机不和包括 Java 在内的任何语言绑定,它只与"Class 文件"这种特定的二进制文件格式所关联。无论使用何种语言进行软件开发, 只要能将源文件编译为正确的 Class 文件,那么这种语言就可以在 Java 虚拟机上执行,可以说,统一而强大的 Class 文件结构,就是 Java 虚拟机的基石、桥梁。 https://docs.oracle.com/javase/specs/index.html,所有的 JVM 全部遵守 Java 虚拟机规范,也就是说所有的 JVM 环境都是一样的, 这样一来字节码文件可以在各种 JVM 上进行。 想要让一个 Java 程序正确地运行在 JVM 中, ...
JVM系列-16-1、内存与垃圾回收篇---垃圾回收器【GC分类与性能指标、Serial回收器、ParNew回收器、Parallel回收器、CMS回收器、G1回收器、GC日志分析】
垃圾回收器 1、GC 分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的 JVM 来实现。 由于 JDK 的版本处于高速迭代过程中,因此 Java 发展至今已经衍生了众多的 GC 版本。 从不同角度分析垃圾收集器,可以将 GC 分为不同的类型。 Java 不同版本新特性 语法层面:Lambda 表达式、switch、自动拆箱装箱、enum API 层面:Stream API、新的日期时间、Optional、String、集合框架 底层优化:JVM 优化、GC 的变化、元空间、静态域、字符串常量池位置变化 垃圾收集器分类 按线程数分 按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是在同一时间段内只允许有一个 CPU 用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。 在诸如单 CPU 处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器。所以,串行回收默认被应用在客户端的 Client 模式下的 JVM 中。 在并发能力比较强的 CPU 上, ...
JVM系列-15-1、内存与垃圾回收篇---垃圾回收相关算法【标记阶段与清除阶段算法、finalization机制、分代收集算法、增量收集算法】
垃圾回收相关算法 目录 1、标记阶段:引用计数算法 2、标记阶段:可达性分析算法 3、对象的finalization机制 4、MAT与Jprofiler的GC Roots溯源 5、清除阶段:标记-清除算法 6、清除阶段:复制算法 7、清除阶段:标记-压缩算法 8、小结 9、分代收集算法 10、增量收集算法、分区算法 垃圾标记阶段概述 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC 才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在 JVM 中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。 判断对象存活一般有两种方式:引用计数算法和可达性分析算法。 标记阶段:引用计数算法 引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。 对于一个对象 A,只要有任何一个对象引用了 A,则 A 的引用计数器 ...
JVM系列-14-1、内存与垃圾回收篇---垃圾回收【概述(面试题)、相关概念(System.gc()理解、内存溢出与内存泄露、STW、垃圾回收的并行与并发、安全点与安全区域、引用)】
垃圾回收概述 概念 这次我们主要关注的是黄色部分,内存的分配与回收: 什么是垃圾? 在提到什么是垃圾之前,我们先看下面一张图: 从上图我们可以很明确的知道,Java 和 C++ 语言的区别,就在于垃圾收集技术和内存动态分配上,C 语言没有垃圾收集技术,需要我们手动的收集。 垃圾收集,不是 Java 语言的伴生产物。早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp 语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。 什么是垃圾? 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。 磁盘碎片整理 机械 ...
JVM系列-13-1、内存与垃圾回收篇---StringTable【String基本特性、内存分配、串拼接操作、intern()】
StringTable目录 1、String的基本特性 2、String的内存分配 3、String的基本操作 4、字符串拼接操作 5、intern()的使用 6、StringTable的垃圾回收 7、G1中的String去重操作 String 的基本特性 String:字符串,使用一对 "" 引起来表示 String s1 = "mogublog"; // 字面量的定义方式 String s2 = new String("moxi"); String 声明为 final 的,不可被继承 String 实现了 Serializable 接口:表示字符串是支持序列化的。实现了 Comparable 接口:表示 String 可以比较大小 String 在 JDK 8 及以前内部定义了final char[] value 用于存储字符串数据。JDK 9 时改为 byte[] 为什么 JDK 9 改变了结构 String 类的当前实现将字符存储在 char 数组中,每个字符使用两个字节(16 位)。从许多不同的应用程序收集的数据表明,字符串是堆使用的主要组成部分,而且,大多数字符串 ...
JVM系列-12-1、内存与垃圾回收篇---执行引擎【解释器、编译器(热点探测技术、JIT分类)】
执行引擎 目录 执行引擎概述 执行引擎属于 JVM 的下层,里面包括解释器、及时编译器、垃圾回收器。 执行引擎是 Java 虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。 那么,如果想要让一个 Java 程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM 中的执行引擎充当了将高级语言翻译为机器语言的译者。 执行引擎的工作流程 执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于 PC 寄存器。 每当执行完一项指令 ...