05 2021 档案
摘要:1. 浅堆(Shallow Heap) 浅堆是指一个对象所消耗的内存。在32位系统中,一个对象引用会占据4个字节,一个int类型会占据4个字节,long型变量会占据8个字节,每个对象头需要占用8个字节。根据堆快照格式不同,对象的大小可能会同8字节进行对齐。 以String为例:2个int值共占8字节
阅读全文
摘要:5.1. GC分类 针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC) 部分收集(Partial GC):不是完整收集整个Java堆的垃圾收集。其中又分为: 新生代收集(Minor GC / Young
阅读全文
摘要:4.1. JVM参数选项 官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html 4.1.1. 类型一:标准参数选项 > java -help 用法: java [-options] class [ar
阅读全文
摘要:3.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限: 1.无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。 2.要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方
阅读全文
摘要:2.1. 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。 Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络
阅读全文
摘要:1.1. 大厂面试题 支付宝: 支付宝三面:JVM性能调优都做了什么? 小米: 有做过JVM内存优化吗? 从SQL、JVM、架构、数据库四个方面讲讲优化思路 蚂蚁金服: JVM的编译优化 jvm性能调优都做了什么 JVM诊断调优工具用过哪些? 二面:jvm怎样调优,堆内存、栈空间设置多少合适 三面:
阅读全文
摘要:4.1. 概述 类加载器是JVM执行类加载机制的前提。 ClassLoader的作用: ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的ja
阅读全文
摘要:3.1. 概述 在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 其中,验证、准备、解析3个部分统称为链接(Linki
阅读全文
摘要:2.1. 概述 2.1.1. 执行模型 如果不考虑异常处理的话,那么Java虚拟机的解释器可以使用下面这个伪代码当做最基本的执行模型来理解 do{ 自动计算PC寄存器的值加1; 根据PC寄存器的指示位置,从字节码流中取出操作码; if(字节码存在操作数) 从字节码流中取出操作数; 执行操作码所定义的
阅读全文
摘要:1. Class文件结构 1.1. Class字节码文件结构 类型 名称 说明 长度 数量 魔数 u4 magic 魔数,识别Class文件格式 4个字节 1 版本号 u2 minor_version 副版本号(小版本) 2个字节 1 u2 major_version 主版本号(大版本) 2个字节
阅读全文
摘要:GC 分类与性能指标 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 Java不同版本新特性 语法层面:Lamb
阅读全文
摘要:System.gc() 的理解 在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不
阅读全文
摘要:Java 和 C语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要程序员手动的收集。 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回
阅读全文
摘要:String的基本特性 String:字符串,使用一对 “” 引起来表示 String s1 = "atguigu" ; // 字面量的定义方式 String s2 = new String("hello"); // new 对象的方式 String被声明为final的,不可被继承 String实现
阅读全文
摘要:执行引擎概述 执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行
阅读全文
摘要:对象的实例化 大厂面试题 美团: 对象在JVM中是怎么存储的? 对象头信息里面有哪些东西? 蚂蚁金服: 二面:java对象头里有什么 对象创建的方式 new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法 Class的newInstance方法:在JDK
阅读全文
摘要:栈、堆、方法区的交互关系 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。 栈、堆、方法区的交互关系 下面涉及了对象的访问定位 Person 类的 .class 信息存放在方法区中 person 变量存放在 Java
阅读全文
摘要:堆的核心概述 堆与进程 堆针对一个JVM进程来说是唯一的。也就是一个进程只有一个JVM实例,一个JVM实例中就有一个运行时数据区,一个运行时数据区只有一个堆和一个方法区。 但是进程包含多个线程,他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区
阅读全文
摘要:虚拟机栈 简介 虚拟机栈的出现背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架构进行优化,但是跨平台性大大降低】。 优点是跨平台,指令集小,编译器容易实现,缺点是
阅读全文
摘要:运行时数据区概述及线程 前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载 –> 验证 –> 准备 –> 解析 –> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区 运行时数据区结构 运行时数
阅读全文
摘要:内存结构概述 简图 详细图 英文版 中文版 注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有 如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统 类加载器子系统作用: 类加载器子系统负责从文件系统或者网络中加载Class文件,class文
阅读全文
摘要:欢迎来到我的留言板 大道至简,知易行难。 花径不曾缘客扫,蓬门今始为君开。 从今天开始改变,这是对平庸生活最好的回击。 你好,我叫牧马人 😃
阅读全文
摘要:欢迎来到我的友链小屋 展示本站所有友情站点,排列不分先后,均匀打乱算法随机渲染的喔! 友链信息 博客名称:牧马人的小木屋博客网址:https://www.cnblogs.com/lvxueyang/ 博客头像:https://pic.cnblogs.com/avatar/1668252/201904
阅读全文
摘要:前言 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手。 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就JJ了。 每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优V
阅读全文