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

武汉百度竞价托管google seo

武汉百度竞价托管,google seo,陕西营销型网站建设,中国室内设计网2020年文章目录 垃圾回收机制垃圾判断算法引用计数法可达性分析算法虚拟机栈中的引用(方法的参数、局部变量等)本地方法栈中 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.tj-hxxt.cn/news/101872.html

相关文章:

  • 营销型网站建设亏1海底捞口碑营销案例
  • 自建网站营销是什么搜索引擎优化的完整过程
  • 怎么样建立自己的视频网站常用的五种网络营销工具
  • 域名解析网站惠州网站推广排名
  • 网站建设方案ppt 枫子科技关键洞察力
  • asp.net 做网站好吗百度手机版下载
  • 技术支持 嘉兴网站建设天津seo排名
  • 手机非法网站怎么解决方案技能培训网
  • wordpress 站点语言爱站网seo
  • 涉县企业做网站推广网站维护合同
  • 科技公司网站模版口碑营销的步骤
  • 广元网站建设网上竞价
  • 上海做高端网站建网站制作和推广
  • 网页和网站做哪个好免费推广网站地址大全
  • wordpress 360cdn常州seo排名收费
  • 找网站公司做网站淘宝关键词排名优化
  • 第四代住房成都天府锦城重庆seo网页优化
  • 阿里云可以做哪些网站吗国内10大搜索引擎
  • 外汇平台+网站开发交换链接或称互惠链接
  • 产品网站策划深圳网站维护
  • 长沙百姓网招聘广告优化
  • 旅游网站栏目建设网站内搜索
  • 建设一个网站的文案需要餐饮管理和营销方案
  • 提供营销网站建设公司网站关键词优化排名软件
  • 网站开发环境分析长沙排名优化公司
  • 嘉兴网站制作公司天津百度网络推广
  • 泉州做网站如何建立公司网站网页
  • 做网站版头蓝色图片怎样做网站平台
  • zhaosf做这样网站网络营销推广方案步骤
  • wordpress国外主题慢成都百度推广账户优化