做网站的图片传进去很模糊上海网站排名优化公司
- 作者: 五速梦信息网
- 时间: 2026年04月18日 09:59
当前位置: 首页 > news >正文
做网站的图片传进去很模糊,上海网站排名优化公司,广告公司新颖点的名字,工业设计最吃香的专业Java中的垃圾
Java中垃圾通常指的是不再被程序使用和引用的对象#xff0c;具体表现在没有被栈、JNI指针和永久代对象所引用的对象。Java作为一种面向对象的编程语言#xff0c;它使用自动内存管理机制#xff0c;其中垃圾收集器负责检测和回收不再被程序引用的…Java中的垃圾
Java中垃圾通常指的是不再被程序使用和引用的对象具体表现在没有被栈、JNI指针和永久代对象所引用的对象。Java作为一种面向对象的编程语言它使用自动内存管理机制其中垃圾收集器负责检测和回收不再被程序引用的对象以释放它们占用的内存空间。以下是一些导致对象成为垃圾的常见情况 无引用对象 当一个对象没有任何引用指向它时它就变得不可达成为垃圾Java的垃圾收集器会识别这样的对象并将它们回收。 引用循环 如果一组对象彼此引用形成一个循环而这个循环与程序的其他部分没有引用相连那么这个循环中的对象就会成为垃圾。Java的垃圾收集器通过识别引用循环并处理它们来防止内存泄漏。 显式置空引用 如果程序员显式地将一个引用置空null而没有其他引用指向相同的对象那么该对象就变成了垃圾。
垃圾收集器周期性地运行并识别和回收这些垃圾对象释放其内存中对应的区域以确保内存能够得到有效利用这种自动的内存管理机制就叫做垃圾回收。
如何寻找垃圾
引用计数Reference Count 引用计数算法是一种垃圾标记其核心思想是通过维护对象的引用计数来判断对象是否可以被回收。每个对象都有一个关联的引用计数表示当前有多少个指针引用它。当引用计数为零时意味着没有指针再引用该对象因此可以安全地回收该对象的内存。
其实引用计数算法的核心思想就是只要有对象引用我那么就说明我是有用的我还不需要被回收反正我就是没有用的对象那么我和我的子对象都应该被回收掉。这里我们说的对象都是堆上的对象一般是堆上的内存空间需要程序员手动回收而栈上的内存空间则由操作系统自行回收。由于栈上的对象是操作系统自行管理和回收的因此栈上的对象以及一些静态对象始终都是出于存活的状态因此堆中存活的对象至少会有一个引用指针指向它。
但是这样会存在着一个问题就是对象中的引用关系形成了环状——循环引用这种情况下环内所有对象的引用都是1的这样一来环内的所有都无法被回收从而造成“内存泄漏”。这是引用算法最主要的局限性也是为什么JVM不采用循环计数的方法来标记垃圾的原因。
根可达算法Root Search
由于引用计数算法无法解决“循环引用”的问题无可避免的会造成内存泄露因此Java没有采用引用计数算法来寻找垃圾。而是采用了一种从GC Roots开始搜索存活对象的垃圾标记算法——根可达算法。
哪些是GC Root
线程栈 (Thread Stacks) 活动线程的栈帧中的本地变量引用的对象。每个线程都有一个栈栈中的引用对象是潜在的存活对象。静态变量 (Static Variables) 类的静态成员变量引用的对象。静态变量随着类的加载而初始化它们的引用可能使对象保持存活。常量池 (Constant Pool) 常量池中的引用包括字符串常量等。这些常量在类加载时被创建它们的引用也可能使对象保持存活。JNI 引用 (JNI References) 通过 JNI 在本地代码中创建的对象引用。如果 Java 代码通过 JNI 调用了本地方法并在本地方法中创建了对象这些对象的引用也是 GC Roots。监控与管理 MBeans (JMX) 活动的监控、管理 MBeans 等通过 JMX 等管理工具注册的对象。这些对象的引用也被视为 GC Roots。
线程栈 (Thread Stacks) 在Java中当程序运行的时候线程会将一个个方法放到栈上来执行并且对于方法局部的一些小的对象和变量也会被分配在栈空间上而栈空间是由操作系统本身来控制什么时候进行释放和分配的。因此基于这个逻辑我们可以认为对于当前线程来说存在于栈空间上的变量都是存活的而且栈空间一般比较小只有几MB的大小里面存活的变量和对象都是有限的作为GC Roots来说搜索起来也是非常高效的。
静态变量 (Static Variables) 在Java中静态变量一般是随着类加载的时候被创建和初始化的和Java字节码一样静态变量也会被加载到元空间Meta SpaceJava 8之前叫做方法区Method Area或叫做永久代Permanent GenerationJava 8之后叫做元空间。
元空间的对象是不会轻易被释放的而静态变量会随着整个类被释放的时候才会被释放因此静态变量可以作为GC Root来寻找垃圾。
常量池 (Constant Pool) 常量池Constant Pool是Java中一种存放常量的数据结构用于存储编译期生成的字面量和符号引用。常量池属于元空间Meta SpaceJava 8之前叫做方法区Method Area或叫做永久代Permanent GenerationJava 8之后叫做元空间具体说是类加载后存放在元空间的一部分内存。
在Java程序的编译阶段常量池会保存各种字面量和符号引用包括字符串、类和接口的全限定名、字段和方法的名称和描述符等这些信息在编译后会被存放在class文件的常量池中在运行期间这些常量池依旧会存在并且Java根据常量池来映射参数。
所以处于常量池中的变量也可以作为GC Roots来寻找垃圾
JNI 引用 (JNI References) JNIJava Native Interface引用是指在Java程序中通过JNI创建的与本地代码C代码调用平台相关函数相互调用的引用。JNI引用包括本地引用Local Reference、全局引用Global Reference和弱全局引用Weak Global Reference。
本地引用Local Reference 本地引用是一种短期的引用用于限定其生命周期。当Java方法调用本地方法时本地引用会被创建但在本地方法返回后这些引用将被自动释放。本地引用不能作为GC Roots。
全局引用Global Reference 全局引用是一种长期有效的引用可以在整个程序的生命周期内使用。全局引用可以防止被引用对象被垃圾回收因此它可以作为GC Roots。
弱全局引用Weak Global Reference 弱全局引用也是一种全局引用但它对被引用对象的生命周期没有强制影响。如果一个对象只被弱全局引用引用那么它在垃圾回收时可能被回收。弱全局引用不能作为GC Roots。
JNI引用之所以能作为GC Roots是因为它们可以在本地方法C方法调用平台相关函数中持有Java对象的引用防止这些对象在本地方法执行期间被垃圾回收。全局引用在整个程序的生命周期内有效因此它们有可能成为根引用即GC Roots。
根可达算法原理
知道了什么是GC Roots那么根可达算法理解起来就相对来说会简单一些。GC Roots我们可以简单理解为和Java程序的生命周期强关联、和JVM生命周期强关联或者和当前线程强关联的一些对象。这些对象至少说在发生GC这一时刻是不应该被当成垃圾回收掉的否则会影响程序的正常使用因此我们标记存活对象的时候从GC Roots开始认为被GC Roots 引用或者间接引用的对象就是存活对象。因此根可达算法的基本原理和流程如下 初始根集合Initial Roots 根可达算法从程序的初始根集合开始这些根是一组特殊的引用如线程栈中的引用、静态变量、JNIJava Native Interface引用等。 标记阶段Mark Phase 算法通过追踪根引用递归遍历对象图标记所有可以从根引用访问到的对象。在这个过程中被标记的对象被认为是可达的而未被标记的对象被认为是不可达的。 标记-清除阶段Mark-Sweep Phase 在标记完成后算法执行清除操作即移除未被标记的对象。这些未被标记的对象被认为是不可达的可以被垃圾回收器回收。这个阶段的目标是回收不再被程序使用的内存空间。 压缩Compaction或整理Compaction 在某些情况下为了优化内存布局可能会执行进一步的操作如将存活对象整理到一起以减少内存碎片。这个步骤通常与标记-清除阶段结合使用。 可选的再标记阶段Optional Re-Mark Phase 有些算法可能会在标记-清除后执行可选的再标记阶段以处理在清除阶段可能发生的并发引用更新。这一步确保在垃圾回收过程中引用关系的一致性。 结束Finish 垃圾回收算法完成后内存中只留下了可达对象而不可达的对象已被清理。程序可以继续执行。
实际上来说如CMS和G1之类比较流行的垃圾回收器都是采用的“三色标记”算法而非直接采用的根可达算法来对垃圾进行标记的.
- 上一篇: 做网站的天空网杭州网站制作培训
- 下一篇: 做网站的外包公司黑龙江省建设厅的网站首页
相关文章
-
做网站的天空网杭州网站制作培训
做网站的天空网杭州网站制作培训
- 技术栈
- 2026年04月18日
-
做网站的顺序adapt wordpress
做网站的顺序adapt wordpress
- 技术栈
- 2026年04月18日
-
做网站的税是多少北京it公司排名
做网站的税是多少北京it公司排名
- 技术栈
- 2026年04月18日
-
做网站的外包公司黑龙江省建设厅的网站首页
做网站的外包公司黑龙江省建设厅的网站首页
- 技术栈
- 2026年04月18日
-
做网站的外包公司有哪些站长平台链接提交
做网站的外包公司有哪些站长平台链接提交
- 技术栈
- 2026年04月18日
-
做网站的网址是哪里来的用python做的大型网站
做网站的网址是哪里来的用python做的大型网站
- 技术栈
- 2026年04月18日
