本文目录一览

1,Java中GC是什么 为什么要有GC

GC 是垃圾回收机制。 就是把一些不用内存或者不用的对象销毁后释放空间
垃圾回收 gc 管理对象和一些不用的东西的回收。保证不会占用太多资源。

Java中GC是什么 为什么要有GC

2,java的GC是什么

Gabage Collection,垃圾收集。
system.gc()用来强制立即回收垃圾,即释放内存。java对内存的释放采取的垃圾自动回收机制,在编程的时候不用考虑变量不用时释放内存,java虚拟机可以自动判断出并收集到垃圾,但一般不会立即释放它们的内存空间,当然也可以在程序中使用system.gc()来强制垃圾回收,但是要注意的是,系统并不保证会立即进行释放内存
GC是垃圾收集器,用来强制回收垃圾,即释放内存。java对内存的释放采取的垃圾自动回收机制,在编程的时候不用考虑变量不用时释放内存,java虚拟机可以自动判断出并收集到垃圾,但一般不会立即释放它们的内存空间。要请求垃圾收集,可以用以下方法之一:System.gc() Runtime.getRuntime().gc()

java的GC是什么

3,java垃圾回收机制是什么

java的垃圾回收机制是对c的加强。不需要程序员来处理,有jvm控制,来减轻程序员的工作量和降低出错率。
gc()是随机回收垃圾的,谁也无法预料它到底什么时候来。 给你写个例子看看那 public class testfinalize public static void main(string[] args) while(true) teacher tea = new teacher("robin",30); // teacher tea1 =new teacher("j"); system.gc(); //runtime.getruntime().gc(); } }}class teacher string name; int age; public teacher(string name,int age) this.name = name; this.age = age; system.out.println("一个老师站起来====="); } @override public void finalize() system.out.println("一个老师倒下去"); }}

java垃圾回收机制是什么

4,C中 什么叫垃圾回收机制

垃圾回收呢,就是.net平台会自动把声明的那些不再使用的变量,或者是对象占用的空间释放, 而不用你自己书写代码实现这样的功能,比如说你再ASP查询完数据库就必须要写 rs=nothing 而C#就不会这么麻烦。直接查询完数据库,就不用管你声明过的变量了。空间会自动释放的。。 呵呵。但是还是推荐LZ养成好的习惯。 自己写代码释放不用的对象占用的空间。。呵呵。但是因为这个垃圾回收机制。程序员的生活美好了。。哈。
首先说下c#中的变量类型吧,c#中有2个变量类型,一种是值类型,一种是引用类型,值类型是在栈上创建,这一类型用不到gc,引用类型是在堆中创建,gc主要是在这里管理对象。gc对每个对象有个引用计数,所有说只要有变量在引用它,计数器就不为了,一个变量不再引用这个对象,对象的计数器就减一,知道计数器为0时,对象就成为内存垃圾了(没有变量引用它),但是此时垃圾并没有回收。那什么时候回收呢,是在内存占用超过一定限度是,gc才启动,释放垃圾资源,说白了就是delete这些对象,将空间归还给系统。但是这还没完,空间释放后,内存空间就不连续了,所有gc还要赶一件事,就是将空间整理下,将占用的空间连续话,具体说就是将空间向上推,就是想高地值转存,这样空间就连续了,使用也方便了,然后gc就改变应用那些对象的变量里地地址,让他们指向正确的位置,所以说c#中的引用类型就是一种指针,一种动态改变值的指针。

5,jvm的垃圾回收机制详解

1.JVM的gc概述  gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。  在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能。有些垃圾收集专用于特殊的应用程序。比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率。理解了应用程序的工作负荷和jvm支持的垃圾收集算法,便可以进行优化配置垃圾收集器。  垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。gc首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。  1.1.引用计数  引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm必须适当增减引用数。当某对象的引用数为0时,便可以进行垃圾收集。  1.2.对象引用遍历  早期的jvm使用引用计数,现在大多数jvm采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。  下一步,gc要删除不可到达的对象。删除时,有些gc只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多gc可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。  为此,gc需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有gc运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的 gc不断增加或同时运行以减少或者清除应用程序的中断。有的gc使用单线程完成这项工作,有的则采用多线程以增加效率。2.几种垃圾回收机制  2.1.标记-清除收集器  这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。  2.2.标记-压缩收集器  有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。  2.3.复制收集器  这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,jvm生成的新对象则放在另一半空间中。gc运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。  2.4.增量收集器  增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。  2.5.分代收集器  这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。  2.6.并发收集器  并发收集器与应用程序同时运行。这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。  2.7.并行收集器  并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性。

6,如何理解垃圾回收gc

作者:朱克锋1:垃圾回收机制由JVM完全负责,编写者在抛弃对象时不必关系空间回收问题2:JVM的垃圾回收机制对堆空间做实时监测,当发现某对象的引用计数为0时,就将该对象列入待回收系类中并不是马上予以销毁3:某个对象被认定为没有必要存在了,那么它所占用的内存就可以被释放,被回收的内存可以用于后续的再分配,并不是对象被抛弃后就立即被回收,垃圾回收器通常只在有对象要回收且系统需要回收时才运行,因此用户无法知道垃圾回收发生的精确时间4:system,gc()也仅仅是一个回收请求,JVM接受到这个消息后并不是立即做垃圾回收,而只是对几个垃圾回收算法做加权使垃圾回收操作容易发生或提前发生5:当对象即将被销毁时,有时需要做一些善后工作,可以把这些操作写在finalize()方法里(终止器)注:到程序接受时,并非所有收尾模块都会得到调用当指向某个对象的最后一个引用被删除,那么该对象就可以被删除:在对象的无用时可以回收Java的垃圾回收并不能保证内存的耗尽,其只是一个低优先级的后台线程且跟踪可达或者不可达的对象A:当JVM的拦截器调用一个合适对象的finalize()方法时,它会忽略任何由finalize()方法抛出的异常,其它情况下finalize()方法中的异常处理同普遍方法的出来是一样的B:Object对象有一个finalize()方法,由于所有的参数都是从Object类继承而来,因此所有对象有一个finalize()方法C:类可以覆盖finalize()方法,而且和普通的方法覆盖一样,不能降低finalize()方法的访问权限,调用finalize()方法本身不会破坏对象
1.java中finalize()的作用一主要是清理那些对象(并非使用new)获得了一块“特殊”的内存区域。程序员可以用finalize()来操作。 程序员都了解初始化的重要性,但常常会忘记同样也重要的清理工作。毕竟,谁需要清理一个int呢?但在使用程序库时,把一个对象用完后就“弃之不顾”的做法并非总是安全的。当然,java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存区域,为了应对这种情况,java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储孔家,将首先调用其finalize()的方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。注意这里的finalize()并不是c++里的析构.在c++中,对象一定会被销毁,而在java里的对象却并非总是被垃圾回收(1.对象可能不被垃圾回收;2.垃圾回收并并不等于“析构”)。 2.垃圾回收只与内存有关。也就是说,使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),它们也必须同内存及其回收有关。但这是否意味着要是对象中含有其他对象,finalize()就应该明确释放那些对象呢?不,无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。不过,java中一切皆为对象,那这种特殊情况是怎么回事呢?由于在分配内存时可能采用了类似c语言中的做法,而非java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在java中调用非java代码的方式。在非java代码中,也许会调用c的malloc()函数系列来分配存储空间,而且除非了free()函数 3.垃圾回收如何工作“引用记数(reference counting)”是一种简单但速度很慢的垃圾回收技术。每个对象都含有一个引用记数器,当有引用连接至对象时,引用计数加1。当引用离开作用域或被置为null时,引用计数减1。虽然管理引用记数的开销不大,但需要在整个程序生命周期中持续地开销。垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。这种方法有个缺陷,如果对象之间存在循环引用,可能会出现“对象应该被回收,但引用计数却不为零”的情况。对垃圾回收器而言,定位这样存在交互引用的对象组所需的工作量极大。引用记数常用来说明垃圾收集的工作方式,似乎从未被应用于任何一种java虚拟机实现中。

文章TAG:垃圾  垃圾回收  回收  机制  gc垃圾回收机制  为什么要有GC  
下一篇