jvm
文章平均质量分 89
zyyn_未来可期
热爱生活,更热爱你~
展开
-
深入理解Java虚拟机十六(垃圾回收器) ---- 重要
一、GC分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本新特性语法层面:Lambda表达式、switch、自动拆箱装箱、enumAPI层面:Stream API、新的日期时间、Optional、String、集合框架底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量池位置变化...原创 2022-04-09 19:16:31 · 217 阅读 · 0 评论 -
深入理解Java虚拟机十五(垃圾回收相关概念)
一、System.gc()的理解在默认情况下,通过system.gc()或者Runtime.getRuntime().gc() 的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而system.gc() )调用附带一个免责声明,无法保证对垃圾收集器的调用。(不能确保立即生效)JVM实现者可以通过system.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能原创 2022-04-09 15:16:01 · 132 阅读 · 0 评论 -
深入理解Java虚拟机十四(垃圾回收算法) ---- 重要
一、标记阶段:引用计数算法对象存活判断在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数算法:引用计数算法(Refe原创 2022-04-05 16:59:55 · 409 阅读 · 0 评论 -
深入理解Java虚拟机十三(垃圾回收概述)
一、什么是垃圾在提到什么是垃圾之前,我们先看下面一张图垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。大厂面原创 2022-04-05 13:09:06 · 105 阅读 · 0 评论 -
深入理解Java虚拟机十二(StringTable)
一、String的基本特性String:字符串,使用一对 ”” 引起来表示String s1 = “atguigu” ; // 字面量的定义方式String s2 = new String(“hello”);string声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示string可以比较大小(排序)string在jdk8及以前内部定义了final char[] value用于存储字符串数据。JD原创 2022-04-05 12:01:06 · 279 阅读 · 0 评论 -
深入理解Java虚拟机十一(执行引擎)
一、执行引擎执行引擎属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器执行引擎来负责将字节码文件翻译成操作系统可以识别的机器指令执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装原创 2022-04-04 11:44:44 · 289 阅读 · 0 评论 -
深入理解Java虚拟机十(直接内存 )
直接内存 Direct MemoryJDK1.8 之后我们引入了新的概念元空间,而元空间使用的就是直接内存。不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区原创 2022-04-03 17:57:15 · 156 阅读 · 0 评论 -
深入理解Java虚拟机九(对象实例化,内存布局与访问定位)
面试题对象在JVM中是怎么存储的?对象头信息里面有哪些东西?Java对象头有什么?对象的实例化原创 2022-04-03 17:23:21 · 99 阅读 · 0 评论 -
深入理解Java虚拟机八(方法区)---- 重要
方法区这次所讲述的是运行时数据区的最后一个部分:方法区做为运行时数据区最重要的三部分之一栈、堆、方法区的交互关系通过我们开发过程中的一行简单的代码就能看出栈,堆,方法区之间的关系注意:元空间其实就是方法区的一个具体的实现,它并不会占用堆的大小方法区的基本理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开原创 2022-04-03 08:38:56 · 558 阅读 · 0 评论 -
深入理解Java虚拟机七(堆)---- 重要
堆的核心概念堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。原创 2022-03-26 15:29:03 · 136 阅读 · 0 评论 -
深入理解Java虚拟机六(本地方法接口和本地方法栈)
什么是本地方法简单地讲,一个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 code.”(本.原创 2022-03-24 11:04:04 · 169 阅读 · 0 评论 -
深入理解Java虚拟机五(Java虚拟机栈)---- 重要
虚拟机栈虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?栈是运行时的单位,而堆是存储的单位即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放原创 2022-03-23 17:00:23 · 317 阅读 · 0 评论 -
深入理解Java虚拟机四(程序计数器-PC寄存器)
程序计数器JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。也是不会发生垃圾回收的区域。在JVM原创 2022-03-23 09:54:14 · 253 阅读 · 0 评论 -
深入理解Java虚拟机三(运行时数据区)
当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会进入我们的下一个阶段运行时数据区,俗称JVM内存结构,想必大家也都非常熟悉红色的区域代表一个进程,灰色的区域代表一个线程;注意:一个Runtime 就有一个运行时数据区内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存.原创 2022-03-21 17:11:51 · 107 阅读 · 0 评论 -
深入理解Java虚拟机二(类加载器和类的加载过程)
类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(引擎)决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)类加载器ClassLoaderclassfile存在于本地硬盘上,可以理原创 2022-03-21 16:40:14 · 207 阅读 · 0 评论 -
深入理解Java虚拟机一(JVM与Java体系结构)
字节码我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:JVM字节码。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式—Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。虚拟机与Java虚拟机虚拟机所谓虚拟机(Virtua原创 2022-03-21 15:26:25 · 215 阅读 · 0 评论