JVM
文章平均质量分 81
光哥_帅
技术就是知识,改变命运!!!
展开
-
【JVM】垃圾回收算法详细对比说明
导图1、 概述在讲这些算法的时候,我们要知道我们的目的是垃圾回收,垃圾回收的是那些没有用的对象,但是什么时候判断对象是没有用的(死亡的),要进行垃圾回收的呢,那么此阶段有两种算法,分别是引用计数算法,和可达性分析算法,这个阶段也就是标记阶段。接着,在真正回收这些对象的算法上又分为复制算法,标记清除算法和标记整理算法。2、引用计数算法2.1概念对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计原创 2021-03-14 13:27:05 · 600 阅读 · 1 评论 -
【jvm 八】彻底理解方法区(轻松理解常量池)
1、方法区、永久代和元空间(Metaspace)到底要怎么理解可以将方法区理解为接口,永久代和元空间是方法区的不同的实现方式。元空间与永久代的最大的区别在于:元空间不在虚拟机设置的内存中,而是使用本地内存,因此它可以有更大的空间,防止内存溢出。方法区是一块独立于java堆的内存空间2、堆、栈、方法区的交互关系3、设置方法区大小的参数元数据区大小可以使用参数-XX : MetaspaceSize和-XX : MaxMetaspaceSize指定。这个依赖于平台,因为是本地原创 2021-02-25 09:04:41 · 802 阅读 · 6 评论 -
【jvm】逃逸分析深入理解
1、问题引入——堆是分配对象存储的唯一选择吗?不是,对象是在java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是 如果经过逃逸分析(Escape Analysis) 后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。如何将堆上的对象分配到栈,需要使用逃逸分析手段。2、逃逸分析概述将堆上的对象分配到栈这是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通原创 2021-02-08 23:59:13 · 539 阅读 · 0 评论 -
【JVM】 TLAB到底是干什么的
1、为什么出现TLAB(Thread Local Allocation Buffer )堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。所以TLAB产生2、什么是TLAB ?从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。多线程同时分配内存时,使用TL原创 2021-02-07 22:24:16 · 3399 阅读 · 2 评论 -
【jvm调优工具】VisualVM中安装VisualGC
1、在jdk中的bin下找到jvisualvm.exe,为了方便可以创建桌面快捷方式2、双击打开3、我们在这安装Visual GC插件点击工具插件然后点击可用插件选择Visual GC即可如果安装过程中出现错误我们下载好VisualGC,然后点击已下载——添加插件就可以了...原创 2021-02-06 18:59:48 · 455 阅读 · 0 评论 -
【jvm 七】堆中对象分配的过程
前言:如果对堆中的分代概念不是很明白,请务必看完博客:堆以及堆分代的详细介绍,接下来对堆中对象分配的过程进行详细的说明。1、背景为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。2、概述(1)new的对象先放Eden(伊甸园)区。此区有大小限制。(2)当Eden的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对Eden区进行垃原创 2021-02-06 18:59:17 · 725 阅读 · 2 评论 -
【jvm 六】堆以及堆分代的详细介绍
前言:上篇文章详细介绍了java虚拟机栈,本篇博客简单的对堆做一下概述1、堆的核心概述一个程序(也就是一个main方法)对应着一个JVM实例,一个JVM实例只存在一个堆内存;java堆区在JVM启动的时候被创建,其空间大小也就确定了,是JVM管理的最大一块内存空间,但是堆内存是可以调节的堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)之后会有篇幅专原创 2021-02-06 18:58:03 · 733 阅读 · 1 评论 -
【jvm 五】java虚拟机栈的深入了解
1、什么是java虚拟机栈:栈其实是有数组和链表实现的,一种先进后出的数据结构,每个线程在创建的时候,都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame)对应着一次方法的调用,线程私有,栈帧是栈存储的基本单位。2、java虚拟机栈作用主管java程序的运行,它保存方法的局部变量,部分结果,并参与方法的调用和返回。栈是一种快速有限的分配方式,访问速度仅次于程序计数器, JVM直接对java栈的操作只有两个:每个方法执行——进栈,执行结束后(return或者异常)——出栈,对于栈来说不存原创 2021-02-02 21:21:35 · 733 阅读 · 3 评论 -
【jvm 四】pc寄存器(程序计数器)
1、什么是pc寄存器它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期和线程保持一致,任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。也就是所谓的当前方法。 程序计数器会存储当前线程正在执行的java方法的JVM指令地址;如果是在执行native方法,则是位置定值(undefined)2、作用pc寄存器用来存储指向下一条指令的地址,由执行引擎读取下一条指令,如下图:——————————————原创 2021-01-31 21:02:32 · 1135 阅读 · 0 评论 -
【jvm 三】双亲委派机制
前言:建议先看上篇文章:类加载器介绍以及类加载的过程1、引入java虚拟机对class文件采用的是 按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,java虚拟机采用的是 双亲委派机制 ,即把请求交由父类处理,它是一种任务委派模式。2、双亲委派机制的工作原理①如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给上层的加载器去执行;②如果上层加载器还存在上层加载器,则进一步向上委托,依次递原创 2021-01-30 23:10:34 · 181 阅读 · 0 评论 -
【JVM 二】 类加载器介绍以及类加载的过程
前言:jvm包含两个子系统分别是类加载器子系统和执行引擎子系统,接下来介绍类加载器子系统1、类加载器子系统的作用这里加上图片:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------原创 2021-01-29 21:40:16 · 396 阅读 · 3 评论 -
【jvm 一】概述
1、JVM的整体概述jvm是Java虚拟机,它是一个虚构的计算机的软件的实现,我们可以把它当成一个容器,用来专门运行字节码文件的程序。如下图,我们的java程序通过编译变成.class 文件,然后class文件通过类加载器,分配内存(运行时数据区)。1.1运行时数据区方法区和堆是线程共享的,是跟虚拟机启动而存在的。java栈、本地方法栈和程序计数器是线程私有的,随着线程的启动而存在。1.1.1 程序计数器程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码行号指示器,字节码解释器工原创 2021-01-27 23:52:12 · 243 阅读 · 1 评论