当前位置: 首页 > news >正文

wordpress 列表 展开收缩百度整站优化

wordpress 列表 展开收缩,百度整站优化,深圳宝安区房价多少钱一平方,页面模板设计文章目录 垃圾回收机制垃圾判断算法引用计数法可达性分析算法虚拟机栈中的引用(方法的参数、局部变量等)本地方法栈中 JNI 的引用类静态变量运行时常量池中的常量 垃圾收集算法Mark-Sweep(标记-清除)算法Copying(标记-…

文章目录

    • 垃圾回收机制
    • 垃圾判断算法
      • 引用计数法
      • 可达性分析算法
        • 虚拟机栈中的引用(方法的参数、局部变量等)
        • 本地方法栈中 JNI 的引用
        • 类静态变量
        • 运行时常量池中的常量
    • 垃圾收集算法
      • Mark-Sweep(标记-清除)算法
      • Copying(标记-复制)算法
      • Mark-and-Compact(标记-整理)算法
      • Generation Collection (分代收集) 算法

垃圾回收机制

垃圾回收Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收

垃圾判断算法

引用计数法

给对象中添加一个引用计数器

  • 每当有一个地方引用它,计数器就加 1;
  • 当引用失效,计数器就减 1;
  • 任何时候计数器为 0 的对象就是不可能再被使用的。

这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间循环引用的问题。

![[Pasted image 20231011222409.png]]

可达性分析算法

该算法通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。

![[Pasted image 20231011222616.png]]

图片来源:JavaGuide

Object 6 ~ Object 10 之间虽有引用关系,但它们到 GC Roots 不可达,因此为需要被回收的对象

所谓对象之间的相互引用问题:除了对象 objAobjB 相互引用着对方之外,这两个对象之间再无任何引用。但是他们因为互相引用对方,导致它们的引用计数器都不为 0,于是引用计数算法无法通知 GC 回收器回收他们。

所谓的 GC Roots,就是一组必须活跃的引用,不是对象,它们是程序运行时的起点,是一切引用链的源头。在 Java 中,GC Roots 包括以下几种:

  • 虚拟机栈中的引用(方法的参数、局部变量等)
  • 本地方法栈中 JNI 的引用
  • 类静态变量
  • 运行时常量池中的常量(String 或 Class 类型)
虚拟机栈中的引用(方法的参数、局部变量等)
public class StackReference {public void greet() {Object localVar = new Object(); // 这里的 localVar 是一个局部变量,存在于虚拟机栈中System.out.println(localVar.toString());}public static void main(String[] args) {new StackReference().greet();}
}

greet 方法中,localVar 是一个局部变量,存在于虚拟机栈中,可以被认为是 GC Roots

greet 方法执行期间,localVar 引用的对象是活跃的,因为它是从 GC Roots 可达的。

greet 方法执行完毕后,localVar 的作用域结束,localVar 引用的 Object 对象不再由任何 GC Roots 引用(假设没有其他引用指向这个对象),因此它将有资格作为垃圾被回收掉。

本地方法栈中 JNI 的引用

Java 通过 JNI(Java Native Interface)提供了一种机制,允许 Java 代码调用本地代码(通常是 C 或 C++ 编写的代码)。

当调用 Java 方法时,虚拟机会创建一个栈帧并压入虚拟机栈,而当它调用本地方法时,虚拟机会通过动态链接直接调用指定的本地方法。

![[Pasted image 20240917212049.png]]

JNI 引用是在 Java 本地接口(JNI)代码中创建的引用,这些引用可以指向 Java 堆中的对象。

// 假设的JNI方法
public native void nativeMethod();// 假设在C/C++中实现的本地方法
/** Class:     NativeExample* Method:    nativeMethod* Signature: ()V*/
JNIEXPORT void JNICALL Java_NativeExample_nativeMethod(JNIEnv *env, jobject thisObj) {jobject localRef = (*env)->NewObject(env, ...); // 在本地方法栈中创建JNI引用// localRef 引用的Java对象在本地方法执行期间是活跃的
}

在本地(C/C++)代码中,localRef 是对 Java 对象的一个 JNI 引用,它在本地方法执行期间保持 Java 对象活跃,可以被认为是 GC Roots。

一旦 JNI 方法执行完毕,除非这个引用是全局的(Global Reference),否则它指向的对象将会被作为垃圾回收掉(假设没有其他地方再引用这个对象)。

类静态变量

来看下面这段代码:

public class StaticFieldReference {private static Object staticVar = new Object(); // 类静态变量public static void main(String[] args) {System.out.println(staticVar.toString());}
}

StaticFieldReference 类中的 staticVar 引用了一个 Object 对象,这个引用存储在元空间,可以被认为是 GC Roots

只要 StaticFieldReference 类未被卸载,staticVar 引用的对象都不会被垃圾回收。如果 StaticFieldReference 类被卸载(这通常发生在其类加载器被垃圾回收时),那么 staticVar 引用的对象也将有资格被垃圾回收(如果没有其他引用指向这个对象)。

运行时常量池中的常量
public class ConstantPoolReference {public static final String CONSTANT_STRING = "Hello, World"; // 常量,存在于运行时常量池中public static final Class<?> CONSTANT_CLASS = Object.class; // 类类型常量public static void main(String[] args) {System.out.println(CONSTANT_STRING);System.out.println(CONSTANT_CLASS.getName());}
}

ConstantPoolReference 中,CONSTANT_STRINGCONSTANT_CLASS 作为常量存储在运行时常量池。它们可以用来作为 GC Roots

这些常量引用的对象(字符串"Hello, World"和 Object.class 类对象)在常量池中,只要包含这些常量的 ConstantPoolReference 类未被卸载,这些对象就不会被垃圾回收。

垃圾收集算法

垃圾收集算法(Garbage Collection Algorithm) 是一种自动内存管理机制,用于在程序运行时自动识别和回收不再使用的对象,以释放内存空间和提升系统性能

Mark-Sweep(标记-清除)算法

![[Pasted image 20231011230810.png]]

图片来源:JavaGuide

标记-清除(Mark-and-Sweep)算法分为“标记(Mark)”和“清除(Sweep)”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象

它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题:

  1. 效率问题:标记和清除两个过程效率都不高。
  2. 空间问题:标记清除后会产生大量不连续的内存碎片。

对于标记的对象是可回收还是不可回收对象,两种说法都有支持者,按照前者:

  1. 当一个对象被创建时,给一个标记位,假设为 0 (false);
  2. 在标记阶段,从根对象出发,将所有可达对象(或用户可以引用的对象)的标记位设置为 1 (true)
  3. 扫描阶段 清除标记位为 0 (false)的对象

Copying(标记-复制)算法

![[Pasted image 20231011231209.png]]

图片来源:JavaGuide

为了解决 标记-清除 算法的效率和内存碎片问题,复制(Copying)收集算法 将内存分为大小相同的两块,每次使用其中的一块

当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收

该算法存在的问题:

  • 可用内存变小:可用内存缩小为原来的一半。
  • 不适合老年代:如果存活对象数量比较大,复制性能会变得很差。

Mark-and-Compact(标记-整理)算法

![[Pasted image 20231011231514.png]]

图片来源:JavaGuide

标记-整理(Mark-and-Compact)算法是根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存

由于多了整理这一步,因此效率不高,适合老年代这种垃圾回收频率不是很高的场景

Generation Collection (分代收集) 算法

当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将 Java 堆分为新生代和老年代,根据各个年代的特点选择合适的垃圾收集算法,通过优化垃圾收集的效率,提高了系统的性能。

比如在新生代中,每次 GC 都会有大量对象死去,可以选择 Copying 算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。

而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。

Java 虚拟机(JVM)中的垃圾收集器通常会根据堆内存的大小、对象的存活时间等因素动态选择合适的垃圾收集算法和策略,以最大程度地提高内存利用率和应用程序的性能。

http://www.dt0577.cn/news/49230.html

相关文章:

  • 深圳做网站做公司网站的公司云南seo
  • 辽宁省网站制作公司排名全网推广公司
  • 网站系统设计说明书seo诊断分析在线工具
  • 网站建设的成本百度搜索引擎投放
  • wordpress新站注意事项竞价推广论坛
  • 企业网站备案需要法人拍照吗百度客服人工服务电话
  • h5自适应企业网站源码沈阳seo关键词排名
  • 用帝国做网站怎么样好的竞价推广托管
  • 建设企业网站价钱搜索引擎排名的三大指标
  • 柳州网站建设psn118台州seo排名公司
  • 请seo的人帮做网站排名网站权重划分
  • wordpress wp_handle_uploadseo简介
  • 文创产品设计就业前景东莞关键词排名快速优化
  • 景安 怎么把网站做别名什么是新媒体营销
  • 深圳做外贸网站云搜索网页版入口
  • 网站建设排名优化技巧网站创建流程
  • 建网站要多少钱用自己的服务器百度收录的网站
  • 公司网站建设一定要求原图吗怎样做一个自己的网站
  • 网站建设一条龙服务网站seo优化公司
  • 爱淘宝网页网站建设推广app赚佣金平台
  • 有哪些做网站好的公司好设计网站大全
  • 我的网站百度找不到网站源码下载
  • wordpress renderview移动端排名优化软件
  • 管理咨询有限公司长沙seo 优化选智投未来no1
  • 网站开发设计书合肥网站优化
  • 让别人做网站的步骤seo自动发布外链工具
  • 做独立电商网站seo网站诊断流程
  • 旅游网站的设计方案怎么做公司网站制作网络公司
  • github托管wordpress上海单个关键词优化
  • 企业建设网站的作用日本搜索引擎naver入口