Java虚拟机专题
文章平均质量分 86
莫言静好、
这个作者很懒,什么都没留下…
展开
-
JVM专题之垃圾回收器
CMS是怎么解决传统GC暂停时间过长的问题?在CMS垃圾回收时候,有多个阶段是和应用程序并发执行,即便有暂停应用线程的阶段,那都是暂停时间很短的操作。CMS如何解决不应该回收的对象被回收?那既然和应用线程并发执行,那么应用线程完全有可能修改对象的引用,可能会造成本不应该回收的对象被回收。所以我们需要一种机制,知道哪些对象的引用发生了修改,然后需要对它引用链重新跟踪,并进行标记。但是如何知道哪些对象被修改了呢?CMS引入了Card 、Card Table数据结构,以及使用写屏障技术实现了这一点。原创 2021-04-25 15:30:10 · 466 阅读 · 0 评论 -
JVM专题之分代模型:年轻代、老年代、永久代
一 什么是GC 分代我们知道GC为了方便垃圾回收,根据对象的特点对内存做了内存分代,在JDK1.8 之前主要包括新生代,老年代和永久代,在JDK1.8之后主要是新生代,老年代。方法区的实现元数据区直接分配在直接内存上的,不受JVM 管理。如图示二 GC 为什么需要分代第一:如果不分代,那么内存只有快满的时候才会进行垃圾回收,因为需要收集垃圾对象太多,所以耗费时间,会造成长时间的应用程序卡顿第二:对象的生命周期不同,生命周期比较短的对象,如果及时回收,可以提升内存利用率所以,分代.原创 2021-04-19 23:18:37 · 1386 阅读 · 0 评论 -
热加载和热部署
目录一 什么是热加载和热部署1.1 热部署(Hot Deploy)1.2 热加载(Hot Swap)二 热加载的原理是什么2.1 检测哪些文件需要重新被加载2.2 怎么加载三 热部署的原理是什么四 区别一 什么是热加载和热部署1.1 热部署(Hot Deploy)热部署针对的是容器或者是整个应用,部署了新的资源或者修改了一些代码,需要在不停机的情况下的重新加载整个应用。1.2 热加载(Hot Swap)热加载针对的是单个字节码文件,指的是重新编..原创 2021-04-19 00:39:08 · 2259 阅读 · 1 评论 -
JVM专题之类加载机制
一 类加载是什么?什么时候加载类?加载过程是怎么样的?1.1 什么是类加载类加载就是指将在硬盘上编译好的class字节码文件,加载到JVM内存中,然后对字节码文件进行链接和初始化的过程。只有加载后的字节码文件才可以被执行引擎解释和执行。1.2 类加载的时机JVM并不是启动的时候,就把全部的class字节码加载到内存,而是根据运行时候需要进行加载。比如没有加载到内存的类能够实例化吗?要访问静态类的变量或者方法,如果所在类没有被加载到内存,能访问静态变量和或者静态方法吗?第一:创建类实例的时候,肯定要原创 2021-04-19 00:25:58 · 697 阅读 · 2 评论 -
JVM专题之JVM内存和操作系统的进程的内存模型之间的关系
我们在谈及JVM内存的堆、虚拟机栈和本地方法栈、程序计数器和方法区等名词的时候,有没有想过一个问题。JVM是一个进程,那么天真的以为就该和操作系统进程内存模型结构保持一致,比如C/C++程序就是和操作系统的进程的内存模型保持一致。但是JVM内存管理中内存的划分明显和操作系统的进程内存模型有很大出入,那么他们之间的关系究竟是怎样的呢? 这一篇专题来解读这个问题。一 操作系统进程的内存模型1.1 进程的地址空间进程的地址空间,也叫作虚拟地址空间或者逻辑地址空间,指的是这个进程中所有虚拟地址的集合,此时还没原创 2021-04-18 17:34:20 · 2806 阅读 · 7 评论 -
2021-04-04 CPU缓存一致性 MESI协议
一 CPU以及缓存和高速缓存结构1.1 CPU结构我们知道CPU主要功能,一是控制,一是运算。主要包括寄存器、控制单元、运算单元和中断系统,主要架构如下:控制单元:主要负责分析和解释指令算数逻辑单元:也就是CPU的运算或者执行单元,负责计算寄存器:有多种类型,包括地址寄存器、数据寄存器和控制寄存器等等,数据寄存器:保存数据和操作数的寄存器;地址寄存器:保存地址;指令寄存器:存放指令的寄存器1.2 寄存器和高速缓存和写缓冲区比较相同点:都可以是CPU这边的硬件,其中高速缓存可以在处理器和MMU原创 2021-04-04 09:03:21 · 689 阅读 · 0 评论 -
Java虚拟机专题对象内存定位
一 对象在内存中的布局1.1对象的创建过程对象的创建过程可以如下图所示:1.2 什么是符号引用和直接引用,为什么需要在常量池定位到符号的引号?在类的解析阶段,把虚拟机常量池内的符号引号替换为直接引用。1.2.1 符号引用(SymbolicReferences)就是用一组符号来描述所引用的目标,符号可以是任何形式的,只要使用时能够定位到目标即可。我们知道原创 2017-12-19 17:09:13 · 525 阅读 · 0 评论 -
Java虚拟机专题之class文件结构(读书笔记)
我们知道一个Class文件对应着一个接口或者注解的类,但是他们并不一定定义在文件里,也可以直接由类加载器生成。 Java虚拟机定义了专门的数据类型来表示class文件的内容,他们包括u1,u2,u4表示1,2,4个无符号数 一 Class文件结构在Class文件中,各个项按照严格顺序连续存放的,他们之间没有任何填充或者对齐做为分隔符。表由任意数量的可变长度的项组成,表示Cl原创 2017-12-19 16:58:48 · 444 阅读 · 0 评论 -
Java虚拟机专题之类加载机制
一 类的加载阶段类加载具体做的是什么# 根据类的权限定名,获取此类的二进制流(文件或者网络等)# 将这个字节流所代表的静态存储结构转化为方法区的运行时数据# 在内存创建一个代表这个Class的对象,然后作为数据的访问入口二 类的连接阶段2.1 验证阶段验证的目的是确保加载的Class文件的字节码流的信息符合Java虚拟机规范,不会危害虚拟机的安全。包括文原创 2017-12-19 16:53:18 · 401 阅读 · 0 评论 -
Java虚拟机专题之字节码指令(读书笔记)
一 字节码与数据类型大部分的指令都包含了其操作所对应的数据类型信息。比如iload指令用于从局部变量表中加载int类型的数据到操作栈中,而fload指令加载的则是float数据类型的数据。 二 加载与存储指令主要用于将数据在栈帧的局部变量表和操作数栈之间来回传输。将局部变量表加载到操作数栈:iload,lload,fload,dload,aload(引用类型)将一个原创 2017-12-19 16:48:41 · 473 阅读 · 0 评论 -
Java虚拟机专题之垃圾回收(读书笔记)
一 如何判断对象是垃圾对象1.1 引用计数法 (Reference Counting)在对象中添加一个引用计数器,当有其他地方引用这个对象的时候,引用计数器就加1,当引用失效的时候就-1. 当垃圾回收器检查到引用为0,就会认为是垃圾对象,进行回收。 但是有一个问题,比如对象之间循环引用,诸如A,B两个对象,都有一个属性instance, 假设A.instance = B,B.ins原创 2017-12-19 16:44:23 · 413 阅读 · 0 评论 -
JVM之内存结构
一 Java虚拟机运行时的内存数据区域二 为什么有线程共享区和线程独占区我们知道,Java程序在JVM中运行,有的内存对象声明周期长,不随线程的释放而释放,比如堆和方法区;但是有些内存对象,就是线程私有范围的,随着线程的结束而结束,该部分使用的内存也会被释放。当然这也是系统垃圾回收的场所只发生在线程共享区域的原因。三 程序计数器程序计数器是一块较小内存空间原创 2017-12-19 16:38:11 · 386 阅读 · 0 评论 -
Java虚拟机专题之内存分配(读书笔记)
一 虚拟机内存分配策略1.1 对象优先在Eden区域分配1.2 大对象直接进入老年代1.3 长期存活的对象进入老年代1.4 空间分配担保1.5 动态对象年龄判定 二 对象优先在Eden区域分配假设构建4M大小的数组,通过打印GC详细日志,也可以看到是优先在Eden上分配的。publicclass EdenMemoryAllocation {原创 2017-12-19 16:31:20 · 357 阅读 · 0 评论