JVM
文章平均质量分 88
未来影子
曾先后在百度、理想、快手参与研发工作
后端、大数据、NLP学习者
展开
-
JVM面试
基本概念:JVM是可运行Java代码的假想计算机,包括一套字节码指令集,一组寄存器、一个栈、一个垃圾回收、堆和一个存储方法域。JVM运行在操作系统上,与硬件没有直接交互运行过程:java源文件通过编译器生成相应的Class文件(字节码文件),字节码文件又通过Java虚拟机中的解释器编译成特定机器上的机器码每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是为什么JAVA能够跨平台的原因。当一个程序开始运行,此时虚拟机开始实例化,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡原创 2022-06-07 10:19:35 · 212 阅读 · 0 评论 -
第二十一篇_类的加载器
蚂蚁金服:深入分析 ClassLoader,双亲委派机制类加载器的双亲委派模型是什么?一面:双亲委派机制及使用原因百度:都有哪些类加载器,这些类加载器都加载哪些文件?手写一个类加载器 DemoClass 的 forName(“java.lang.String”) 和 Class 的 getClassLoader() 的 loadClass(“java.lang.String”)有什么区别?腾讯:什么是双亲委派模型?类加载器有哪些?小米:滴滴:简单说说你了解的类加载器一面:讲一下双亲委派模型,以及其优点字节跳原创 2022-06-02 13:32:01 · 157 阅读 · 0 评论 -
第二十篇_类加载过程详解
文章目录概述过程一:Loading(加载阶段)加载完成的操作二进制流获取的方式类模型与Class实例的位置数组类的加载过程二:Linking(链接)阶段链接阶段之Verification(验证)链接阶段之Preparation(准备)链接阶段之Resolution(解析)过程三:Initialization(初始化)阶段static 与 final 的搭配问题< client >() 的线程安全性问题类的初始化情况:主动使用VS被动使用过程四:类的Using(使用)过程五:类的Unloading原创 2022-05-31 10:13:37 · 118 阅读 · 0 评论 -
第十九篇_字节码指令集与解析
文章目录概述执行模型字节码与数据类型指令分类加载与存储指令再谈操作数栈和局部变量表局部变量压栈指令常量入栈指令出栈装入局部变量表算术运算符指令以及举例所有的运算符指令比较指令的说明类型转换指令宽化类型转换(Widening Numeric Conversions)窄化类型转换(Narrowing Numeric Conversion)对象的创建和访问指令创建指令字段访问指令数组操作指令类型检查指令方法调用与返回值方法调用指令方法返回指令操作数栈管理指令控制转移指令条件跳转指令比较条件跳转指令多条件分支跳转无原创 2022-05-30 19:17:35 · 325 阅读 · 0 评论 -
第十八篇_Class文件
文章目录JVM基本组成 基于Hotspot虚拟机学习的过程 - 从上到下字节码文件的跨平台性Java的前端编译器透过字节码指令看代码执行细节举例Class文件到底存储的是什么什么是字节码指令(Byte Code)Class文件本质和内部数据类型Class文件的结构Class字节码文件结构Class文件版本号和平台的对应Class文件数据类型类型描述符常量类型和结构常量类型和结构细节访问标志字段表访问标志类索引、父类索引、接口索引属性的通用格式数据类型和默认初始值对应分别解释其作用魔数 Magic Numbe原创 2022-05-29 17:07:36 · 492 阅读 · 0 评论 -
第十七篇_垃圾回收器
文章目录GC分类与性能指标GC分类性能指标评估GC的性能指标:吞吐量(Throughput)评估GC的性能指标:暂停时间(pause time)吞吐量和暂停时间的对比关于GC控制台打印的一些参数说明不同的垃圾回收器概述垃圾回收器的组合关系查看默认的垃圾收集器Serial回收器 - 串行回收ParNew回收器- 并行回收Parallel回收器 - 吞吐量优先CMS垃圾回收器 - 低延迟小结G1垃圾收集器 - 区域化分代式简介G1回收器的特点(优点)G1回收器的缺点G1回收器的参数设置G1回收器的适用场景分区R原创 2022-05-28 16:02:52 · 263 阅读 · 0 评论 -
第十六篇_垃圾回收相关概念
文章目录System.gc()的理解内存溢出与内存泄漏内存溢出内存泄漏Stop The World垃圾回收的并行与并发安全点和安全区域Java中的引用强引用软引用弱引用虚引用引用队列拓展 - WeakHashMap总结System.gc()的理解默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存然后System.gc() 调用附带也该免责声明,无法保证对垃圾收集器的调原创 2022-05-23 10:22:19 · 103 阅读 · 0 评论 -
第十五篇_垃圾回收相关算法
文章目录垃圾标记阶段的算法之引用计数算法垃圾标记阶段:对象是否存活的判断方式一:引用计数算法方式二:可达性分析(或者根搜索算法、追踪性垃圾收集)对象的finalization机制对象生存还是死亡使用MAT查看GC Roots溯源使用Jprofiler进行GC Roots溯源垃圾清除阶段算法之标记-清除算法垃圾清除阶段算法之复制算法垃圾清除阶段算法之标记 - 压缩(整理)算法小结分代收集算法增量收集算法和分区算法垃圾标记阶段的算法之引用计数算法垃圾标记阶段:对象是否存活的判断在堆里存放着几乎所有的J原创 2022-05-22 11:42:19 · 152 阅读 · 0 评论 -
第十四篇_垃圾回收概述
文章目录什么是垃圾为什么需要GCJava的垃圾回收机制什么是垃圾垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生关于垃圾收集有三个经典问题哪些内存需要回收什么时候回收如何回收垃圾收集机制是Java的招牌能力。极大的提高了开发效率垃圾垃圾是指在 运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾如果不及时对内存中的垃圾进行清理,那么这些垃圾会一直占用空间,直到程序运行结束,被占用的空原创 2022-05-22 11:40:23 · 101 阅读 · 0 评论 -
第十三篇_StringTable
文章目录String的基本特性String的内存分配字符串的拼接操作拼接操作的原理intern() 的使用intern()的空间效率测试:空间角度StringTable的垃圾回收G1的String去重操作String的基本特性String:字符串,使用一对 “” 引起来表示String s1 = “hello”;String s2 = new String(“hello”);String:声明为final的,不可被继承String 实现了Serializable接口:表示字符串是原创 2022-05-21 18:22:04 · 197 阅读 · 0 评论 -
第十二篇_执行引擎
文章目录执行引擎概述执行引擎的工作流程Java代码编译和执行的过程机器码指令、汇编、高级语言的理解与执行过程机器码指令指令集汇编语言高级语言字节码C/C++源程序执行过程解释器解释器工作机制(或工作任务)解释器的分类现状JIT编译器热点代码以及探测方式方法调用计数器回边计数器Hotspot VM 可以设置程序的执行方式Hotspot VM 中JIT分类Graal编译器与AOT编译器执行引擎概述执行引擎是Java虚拟机核心组件之一“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行的能原创 2022-05-21 16:17:30 · 157 阅读 · 0 评论 -
第十一篇_直接内存
文章目录直接内存概述非直接缓冲区直接缓冲区注意点直接内存概述直接内存不是虚拟机运行时数据区的一部分。也不是《Java虚拟机规范》中定义的内存区域直接内存是在Java堆外的、直接向系统申请的内存空间来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常访问直接内存的速度高于Java堆,也就是读写性能更高因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存Java的NIO库允许Java程序使用直接内存,用户数据缓冲区非直接缓冲区读写文件,需要与磁盘原创 2022-05-18 12:07:20 · 97 阅读 · 0 评论 -
第十篇_对象的实例化内存布局与访问定位
文章目录对象的的实例化对象创建的六个步骤判断对象的对应的类是否加载、链接、初始化为对象分配内存处理并发安全问题初始化分配到的空间设置对象的对象头执行init方法进行初始化对象的内存布局对象头(Header)实例数据(Instance Data)对齐填充(Padding)图示对象的访问定位对象的的实例化实例代码package cn.icanci.jvm.metaspace;/** * @Author: icanci */public class ObjectTest { publ原创 2022-05-18 12:05:39 · 136 阅读 · 0 评论 -
第九篇_方法区
文章目录运行时数据区结构图栈、堆、方法区之间的交互关系方法区的基本理解Hotspot中方法区的演进设置方法区大小和OOM如何解决OOM方法区的内部结构方法区存储什么?运行时常量池的理解运行时常量池方法区的使用举例方法区的演进细节永久代为什么要被元空间替换StringTable为什么需要调整方法区的垃圾回收行为总结运行时数据区结构图栈、堆、方法区之间的交互关系从线程是否共享来看从创建对象的角度来看方法区的基本理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于原创 2022-05-18 10:27:17 · 100 阅读 · 0 评论 -
第八篇_堆
概述每个进程拥有一个JVM实例一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域Java堆区在JVM启动时被创建。其空间大小被确定,JVM管理的最大一块内存空间,堆内存大小可调节《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但是在逻辑上他应该是连续的所有线程共享Java堆,这里还可以划分线程私有缓冲区(Thread Local Allocation Buffer,TLAB)《Java虚拟机规范》中对Java堆描述是:所有的对象实例以及数组都对应在运行时分配在堆原创 2022-05-13 10:39:17 · 99 阅读 · 0 评论 -
第七篇_本地方法栈
本地方法栈Java虚拟机用于管理Java方法的调用,而本地方法栈是用户管理本地方法的调用允许被实现固定或者是可拓展的内存大小(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈的最大容量,Java虚拟机竟会抛出一个StackOverflowError异常本地方法动态扩展,若动态扩展无法申请到足够内存或在创建新线程是没有足够内存,会抛OutOfMemaryError异常具体做法是Native Method Stack中登记 native方法,在Execution Engine执行时加.原创 2022-05-12 20:34:02 · 190 阅读 · 0 评论 -
第六篇_本地方法接口
什么是本地方法一个Native Method就是一个Java调用非Java代码的接口,一个Native Method是这样的一个Java方法:该方法的实现由非Java语言来实现,比如C。这个特征并非Java所持有,其他编程语言也有,如C++,可使用extern "c"告知C++编译器去调用一个C的函数在定义一个native method时候,并不提供实现体(有些像定义一个Java Interface),因为其实现体是由非Java语言在外实现本地接口的作用是在融合不同的编程语言为Java所用为什.原创 2022-05-12 20:33:07 · 238 阅读 · 0 评论 -
第五篇_虚拟机栈
文章目录虚拟机栈出现的背景内存中的栈和堆虚拟机栈的基本内容栈的优点栈中可能出现的异常设置栈内存的大小栈中存储什么栈运行原理栈帧的内部结构局部变量表(Local Variables)字节码中方法内部结构的剖析关于Slot的理解静态变量于局部变量对比补充说明操作数栈**代码追踪**i++和++i问题栈顶缓存技术动态链接方法调用动态类型语言和静态类型语言方法重写本质虚方法表方法返回地址栈的相关面试题虚拟机栈出现的背景由于跨平台的设计,Java指令都是根据栈来设计的。不同平台的CPU架构不同,所以不能设计为基原创 2022-05-12 12:03:43 · 206 阅读 · 1 评论 -
第四篇_程序计数器
文章目录PC Register介绍举例两个常见问题CPU时间片PC Register介绍JCM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的线程信息,CPU只有把数据装载到寄存器才能运行这里并非是广义上的物理寄存器,更偏向于PC计数器(或指令计数器),JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟作用:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码,由执行引擎读取下一条指令介绍原创 2022-05-10 22:50:02 · 111 阅读 · 0 评论 -
第三篇_运行时数据区概述和线程
文章目录内存线程共享Runtime线程JVM系统线程内存内存是非常重要的系统资源,是硬盘和CPU的中间仓库和桥梁,承载着操作系统和应用程序的实时运行JVM的内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行不同的JVM对于内存的划分方式和管理机制存在着部分差异,结合JVM虚拟机规范,讨论经典JVM内存分布线程共享Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有些会随着虚拟机的启动而创建,随着虚拟机的销毁而销毁一些于线程一一对应.原创 2022-05-10 12:52:28 · 112 阅读 · 0 评论 -
第二篇_类加载子系统
文章目录JVM内存结构类加载器子系统的作用类加载器ClassLoader角色类的加载过程类加载器分类用户自定义类加载器获取ClassLoader的途径双亲委派机制沙县安全机制其他类的主动使用和被动使用JVM内存结构类加载器子系统的作用从文件系统或者网络中加载Class文件,Class文件开头有特定标识,是一个魔数Classloader只负责class文件的加载,至于是否可运行,则由执行引擎决定加载的类信息存放于称为方法区的内存空间,除了类信息,方法区还会存放运行时常量池信息,可能还包括字符串字原创 2022-05-10 12:16:29 · 145 阅读 · 0 评论