社区
Java SE
帖子详情
问一个基础问题,生存周期的问题
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
打赏
收藏
问一个基础问题,生存周期的问题
类:A,B,C,D, A中有成员方法:fun_A fun_A调用了初始化了B,B的构造方法中初始化了C, C的构造方法中初始化了D A是包含main启动的类,第一行代码,初始化了自己,调用了fun_A,然后进行下面第二个的代码若干 请问BCD初始化的实例是一直保存到A运行完最后代码后才开始销毁的吗,顺序是DCBA吗,谢谢了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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运行结束也会被销毁。
软件
生存
周期
过程及其模型
记录软件工程
基础
的学习过程,第二篇:软件
生存
周期
过程及其模型。 软件
生存
周期
过程 软件
生存
周期
软件
生存
周期
(software life circle)又称软件生命期,
生存
期。它是指从形成软件开发概念开始,到软件投入使用,再到软件失去价值而消亡的整个过程。 软件
生存
周期
过程 软件
生存
周期
过程,是规定了获取,供应,开发,操作和维护软件时,要实施的过程,活动和任务(见下文)。它旨在提供...
软件
生存
周期
5个基本过程、9个支持过程和7个组织过程
GB/T 8566-2007《信息技术 软件
生存
周期
过程》标准把软件
生存
周期
中可能执行的活动分为5个基本过程、9个支持过程和7个组织过程,每一
生存
周期
过程划分为一组活动,每一活动进一步划分为任务。 5个基本过程: 1、获取过程:为需方而定义的活动,启动,招标,合同,对供方监督,验收等 2、供应过程:为供方而定义的活动,启动,准备投标,签订合同,编制计划,执行,交付和完成 3、开发过程:为开...
软件工程-软件
生存
周期
模型
软件工程-软件
生存
周期
模型 软件工程-软件测试 软件工程-软件测试-测试方法 概念 同任何事物一样,
一个
软件产品或软件系统也要经过孕育、诞生、成长、成熟、衰亡的许多阶段,一般称为软件
生存
周期
。 软件的生命
周期
包括可行性分析与项目开发计划、需求分析、总体设计、详细设计、编码和单元测试、综合测试及维护阶段。 软件
生存
周期
模型 概念 软件
生存
周期
模型是
一个
包括软件产品开发、运行和维护中有关过程、活动和任务的框架,覆盖了从该系统的需求定义到系统的使用终止。 模型 瀑布模型 概念 瀑布模型是将软件
生存
周期
各个活动规定
C++类的
生存
周期
众所周知,类是C++的核心,而对于类的
生存
周期
的长短是受到很多因素影响,在这里我从以下几个方面来分析: 类在.data段生成时的
生存
周期
类在栈区生成时的
生存
周期
类在堆区生成时的
生存
周期
为了体现各种情况下类的
生存
周期
,我们写
一个
测试用例来直观地感受。 class CGoods//实现三种构造方式
一个
拷贝构造函数
一个
赋值运算符重载 { public: CGoods(char* name...
软件工程(二)软件
生存
周期
与软件过程
软件
生存
周期
一个
软件从开始立项起,到废弃不用为止,统称软件的
生存
周期
。典型的软件
生存
周期
的主要活动包括: 需求分析 明确用户需要解决的
问
题
,分析员根据对
问
题
的理解提出关于系统目标与范围的说明,从用户视角对需求进行定义和分析,用需求模型的形式准确地表达出来 软件分析 在需求模型的
基础
上,从开发人员视角对软件需求模型进行分析,建立于需求模型一致,与实现无关的软件分析模型。它既是对软件系统逻辑...
Java SE
62,615
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章