BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #15353同步于 2010/7/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

有关对象生命周期的问题

hmk
2010/7/28镜像同步24 回复
thinking in java 里面说: c++可以把对象放在栈里或者静态内存区里,这样可以获得较快的运行速度。 java把对象放在堆里,这样编译器不知道什么时候对象该被清除,所以需要使用垃圾回收器。 如果在栈里面创建对象,编译器会自动判断对象的寿命有多长,并且进行自动的清理。 请问大牛们: c++什么时候在栈里创建对象,什么时候在静态内存区里创建对象,什么时候在堆里创建对象呢?在栈里面创建对象既然又快又不需要人工清理,为什么不针对所有的情况都采用这种方式呢? 既然编译器不知道对象的寿命有多长,那么java的垃圾回收器是怎么运行的呢? 虽然有一部分是关于c++的,但是我是在看thinkinginjava的时候看到的问题,就在这问了吧,请大家不吝赐教
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
coolfantasy机器人#1 · 2010/7/28
栈空间比堆空间小得多,这个话题比较大,建议看一下《深入理解计算机系统》 栈空间主要是用来保存函数调用信息的,比如函数返回地址,调用参数,临时变量(在栈上分配的变量)等 在栈上分配空间会更快?这个倒不一定吧 栈跟堆的物理性质应该是一样的,一个在内存空间里从高往低生长,一个从低往高生长 垃圾回收的办法比较多,一般常用的是“引用计数” 【 在 hmk (头发,腹肌和手指) 的大作中提到: 】 : 标 题: 有关对象生命周期的问题 : 发信站: 北邮人论坛 (Wed Jul 28 15:32:27 2010), 站内 : : thinking in java 里面说: : c++可以把对象放在栈里或者静态内存区里,这样可以获得较快的运行速度。 : java把对象放在堆里,这样编译器不知道什么时候对象该被清除,所以需要使用垃圾回收器。 : 如果在栈里面创建对象,编译器会自动判断对象的寿命有多长,并且进行自动的清理。 : : 请问大牛们: : c++什么时候在栈里创建对象,什么时候在静态内存区里创建对象,什么时候在堆里创建对象呢?在栈里面创建对象既然又快又不需要人工清理,为什么不针对所有的情况都采用这种方式呢? : 既然编译器不知道对象的寿命有多长,那么java的垃圾回收器是怎么运行的呢? : : 虽然有一部分是关于c++的,但是我是在看thinkinginjava的时候看到的问题,就在这问了吧,请大家不吝赐教 : : -- : : ※ 来源:·北邮人论坛 bbs.byr.cn·[FROM: 221.221.10.*]
ox机器人#2 · 2010/7/28
re 当一个对象的引用为0时,垃圾回收器就认为你不需要这个对象了,这个对象会被垃圾回收器回收,但是垃圾回收器不会立即回收它 【 在 coolfantasy (Cool) 的大作中提到: 】 : 栈空间比堆空间小得多,这个话题比较大,建议看一下《深入理解计算机系统》 : 栈空间主要是用来保存函数调用信息的,比如函数返回地址,调用参数,临时变量(在栈上分配的变量)等 : 在栈上分配空间会更快?这个倒不一定吧 栈跟堆的物理性质应该是一样的,一个在内存空间里从高往低生长,一个从低往高生长 : ...................
coolfantasy机器人#3 · 2010/7/28
在 C++ 里的内存分配都是程序员控制的 char text1[] = "123"; // 栈 char *text2 = new char(4); // 堆 char *text3 = "123"; // 全局静态区
hmk机器人#4 · 2010/7/28
谢谢。如果是c++在栈上new一个对象,会有什么关键词呢? 【 在 coolfantasy (Cool) 的大作中提到: 】 : 标 题: Re: 有关对象生命周期的问题 : 发信站: 北邮人论坛 (Wed Jul 28 15:39:11 2010), 站内 : : 栈空间比堆空间小得多,这个话题比较大,建议看一下《深入理解计算机系统》 : : 栈空间主要是用来保存函数调用信息的,比如函数返回地址,调用参数,临时变量(在栈上分配的变量)等 : : 在栈上分配空间会更快?这个倒不一定吧 栈跟堆的物理性质应该是一样的,一个在内存空间里从高往低生长,一个从低往高生长 这个书上这么说的: Creating storage on the stack is often a single assembly instruction to move the stack pointer down, and another to move it back up. The time to create heap storage depends on the design of the storage mechanism. : : 垃圾回收的办法比较多,一般常用的是“引用计数” : : 【 在 hmk (头发,腹肌和手指) 的大作中提到: 】 : : 标 题: 有关对象生命周期的问题 : : 发信站: 北邮人论坛 (Wed Jul 28 15:32:27 2010), 站内 : : : : thinking in java 里面说: : : c++可以把对象放在栈里或者静态内存区里,这样可以获得较快的运行速度。 : : java把对象放在堆里,这样编译器不知道什么时候对象该被清除,所以需要使用垃圾回收器。 : : 如果在栈里面创建对象,编译器会自动判断对象的寿命有多长,并且进行自动的清理。 : : : : 请问大牛们: : : c++什么时候在栈里创建对象,什么时候在静态内存区里创建对象,什么时候在堆里创建对象呢?在栈里面创建对象既然又快又不需要人工清理,为什么不针对所有的情况都采用这种方式呢? : : 既然编译器不知道对象的寿命有多长,那么java的垃圾回收器是怎么运行的呢? : : : : 虽然有一部分是关于c++的,但是我是在看thinkinginjava的时候看到的问题,就在这问了吧,请大家不吝赐教 : : : : -- : : : : ※ 来源:·北邮人论坛 bbs.byr.cn·[FROM: 221.221.10.*] : : : -- : : /** 三日不编程,食肉无味 */ : : : ※ 来源:·北邮人论坛 bbs.byr.cn·[FROM: 114.251.120.*]
coolfantasy机器人#5 · 2010/7/28
【 在 hmk (头发,腹肌和手指) 的大作中提到: 】 : 标 题: Re: 有关对象生命周期的问题 : 发信站: 北邮人论坛 (Wed Jul 28 15:45:19 2010), 站内 : : 谢谢。如果是c++在栈上new一个对象,会有什么关键词呢? : 【 在 coolfantasy (Cool) 的大作中提到: 】 : : 标 题: Re: 有关对象生命周期的问题 : : 发信站: 北邮人论坛 (Wed Jul 28 15:39:11 2010), 站内 : : : : 栈空间比堆空间小得多,这个话题比较大,建议看一下《深入理解计算机系统》 : : : : 栈空间主要是用来保存函数调用信息的,比如函数返回地址,调用参数,临时变量(在栈上分配的变量)等 : : : : 在栈上分配空间会更快?这个倒不一定吧 栈跟堆的物理性质应该是一样的,一个在内存空间里从高往低生长,一个从低往高生长 : 这个书上这么说的: Creating : storage on the stack is often a single assembly instruction to move the : stack pointer down, and another to move it back up. The time to create : heap storage depends on the design of the storage mechanism. 那这个就是实现相关的问题了,Java 是基于 JVM 的,跟操作系统原生的堆栈概念可能会有所不同 : : : : : 垃圾回收的办法比较多,一般常用的是“引用计数” : : : : 【 在 hmk (头发,腹肌和手指) 的大作中提到: 】 : : : 标 题: 有关对象生命周期的问题 : : : 发信站: 北邮人论坛 (Wed Jul 28 15:32:27 2010), 站内 : : : : : : thinking in java 里面说: : : : c++可以把对象放在栈里或者静态内存区里,这样可以获得较快的运行速度。 : : : java把对象放在堆里,这样编译器不知道什么时候对象该被清除,所以需要使用垃圾回收器。 : : : 如果在栈里面创建对象,编译器会自动判断对象的寿命有多长,并且进行自动的清理。 : : : : : : 请问大牛们: : : : c++什么时候在栈里创建对象,什么时候在静态内存区里创建对象,什么时候在堆里创建对象呢?在栈里面创建对象既然又快又不需要人工清理,为什么不针对所有的情况都采用这种方式呢? : : : 既然编译器不知道对象的寿命有多长,那么java的垃圾回收器是怎么运行的呢? : : : : : : 虽然有一部分是关于c++的,但是我是在看thinkinginjava的时候看到的问题,就在这问了吧,请大家不吝赐教 : : : : : : -- : : : : : : ※ 来源:·北邮人论坛 bbs.byr.cn·[FROM: 221.221.10.*] : : : : : : -- : : : : /** 三日不编程,食肉无味 */ : : : : : : ※ 来源:·北邮人论坛 bbs.byr.cn·[FROM: 114.251.120.*] : : : -- : : ※ 来源:·北邮人论坛 bbs.byr.cn·[FROM: 221.221.10.*]
hmk机器人#6 · 2010/7/28
明白了,我对对象的理解太狭隘了。 全局静态区那句是怎么回事?难道不用static吗? 在java里面 所有的数组都是分配在堆上的吗? 【 在 coolfantasy (Cool) 的大作中提到: 】 : 在 C++ 里的内存分配都是程序员控制的 : char text1[] = "123"; // 栈 : char *text2 = new char(4); // 堆 : ...................
hmk机器人#7 · 2010/7/28
说是 a pool of memory called the heap. 是不是本身就是此堆非彼堆 【 在 coolfantasy (Cool) 的大作中提到: 】 : 那这个就是实现相关的问题了,Java 是基于 JVM 的,跟操作系统原生的堆栈概念可能会有所不同
coolfantasy机器人#8 · 2010/7/28
这个还挺复杂的,你可以搜索一下“C语言内存分配”,全局变量还分了已初始化和未初始化的 我不懂 Java。。。 【 在 hmk (头发,腹肌和手指) 的大作中提到: 】 : 明白了,我对对象的理解太狭隘了。 : 全局静态区那句是怎么回事?难道不用static吗? : 在java里面 所有的数组都是分配在堆上的吗? : ...................
coolfantasy机器人#9 · 2010/7/28
虚拟机也是遵循一定的计算机体系结构规范的,它们的概念和作用基本上是相同的,但是具体的实现方式可能不同 【 在 hmk (头发,腹肌和手指) 的大作中提到: 】 : 说是 a pool of memory called the heap. : 是不是本身就是此堆非彼堆