问一个基础问题,生存周期的问题

flycsdn 2008-12-06 05:44:18
类:A,B,C,D,
A中有成员方法:fun_A

fun_A调用了初始化了B,B的构造方法中初始化了C, C的构造方法中初始化了D

A是包含main启动的类,第一行代码,初始化了自己,调用了fun_A,然后进行下面第二个的代码若干

请问BCD初始化的实例是一直保存到A运行完最后代码后才开始销毁的吗,顺序是DCBA吗,谢谢了


...全文
130 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
老紫竹 2008-12-07
  • 打赏
  • 举报
回复
如果只是初始化,但没有属性保存B,则B会在合适的时候被回收,无须等A结束。
bzwm 2008-12-07
  • 打赏
  • 举报
回复
lz你最好能把问题具体化一点,

如lz的描述,我只能认为,A的 fun_A方法里只是实例化了B,
而如果实际情况是 fun_A方法实例化了B,然后将这个引用附给了 A 的成员变量 b,

则 fun_A方法返回,B也不会被销毁的。

有代码贴出来,具体问题具体分析啊。
myjava_024 2008-12-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nj_luyi 的回复:]
属于GC问题;
java的垃圾回收绝大多数都是采用有向图来做的,当这个对象没有被其他任何元素所引用时就会被垃圾回收掉!
转一篇文章给你

GC的基本原理

Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象.

GC在JVM中通常是由一个或一组进程来实现的,它本身也…
[/Quote]
学习
flycsdn 2008-12-06
  • 打赏
  • 举报
回复
会不会是A构造实例化自己之后,制造了BCD之后,在进行第一行代码的时候,就提前直接就销毁了DCB????
flycsdn 2008-12-06
  • 打赏
  • 举报
回复
非常谢谢,现在我变化一下条件:
只变化一个地方:
不是fun_A调用了初始化了B
而是A的构造函数初始化了B
此时情况相同吗????
nj_luyi 2008-12-06
  • 打赏
  • 举报
回复
属于GC问题;
java的垃圾回收绝大多数都是采用有向图来做的,当这个对象没有被其他任何元素所引用时就会被垃圾回收掉!
转一篇文章给你

GC的基本原理

Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象.

GC在JVM中通常是由一个或一组进程来实现的,它本身也和用户程序一样占用heap空间,运行时也占用CPU。当GC进程运行时,应用程序停止运行。因此,当GC运行时间较长时,用户能够感到Java程序的停顿,另外一方面,如果GC运行时间太短,则可能对象回收率太低,这意味着还有很多应该回收的对象没有被回收,仍然占用大量内存。因此,在设计GC的时候,就必须在停顿时间和回收率之间进行权衡。

增量式GC( Incremental GC )
Sun JDK提供的HotSpot JVM就能支持增量式GC。HotSpot JVM缺省GC方式为不使用增量GC,为了启动增量GC,我们必须在运行Java程序时增加-Xincgc的参数。HotSpot JVM增量式GC的实现是采用Train GC算法。它的基本想法就是,将堆中的所有对象按照创建和使用情况进行分组(分层),将使用频繁高和具有相关性的对象放在一队中,随着程序的运行,不断对组进行调整。当GC运行时,它总是先回收最老的(最近很少访问的)的对象,如果整组都为可回收对象,GC将整组回收。这样,每次GC运行只回收一定比例的不可达对象,保证程序的顺畅运行。Train GC算法是一个非常好的算法,

finalize函数:
再次强调,不要把资源回收的工作放在finalize中,不稳定不保险。

程序如何与GC进行交互:
Java2增强了内存管理功能,增加了一个java.lang.ref包,其中定义了三种引用类。这三种引用类分别为SoftReference、WeakReference和 PhantomReference。通过使用这些引用类,程序员可以在一定程度与GC进行交互,以便改善GC的工作效率。这些引用类的引用强度介于可达对象和不可达对象之间。

Soft Reference的主要特点是据有较强的引用功能。只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引用对象还能保证在Java抛出OutOfMemory 异常之前,被设置为null。它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory。

Weak引用对象与Soft引用对象的最大不同就在于:GC在进行回收时,需要通过算法检查是否回收Soft引用对象,而对于Weak引用对象,GC总是进行回收。Weak引用对象更容易、更快被GC回收。虽然,GC在运行时一定回收Weak对象,但是复杂关系的Weak对象群常常需要好几次GC的运行才能完成。Weak引用对象常常用于Map结构中,引用数据量较大的对象,一旦该对象的强引用为null时,GC能够快速地回收该对象空间

Phantom引用的用途较少

一些Java编码的建议

根据GC的工作原理,我们可以通过一些技巧和方式,让GC运行更加有效率,更加符合应用程序的要求。以下就是一些程序设计的几点建议。

1. 最基本的建议就是尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null。我们在使用这种方式时候,必须特别注意一些复杂的对象图,例如数组,队列,树,图等,这些对象之间有相互引用关系较为复杂。对于这类对象,GC回收它们一般效率较低。如果程序允许,尽早将不用的引用对象赋为null。这样可以加速GC的工作。
2. 尽量少用finalize函数。finalize函数是Java提供给程序员一个释放对象或资源的机会。但是,它会加大GC的工作量,因此尽量少采用finalize方式回收资源。
3. 如果需要使用经常使用的图片,可以使用soft应用类型。它可以尽可能将图片保存在内存中,供程序调用,而不引起OutOfMemory。
4. 注意集合数据类型,包括数组,树,图,链表等数据结构,这些数据结构对GC来说,回收更为复杂。另外,注意一些全局
的变量,以及一些静态变量。这些变量往往容易引起悬挂对象(dangling reference),造成内存浪费。
5. 当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。使用增量式GC可以缩短Java程序的暂停时间。
chandlersong 2008-12-06
  • 打赏
  • 举报
回复
不能这么一概而论。java里面对象被销毁只有一种可能,那就是指针变量没有指针指向它。只是一般情况下,方法返回,在这个方法内的指针变量都会被销毁。所以对象也会被销毁。
但是如果说你初始化了B,让一个方法外的变量指向他的话,对象还会存在。
bzwm 2008-12-06
  • 打赏
  • 举报
回复
我的理解:
B是 A类中方法 fun_A的局部变量,

当fun_A方法返回,B,C,D的实例就会开始销毁,

顺序是 D,C,B。

当A运行结束也会被销毁。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧