Redian新闻
>
array 在java里 是一定放在heap 吗?
avatar
array 在java里 是一定放在heap 吗?# Java - 爪哇娇娃
s*n
1
窗户感觉漏风,
地毯有些地方有明显的分割线,并且凸起。
现在想让建商修
英文怎么说?
avatar
s*s
2
fyi.
avatar
h*v
3
windows are not air tight...could feel a draft near the window...the cold
air leaks around the windows and into the room...
the carpet seam is visible and part of it is bulging

【在 s********n 的大作中提到】
: 窗户感觉漏风,
: 地毯有些地方有明显的分割线,并且凸起。
: 现在想让建商修
: 英文怎么说?

avatar
f*n
4
yes. Arrays are objects. Objects are all dynamically allocated on the heap.
avatar
s*n
5
窗户感觉漏风,
地毯有些地方有明显的分割线,并且凸起。
现在想让建商修
英文怎么说?
avatar
s*s
6
really? everything in Java is object, so everything is in heap?

【在 f*******n 的大作中提到】
: yes. Arrays are objects. Objects are all dynamically allocated on the heap.
avatar
h*v
7
windows are not air tight...could feel a draft near the window...the cold
air leaks around the windows and into the room...
the carpet seam is visible and part of it is bulging

【在 s********n 的大作中提到】
: 窗户感觉漏风,
: 地毯有些地方有明显的分割线,并且凸起。
: 现在想让建商修
: 英文怎么说?

avatar
p*2
8

int不是object吧?

【在 s****s 的大作中提到】
: really? everything in Java is object, so everything is in heap?
avatar
w*r
9
windows are a little bit leaky (or not air tight).
there are places on carpet where cutting lines or bulging are visible.

【在 s********n 的大作中提到】
: 窗户感觉漏风,
: 地毯有些地方有明显的分割线,并且凸起。
: 现在想让建商修
: 英文怎么说?

avatar
z*e
10
基础数据类型不是对象

【在 s****s 的大作中提到】
: really? everything in Java is object, so everything is in heap?
avatar
c*e
11
declare的时候要new的就是在heap. int,boolean不在heap.

【在 s****s 的大作中提到】
: really? everything in Java is object, so everything is in heap?
avatar
t*a
12
local的基本类型和对象引用在stack中

【在 s****s 的大作中提到】
: really? everything in Java is object, so everything is in heap?
avatar
F*X
13
我是 Java 新手,也在学习中,我也来说2句。
例子:int[] numberArryExample = new int[];
1)"numberArryExample" on the stack
2)"new int[]" on the heap (上面 convergence (Rex) 已经提到了这点,keyword
是"new")
avatar
a*w
14
文不对题

【在 s****s 的大作中提到】
: fyi.
avatar
t*a
15
如果numberArrayExample是field, 那么他在heap

【在 F*******X 的大作中提到】
: 我是 Java 新手,也在学习中,我也来说2句。
: 例子:int[] numberArryExample = new int[];
: 1)"numberArryExample" on the stack
: 2)"new int[]" on the heap (上面 convergence (Rex) 已经提到了这点,keyword
: 是"new")

avatar
F*X
16
你说得对, instance variable 是 on the heap。 谢谢补充。
突然又想到,自己补充一下:doSomething (int[] numberArrayExample);这 “
numberArrayExample”又会是 on the stack。

【在 t***a 的大作中提到】
: 如果numberArrayExample是field, 那么他在heap
avatar
s*s
17
没人会问这样的问题吧.

【在 F*******X 的大作中提到】
: 你说得对, instance variable 是 on the heap。 谢谢补充。
: 突然又想到,自己补充一下:doSomething (int[] numberArrayExample);这 “
: numberArrayExample”又会是 on the stack。

avatar
g*g
18
The array (an object) is stored on the heap, the reference can be stored on
heap or stack, depending on whether it's an instance variable.

【在 F*******X 的大作中提到】
: 你说得对, instance variable 是 on the heap。 谢谢补充。
: 突然又想到,自己补充一下:doSomething (int[] numberArrayExample);这 “
: numberArrayExample”又会是 on the stack。

avatar
F*X
19
只是近来看书看到“Java is pass-by-value”而思考了一下,所以对 stack 和 heap
有点想法而已。

【在 s****s 的大作中提到】
: 没人会问这样的问题吧.
avatar
s*s
20
你这样理解, 我还真是无话说了.
这样的话,当create一个variable时, reference 在 stack, object在heap. 真是奇怪
了.

【在 F*******X 的大作中提到】
: 我是 Java 新手,也在学习中,我也来说2句。
: 例子:int[] numberArryExample = new int[];
: 1)"numberArryExample" on the stack
: 2)"new int[]" on the heap (上面 convergence (Rex) 已经提到了这点,keyword
: 是"new")

avatar
s*s
21
为什么instance variable在heap, 其它variable就不在吗?

on

【在 g*****g 的大作中提到】
: The array (an object) is stored on the heap, the reference can be stored on
: heap or stack, depending on whether it's an instance variable.

avatar
z*3
22
在stack里面的是地址或者原始数据类型
如果把所有数据都放在stack里面放不下
只能放下一些简单的数字
所以对于类这种尾巴大的东西
在stack里面保存一个地址
然后真正要用的时候就从stack里面取出地址
然后在heap中找到后再用
所以所有的对象都在heap里面
除非你不把它定义成类的对象
Integer i = new Integer(2);
这个就有在heap里面创建对象
int i = 2;这个就没有在heap里面创建对象
另外这个引申了之后是==和equals的差别
==比较的是stack里面的数据是否相同
equals要override,一般来说是判断heap里面每一块的数据是否相同
再高级一点是String特殊对象的对象池
然后就是1.5的autoboxing,int i = new Integer(2);
这种方式的使用,不明确区分原始数据类型及其包装类

【在 s****s 的大作中提到】
: 为什么instance variable在heap, 其它variable就不在吗?
:
: on

avatar
g*g
23
Because instance variable is part of object instance. And object instance is
created on heap.

【在 s****s 的大作中提到】
: 为什么instance variable在heap, 其它variable就不在吗?
:
: on

avatar
z*3
24
不奇怪
放在stack里面便于查找
所有的数据放在一起的话
一旦遇到一个特别大的heap的话
找起来效率就很低了
应该是所有的底层都是这个逻辑

【在 s****s 的大作中提到】
: 你这样理解, 我还真是无话说了.
: 这样的话,当create一个variable时, reference 在 stack, object在heap. 真是奇怪
: 了.

avatar
w*z
25
stack 小而快,heap 大而慢。

【在 z*******3 的大作中提到】
: 不奇怪
: 放在stack里面便于查找
: 所有的数据放在一起的话
: 一旦遇到一个特别大的heap的话
: 找起来效率就很低了
: 应该是所有的底层都是这个逻辑

avatar
t*a
26
赵老师前面那贴,我是真心没看明白。。。。。。

【在 w**z 的大作中提到】
: stack 小而快,heap 大而慢。
avatar
F*X
27
我说的是对的,local variable (reference) 都在 stack, object 和 instance
variable 都在 heap。这些都是基础知识, 每本书都教的,还有 Java is pass-by-
value, 思考一下这意思.

【在 s****s 的大作中提到】
: 你这样理解, 我还真是无话说了.
: 这样的话,当create一个variable时, reference 在 stack, object在heap. 真是奇怪
: 了.

avatar
F*X
28
我在某处看到 JVM 还有 register 这玩意,我在学 assembly 的时候知道这 register
就是相当于 MCU 的左右手,但在 JVM 里面,这是什么用处了?书本里都没有提到。

【在 w**z 的大作中提到】
: stack 小而快,heap 大而慢。
avatar
t*a
29
可以给eclipse装个asm bytecode的插件,就可以看到java编译好的代码了
就跟以前用TASM一样。。。

register

【在 F*******X 的大作中提到】
: 我在某处看到 JVM 还有 register 这玩意,我在学 assembly 的时候知道这 register
: 就是相当于 MCU 的左右手,但在 JVM 里面,这是什么用处了?书本里都没有提到。

avatar
F*X
30
谢谢回复。大侠看样子是老手呀,小弟还在学习中,碍予能力有限,ECLIPSE 只会写个
HELLO WORLD 而已,插件还不懂怎么弄,希望以后弄一弄。

【在 t***a 的大作中提到】
: 可以给eclipse装个asm bytecode的插件,就可以看到java编译好的代码了
: 就跟以前用TASM一样。。。
:
: register

avatar
p*2
31

你觉得哪段没明白。能不能拿出来讨论?还是整个都没明白?我刚扫了一下,感觉说的
差不多呀。

【在 t***a 的大作中提到】
: 赵老师前面那贴,我是真心没看明白。。。。。。
avatar
t*a
32
为啥stack查找快?
为啥heap大而慢?
在stack的variable table里的要么是primitive value,要么是reference value,这
个table应该不会大,于是就查找快?我觉得stack里就是个变量数组而已,慢是慢不了
,可是也不能说就小而快了吧
如果是reference value的话,拿着这个ref value去heap里找instance,因为heap比
stack空间大,会慢。赵老师是这个意思么?

【在 p*****2 的大作中提到】
:
: 你觉得哪段没明白。能不能拿出来讨论?还是整个都没明白?我刚扫了一下,感觉说的
: 差不多呀。

avatar
t*a
33
不老不老,还嫩着呢
还是有些好玩的插件的,前面怎么说来着,用eclipse不装plugin, 如入宝山而空返啊
。。。

【在 F*******X 的大作中提到】
: 谢谢回复。大侠看样子是老手呀,小弟还在学习中,碍予能力有限,ECLIPSE 只会写个
: HELLO WORLD 而已,插件还不懂怎么弄,希望以后弄一弄。

avatar
s*s
34
这些make sense, 但有的地方是有点奇怪.
我在java方面还是门外汉, 再等等吧.
奇怪的地方是,local的话, new 一个东西,肯定是放在heap.我印象中c++是这样一来的.
不知道有人证实一下? 那java的变化也太大了.

【在 F*******X 的大作中提到】
: 我说的是对的,local variable (reference) 都在 stack, object 和 instance
: variable 都在 heap。这些都是基础知识, 每本书都教的,还有 Java is pass-by-
: value, 思考一下这意思.

avatar
p*2
35

好像不是。zhaoce是回答上边的问题的。感觉意思是说如果ref和val都放在heap里就慢
了。因为上边的问题是问为什么val在heap,ref在stack。

【在 t***a 的大作中提到】
: 为啥stack查找快?
: 为啥heap大而慢?
: 在stack的variable table里的要么是primitive value,要么是reference value,这
: 个table应该不会大,于是就查找快?我觉得stack里就是个变量数组而已,慢是慢不了
: ,可是也不能说就小而快了吧
: 如果是reference value的话,拿着这个ref value去heap里找instance,因为heap比
: stack空间大,会慢。赵老师是这个意思么?

avatar
p*2
36

的.
我怎么觉得java跟C++没啥区别呢?
这个问题怎么讨论了这么长呀?

【在 s****s 的大作中提到】
: 这些make sense, 但有的地方是有点奇怪.
: 我在java方面还是门外汉, 再等等吧.
: 奇怪的地方是,local的话, new 一个东西,肯定是放在heap.我印象中c++是这样一来的.
: 不知道有人证实一下? 那java的变化也太大了.

avatar
t*a
37
c++中
void foo(){
A a; //a在stack中,如果foo结束,a就销毁
A* a = new A; //foo结束,a指向的东西还在, 所以你需要delete a在其他什么地方
}
java中
void foo(){
A a = new A(); //a只是个reference, 在stack中,a指向的instance在heap中。如
果foo结束了,销毁的只是这个ref。如果再没有任何ref指向new A()出来的这个
instance, GC会在以后的某个时间自动销毁instance
}
所以其实没啥大差别。。。。。一个自动档,一个手动挡。。。

的.

【在 s****s 的大作中提到】
: 这些make sense, 但有的地方是有点奇怪.
: 我在java方面还是门外汉, 再等等吧.
: 奇怪的地方是,local的话, new 一个东西,肯定是放在heap.我印象中c++是这样一来的.
: 不知道有人证实一下? 那java的变化也太大了.

avatar
F*X
38
我是这样子理解的,我先说我对 local variable 的定义:就是那些在 method 下面 (
包括 main, parameter,etc)而在 object 前面或者不再 object 里面的都是 local
variable 。当你要 new 就是要用的 object 了,就没有 local variable。自己的看
书心得,大家发现我的错误请更正一下。

的.

【在 s****s 的大作中提到】
: 这些make sense, 但有的地方是有点奇怪.
: 我在java方面还是门外汉, 再等等吧.
: 奇怪的地方是,local的话, new 一个东西,肯定是放在heap.我印象中c++是这样一来的.
: 不知道有人证实一下? 那java的变化也太大了.

avatar
t*a
39
在method里声明的variable,都是local variable
连method parameters, 都得算local variable...

(
local

【在 F*******X 的大作中提到】
: 我是这样子理解的,我先说我对 local variable 的定义:就是那些在 method 下面 (
: 包括 main, parameter,etc)而在 object 前面或者不再 object 里面的都是 local
: variable 。当你要 new 就是要用的 object 了,就没有 local variable。自己的看
: 书心得,大家发现我的错误请更正一下。
:
: 的.

avatar
s*s
40
这样理解就是自己给自己添麻烦.
local也好, global也好,还有auto什么的, 主要理解就是生存周期.
local生存周期短, 用完就没, 所以放在stack.
其它的生存周期长, 需要保存, 想放在stack都不行, 必须得放heap.
用这个准则, 再去理解什么instance variable, method variabl就很清楚了, 也不用
去记.

(
local

【在 F*******X 的大作中提到】
: 我是这样子理解的,我先说我对 local variable 的定义:就是那些在 method 下面 (
: 包括 main, parameter,etc)而在 object 前面或者不再 object 里面的都是 local
: variable 。当你要 new 就是要用的 object 了,就没有 local variable。自己的看
: 书心得,大家发现我的错误请更正一下。
:
: 的.

avatar
s*s
41
有区别的.
但我真不认为在c++里面 曾经这样理解过.
可能c++里面对reference的使用没有java这么的多.

【在 p*****2 的大作中提到】
:
: 的.
: 我怎么觉得java跟C++没啥区别呢?
: 这个问题怎么讨论了这么长呀?

avatar
s*s
42
这个例子好,我就抛砖引玉,大家一起来讨论:
void foo(){
int *p; // 1. p 在stack还是heap?
M *m; // 2. m 在stack还是heap?
p = new int[20]; //3. p 在stack还是heap?
m = new M(); //4. p 在stack还是heap?
int *p1 = new int[20];//5. p1 在stack还是heap?
M *m1 = new M(); //6 .m1 在stack还是heap?
int *p2 = NULL;//7. p2 在stack还是heap?
M *m2 = NULL;//8, m2 在stack还是heap?
}
大家直接给出1, 2,3 ,4, 5, 6, 7,8 的答案吧. 免得我更糊涂.

地方

【在 t***a 的大作中提到】
: c++中
: void foo(){
: A a; //a在stack中,如果foo结束,a就销毁
: A* a = new A; //foo结束,a指向的东西还在, 所以你需要delete a在其他什么地方
: }
: java中
: void foo(){
: A a = new A(); //a只是个reference, 在stack中,a指向的instance在heap中。如
: 果foo结束了,销毁的只是这个ref。如果再没有任何ref指向new A()出来的这个
: instance, GC会在以后的某个时间自动销毁instance

avatar
F*n
43
JVM实际上只有5种类型,int, float, long, double, reference/address
不管哪中类型只要出现在 code statement (包括 method parameter)里就在Stack上
而reference 指向的类数据肯定在 heap 上
所以类的成员变量不管啥类型也在 heap 上
另外JVM的Stack 和 Heap都是抽象的,具体实现可以乱搞

【在 s****s 的大作中提到】
: 这个例子好,我就抛砖引玉,大家一起来讨论:
: void foo(){
: int *p; // 1. p 在stack还是heap?
: M *m; // 2. m 在stack还是heap?
: p = new int[20]; //3. p 在stack还是heap?
: m = new M(); //4. p 在stack还是heap?
: int *p1 = new int[20];//5. p1 在stack还是heap?
: M *m1 = new M(); //6 .m1 在stack还是heap?
: int *p2 = NULL;//7. p2 在stack还是heap?
: M *m2 = NULL;//8, m2 在stack还是heap?

avatar
t*a
44
有c/c++版么。。。。。。。c++水太深了,谁知道它咋整的

【在 s****s 的大作中提到】
: 这个例子好,我就抛砖引玉,大家一起来讨论:
: void foo(){
: int *p; // 1. p 在stack还是heap?
: M *m; // 2. m 在stack还是heap?
: p = new int[20]; //3. p 在stack还是heap?
: m = new M(); //4. p 在stack还是heap?
: int *p1 = new int[20];//5. p1 在stack还是heap?
: M *m1 = new M(); //6 .m1 在stack还是heap?
: int *p2 = NULL;//7. p2 在stack还是heap?
: M *m2 = NULL;//8, m2 在stack还是heap?

avatar
w*z
45
stack is with the thread, heap is global to the process/ jvm . you can set
the size for both through jvm startup parameter .

【在 s****s 的大作中提到】
: 这样理解就是自己给自己添麻烦.
: local也好, global也好,还有auto什么的, 主要理解就是生存周期.
: local生存周期短, 用完就没, 所以放在stack.
: 其它的生存周期长, 需要保存, 想放在stack都不行, 必须得放heap.
: 用这个准则, 再去理解什么instance variable, method variabl就很清楚了, 也不用
: 去记.
:
: (
: local

avatar
n*e
46
我的理解, 所有这些variables都在stack上面。因为这些都是local variables。
这些指针所指向的object在heap上面。
C++里面需要人为的delete这些allocated memory space, 否则会产生memory leakage.
Java是通过GC来自动的回收这些allocated memory space。

【在 s****s 的大作中提到】
: 这个例子好,我就抛砖引玉,大家一起来讨论:
: void foo(){
: int *p; // 1. p 在stack还是heap?
: M *m; // 2. m 在stack还是heap?
: p = new int[20]; //3. p 在stack还是heap?
: m = new M(); //4. p 在stack还是heap?
: int *p1 = new int[20];//5. p1 在stack还是heap?
: M *m1 = new M(); //6 .m1 在stack还是heap?
: int *p2 = NULL;//7. p2 在stack还是heap?
: M *m2 = NULL;//8, m2 在stack还是heap?

avatar
x*d
47
i didn't read the whole thread. But guys, can you pickup a preparation book
for oracle/sun certified java developer exam? It is summarized very clear in
that book, what is in the heap and what is in the stack.
that is why I advocate scjp exam for all java developers.
Another recommendation, read ibm article, from java code to java heap,
google it.
avatar
J*o
48
扣的好细呀
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。