有人问我Java的String 能方几个G的数据,内存有那么便宜吗
我在怀疑他搞什么
1
ivanlw 2015-06-18 16:03:33 +08:00
搞面试的。
|
2
wdlth 2015-06-18 16:17:28 +08:00
用String放G级的数据,他是当clob用么……
|
3
rikeinei OP |
4
jedrek 2015-06-18 16:46:17 +08:00
若面试碰到这种傻逼问题,是真比吃了苍蝇还恶心
|
5
hinate 2015-06-18 16:55:50 +08:00 via iPhone
你应该反问,你会把几个G的数据放到里面吗→_→
|
6
fangjinmin 2015-06-18 17:02:58 +08:00
这个问题还真不好回答。
得看该变量是什么类型才行,如果是全局变量,或者是静态变量,应该是看堆的内堆大小。 如果是临时变量,应该看stack的大小。 |
7
akira 2015-06-18 17:17:47 +08:00
说不定过几年,机器标配都是TB级别内存呢。
|
8
otakustay 2015-06-18 18:10:33 +08:00
我以为这问题在问你一个char占多大*String的length是啥类型……
|
9
iyangyuan 2015-06-19 09:19:12 +08:00
@fangjinmin
无论变量可见性如何,String的空间都是分配在堆中的吧!栈里分配的仅仅是指针而已。 一般情况而言,线程栈的大小只有1M左右,如果直接将字符串分配在栈里,很容易就溢出了。 线程栈的内部会存放方法帧,帧中存放的要么是指针,要么是基本类型,一般递归时,由于帧太多,可能会导致栈内存溢出。 堆内存溢出举例: byte[] buffer = new byte[1024*1024*512]; //假设jvm堆内存小于512M,抛出:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 栈内存溢出举例: //抛出:Exception in thread "main" java.lang.StackOverflowError public static void main(String[] args){ main(args); } 个人见解,仅供参考 |
10
fangjinmin 2015-06-19 10:49:54 +08:00
@iyangyuan 只在函数中用到的变量,都是在stack中,或者是从外面传入参数的拷贝也都是在stack里面分配内存。
|
11
SoloCompany 2015-06-19 13:35:30 +08:00
如果按字符个数算,是2g,按内存占用算,是4g,这个算答案么?
|