JVM
文章平均质量分 76
JVM
HoryC
这个作者很懒,什么都没留下…
展开
-
JVM系列——垃圾收集算法
JVM 的三种垃圾收集算法:标记-清除算法、标记-复制算法、标记整理算法、分代收集算法 1. 标记-清除算法 该算法分为“标记”和“清除”两个阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。 它是最基础的收集算法,后续的算法都是对其不足进行改进得到。 缺点: 效率问题:当存活对象比较多时,那么就会耗费较多的时间去标记;当回收对象较多时,同样会耗费较多的时间去清除 空间问题:标记清除后会产生大量不连续的碎片 2. 标记-复制算法 为了解决标记-清除算法面对大量可原创 2021-03-11 16:56:40 · 181 阅读 · 0 评论 -
方法区、永久代、元空间的关系
方法区 方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。 永久代(PermGen) 《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 方法区和永久代的关系很像 Java 中接口和类的关系,原创 2021-03-09 21:09:45 · 560 阅读 · 0 评论 -
逃逸分析/栈上分配/标量替换/同步消除
逃逸分析 前言 我们知道: 栈中存放一些基本类型的变量数据(int/short/long/byte/float/double/Boolean/char)和对象引用。 堆中主要存放对象,即通过new关键字创建的对象。 但是在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述: 随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。 在编译期间,JIT 会对代码做很多优化。其中有一部分优化的目的就是原创 2020-12-21 23:52:11 · 300 阅读 · 0 评论 -
深刻理解重载和覆盖
# 重载和覆盖的区别 定义不同 重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据参数来区分不同的函数。 覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名或参数不一样,只是函数实现体不一样。 类的关系不同 重载是同一个类中方法之间的关系,是水平关系; 覆盖是子类和父类之间的关系,是垂直关系。 产生方法不同 重载是多个方法之间的关系; 覆盖只能由一个方法或一对方法产生关系。 参数列表要求不同 重载要求参数列表不同; 覆盖要求参数原创 2020-07-28 16:43:16 · 605 阅读 · 0 评论 -
JVM中方法调用的内部实现原理
本文算是《深入理解Java 虚拟机》的学习笔记 # 符号引用和直接引用 首先来了解一下符号引用和直接引用的概念: Java类从加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、卸载,共七个阶段。 注意:加载、验证、准备、初始化这四个阶段发生的顺序是固定的,而解析阶段在某些情况下位于初始化之后。此外,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。 其中解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。那.原创 2020-07-28 16:41:39 · 315 阅读 · 0 评论