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