JVM笔记
文章平均质量分 69
本栏介绍了我在学习JVM中的笔记(仅到调优之前),有兴趣可以看一下,其中的文章也是我作为面试JAVA工作很有用的助力
代码匪徒
LOVE JAVA:HELLO WORLD,渴望了解更多的业务逻辑,所写博客均是作为记事本使用,用做分享交流学习。近期在学习sqlserve、c# winform、.NET MVC、.NET CORE、vue naive ui相关知识,有相关问题也会做一个分享,并会陆续总结分享一些我在之前准备面试和面试过程中遇到的一些不理解,然后搞懂的点,或一些不错的内容;有什么面试、技术方面的问题也欢迎一起交流探讨
展开
-
JVM笔记二十二:垃圾回收器
GC分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。垃圾回收器分类:按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一时间段内只允许有一个cPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。(1). 在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,原创 2022-04-12 15:59:34 · 557 阅读 · 0 评论 -
JVM笔记二十一:垃圾回收相关内容
垃圾回收相关内容System.gc()的理解内存溢出与内存泄漏内存溢出(OOM)内存泄漏(Memory Leak)Stop The World垃圾回收的并行与并发并发并行安全点与安全区域安全点安全区域强引用软引用弱引用虚引用终结器引用原创 2022-03-21 14:59:47 · 201 阅读 · 0 评论 -
JVM笔记二十:垃圾回收相关算法
标记阶段:引用计数算法在堆里存放着几乎所有的Java对象实例,在Gc执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。在JVM中标记一个死亡对象:当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用原创 2022-03-18 22:55:25 · 218 阅读 · 0 评论 -
JVM笔记十九:垃圾回收概述
垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。——垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战。什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到原创 2022-03-12 22:42:33 · 128 阅读 · 0 评论 -
JVM笔记十八:StringTable(字符串池)
StringTable1.String的基本特性(不可变性,以及他在方法中被改变后情况,以及原理)2.String的内存分配3.String的基本操作4.字符串拼接操作5.intern()的使用6.StringTable的垃圾回收7.G1中String去重操作原创 2022-03-06 21:59:59 · 452 阅读 · 0 评论 -
JVM笔记十七:执行引擎
执行引擎执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节原创 2022-02-26 08:24:02 · 523 阅读 · 0 评论 -
JVM笔记十六:直接内存
不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO(jdk1.4时期),通过存在堆中的Di rectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。➢因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。➢Java的NIO库允许Java程序使用直接内存,用于数据缓冲区读写文件,需要与磁盘交互,需要由用户态切换到内核态。在内核态时,需要内存如右图的原创 2022-02-20 10:06:45 · 157 阅读 · 0 评论 -
JVM笔记十五:对象的实例化、内存布局与访问定位
创建对象的步骤1.判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令, 首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。( 即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class类对象..原创 2022-02-16 10:06:40 · 151 阅读 · 0 评论 -
JVM笔记十四:方法区
运行时数据区结构图:1 - 栈、堆、方法区的交互关系原创 2022-02-02 00:01:30 · 983 阅读 · 0 评论 -
JVM笔记十三:堆
介绍了堆的概述堆的内存细分堆大小设置年轻代和老年代对象分配过程Minor GC、Major GC、Full GC堆空间分代思想内存分配策略(对象提升(Promotion)规则)为对象分配内存: TLAB堆空间的参数设置堆是分配对象存储的唯一选择吗?和逃逸分析原创 2021-12-16 10:15:45 · 1322 阅读 · 0 评论 -
VM options中填写参数
如果没有vm options,进行如下操作在此中即可填参数原创 2021-12-16 09:51:52 · 541 阅读 · 0 评论 -
JVM笔记十二:本地方法栈
什么是本地方法?简单地讲,一个Native Method就是- -个Java调用非Java代码的接口。一个Native Method是这样 -一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告 知C+ +编译器去调用一个C的函数。“A native method is a Java method whose implementation is .provided by non-java c原创 2021-12-01 22:12:34 · 259 阅读 · 0 评论 -
静态变量与局部变量的对比
参数表分配完毕之后,再根据方法体内定义的变量的顺序和作用域分配。我们知道类变量表有两次初始化的机会,第一次是在“准备阶段”,执行系统初始化,对类变量设置零值,另一次则是在“初始化”阶段,赋予程序员在代码中.定义的初始值。和类变量初始化不同的是,局部变量表不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。变量的分类:按照数据类型分:1.基本数据类型2.引用数据类型按照在类中声明的位置分:1.成员变量:在使用前,都经历过默认初始化赋值类变量: li原创 2021-11-12 20:11:50 · 268 阅读 · 0 评论 -
Slot的理解
参数值的存放总是在局部变量数组的index0开始,到数组长度1的索引结束。局部变量表,最基本的存储单元是Slot (变量槽)局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference),返回值(returnAddress) 类型的变量。在局部变量表里,32位以内的类型只占用一个slot (包括returnAddress类型),64位的类型(long和double)占用两个slot。byte、short 、char在存储前被转换为int,boolean 也被转换为int,0表示原创 2021-11-12 20:00:06 · 1053 阅读 · 0 评论 -
IDEA jclasslib插件安装
打开settings找到插件安装输入jclasslib,然后install在view中即可找到jclasslib,在相应的字节码文件中打开jclasslib即可使用原创 2021-11-12 15:02:47 · 635 阅读 · 0 评论 -
JVM笔记十一:虚拟机栈
详细介绍了JVM运行时数据区中的虚拟机栈原创 2021-11-06 16:27:37 · 538 阅读 · 0 评论 -
JVM笔记十:pc寄存器
详细介绍了JVM中的程序计数寄存器(Program Counter Register)原创 2021-11-05 09:00:42 · 3338 阅读 · 8 评论 -
JVM笔记九:运行时数据区简介
详细介绍了JVM中的运行时数据区原创 2021-10-24 23:24:29 · 165 阅读 · 0 评论 -
JVM笔记八:类的主动使用和被动使用
JVM中表示两个class对象是否为同一个类存在两个必要条件:1.类的完整类名必须一致,包括包名。2.加载这个类的ClassLoader (指ClassLoader实例对象)必须相同。(换句话说,在JVM中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。)Java程序对类的使用方式分为:主动使用和被动使用。主动使用,又分为七种情况: .1.创建类的实例2.访问某个类或接口的静态原创 2021-10-21 23:36:31 · 155 阅读 · 0 评论 -
JVM笔记七:双亲委派机制和沙箱安全机制
Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理.它是一种任务委派模式。工作原理1)如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;3 )如果父类加载器可以完成类加载任务,就成功返回原创 2021-10-14 23:29:42 · 253 阅读 · 0 评论 -
JVM笔记六:jvm类加载器的分类
JVM支持两种类型的类加载器,分别为引导类加载器(BootstrapClassLoader)和自定义类加载器(User-Defined classLoader)。从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示:虚拟机自带的加载器·启动类加求器(引导类加载器,Bootst原创 2021-10-13 15:03:20 · 197 阅读 · 0 评论 -
JVM笔记五:jvm类加载器即类加载过程
加载-验证-准备-解析-初始化,三大阶段;类的实例化和初始化过程详解和其关系说明;java初始化作用;类的载入和初始化和构造函数的关系和差别;类的初始化会为实例属性分配内存吗;介绍实例化和初始化区别和联系原创 2021-10-06 14:26:50 · 290 阅读 · 0 评论 -
JVM笔记四:jvm生命周期
虚拟机的启动(生命的开始)Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。想让这个程序执行,结构它的一些类结构、父类和其他一些必要的类都没有,就得先让虚拟机执行起来。调用初始类,内部有个main方法,main方法中使用一些其他类,相继的就把后续一些类加载进来。虚拟机的执行一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止原创 2021-10-02 19:21:52 · 109 阅读 · 0 评论 -
JVM笔记三:jvm的架构模型
Java编译器输入的指令流基本上是一种基子栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。两种架构之间的区别:1.基于栈式架构的特点设计和实现更简单,适用于资源受限的系统。避开了寄存器的分配难题:使用零地址指令方式分配。指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。不需要硬件支持,可移植性更好,更好实现跨平台。2.基于寄存器架构的特点典型的应用是x86的二进制指令集:比如传统的Pc以及Android的Davlik虚拟机。指令集架构则完原创 2021-10-02 19:09:44 · 149 阅读 · 1 评论 -
JVM笔记二:jvm整体结构
讲的是HotSpot虚拟机前端编译器原创 2021-10-01 23:24:42 · 451 阅读 · 0 评论 -
JVM笔记一:虚拟机和java虚拟机
虚拟机虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机如Visual Box, VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是Java虚拟机,模拟具体的java程序运行的环境,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的 指令我们称为Java字节码指令。无论是系统虚原创 2021-09-24 23:19:46 · 311 阅读 · 0 评论