jvm基础知识四---垃圾回收面临的问题

el/2024/7/24 2:44:44

如何区分垃圾

 

 

上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数
为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节
点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从
哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地
方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果

 

有多个线程的话,则必须对这些线程对应的所有的栈进行检查。

   yy

 

同时,除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为
起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引
用或者基本类型结束
,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多
个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回
收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。
因此,垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器...)。而最简单的Java栈就是Java程序执行的
main函数。这种回收方式,也是上面提到的“标记-清除”的回收方式

 

如何处理碎片


由于不同Java对象存活时间是不一定的,因此,在程序运行一段时间以后,如果不进行内存整理,就会出现零
散的内存碎片。碎片最直接的问题就是会导致无法分配大块的内存空间,以及程序运行效率降低。所以,在上
面提到的基本垃圾回收算法中,“复制”方式和“标记-整理”方式,都可以解决碎片的问题。


如何解决同时存在的对象创建和对象回收问题


垃圾回收线程是回收内存的,而程序运行线程则是消耗(或分配)内存的,一个回收内存,一个分配内存,
从这点看,两者是矛盾的。
因此,在现有的垃圾回收方式中,要进行垃圾回收前,一般都需要暂停整个应用
(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用。
这种实现方式是最直接,而且最有效
的解决二者矛盾的方式。
但是这种方式有一个很明显的弊端,就是当堆空间持续增大时,垃圾回收的时间也将会相应的持续增大,对应
应用暂停的时间也会相应的增大。一些对相应时间要求很高的应用,比如最大暂停时间要求是几百毫秒,那么
当堆空间大于几个G时,就很有可能超过这个限制,在这种情况下,垃圾回收将会成为系统运行的一个瓶颈。为
解决这种矛盾,有了并发垃圾回收算法,使用这种算法,垃圾回收线程与程序运行线程同时运行。在这种方式
下,解决了暂停的问题,但是因为需要在新生成对象的同时又要回收对象,算法复杂性会大大增加,系统的处
理能力也会相应降低,同时,“碎片”问题将会比较难解决。

 


http://www.ngui.cc/el/5557279.html

相关文章

linux如何安装vmtools工具

第一步: 需要我们首先打开虚拟机,然后点击虚拟机选项,点击安装VMtools,如果已经安装过了就会显示重新安装(如下图所示,如果出现此字样证明你已经成功安装了VMtools)。如果未安装,点击安装即可。…

浅谈异常与恋爱

前面扯过一篇浅谈面向对象与女娲造人,今儿我接着扯…… 在我的理解中,所谓的异常机制也就是让程序在出现某些错误的情况下还能继续执行完 如同两个人在恋爱,虽然出现各种问题,但还是希望将来能继续走下去 在java的异常结构中…

java中的泛型总结

要我直接说出泛型是个what我还真讲不出来,这里先由一道问题引入: 定义一个坐标点类,要求能保存各种类型的数据,如:整形,浮点型,和字符串类型 既然变量类型起先不确定,那么很容易想到…

java中的IO操作总结(二)

文件的操作 这一节我们来讨论关于文件自身的操作 不浪费唾沫了,用代码说话…… 实例1:创建文件对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import java.io.File; public class Demo { public st…

java中的IO操作总结(三)

说实话,其实我并不是很喜欢Java这门语言,尽管它很强大,有很多现成的API可以调用 但我总感觉它把简单的事情弄得太过复杂,甚至有时候会让人迷失 弄不清到底是为了写出东西,还是为了语言本身 我学习的第一门编程语言是Py…

匿名内部类精讲

匿名内部类适合创建那种只需要一次使用的类,例如命令模式时所需要的Command对象。匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。 定义匿名内部类的格式如…

如何安装安装nginx软件--nginx的自动安装

去官网下包的安装教程,可以参考:(手动安装教程) http://blog.csdn.net/u011630575/article/details/48033431 自动安装nginx软件 第一步: sudo apt-get install nginx 第二步:安装结束 nginx常用命令…

linux下安装安装pcre configure: error: You need a C++ compiler for C++ support

linux下安装安装pcre-*.** ./configure --prefix/usr/local/pcre 出现以下错误 configure: error: You need a C compiler for C support 只需要安装gcc-c即可。 (1)命令:sudo apt-get install gcc;(2)命…

ubuntu下编译php扩展的时候报缺少pcre解决办法

命令:apt-get update 命令:apt-get install libpcre3 libpcre3-dev 刚刚在编译php扩展的时候,报缺少pcre错误。 当然是想通过apt-get这个命令解决问题了,不过搜索了网络,只找到了CentOS的yum命令: yum up…

ubuntu下nginx的安装教程(过程可能有点不同)

注: 过程可能有点不同,详细可以参照下一篇博客。 http://blog.csdn.net/u011630575/article/details/48103243 第一步: 去官网下载http://nginx.org/下载nginx;下载nginx; 第二步: 解压 tar -zxvf nginx…