昨天面试被问了 JVM 中堆和栈的区别,但是我竟然没有回答出来。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jadetang
V2EX    职场话题

昨天面试被问了 JVM 中堆和栈的区别,但是我竟然没有回答出来。

  •  
  •   jadetang 2017-06-22 09:59:00 +08:00 8274 次点击
    这是一个创建于 3121 天前的主题,其中的信息可能已经有所发展或是发生改变。
    感觉这么基础的知识不知道,确实不应该。但是我工作也有一段时间了,我知道了堆和栈的区别对我工作也没有任何帮助啊,平时也用不上。
    div class="subtle"> 第 1 条附言    2017-06-22 16:19:47 +08:00
    问了老司机,一般的话,尽量用简单类型,保证分配在栈中,这样程序开销比较小。这也是目前唯一能影响工作的地方了。
    38 条回复    2017-06-23 18:28:39 +08:00
    Adia
        1
    Adia  
       2017-06-22 10:22:20 +08:00
    至少你可以知道推测出在项目中出现堆异常或栈异常的原因
    pusidun
        2
    pusidun  
       2017-06-22 10:22:45 +08:00
    有没有帮助先不谈,这个随便搜个面经都会提到的,只能说明你没有认真准备

    大公司怎么面试有工作经验的我不清楚,不少小公司的面试基本就是:“下午有个人来面试了,你们几个去下,搜下网上题目”…
    0915240
        3
    0915240  
       2017-06-22 10:55:38 +08:00
    平时救火的时候会有用。
    jiangzhuo
        4
    jiangzhuo  
       2017-06-22 10:58:12 +08:00
    培训班出来的回答这个问题都不用动脑子吧,就跟背诵课文一样直接背标准答案。
    qiaobeier
        5
    qiaobeier  
       2017-06-22 11:06:14 +08:00
    想起前几天面一个妹子,问盒模型,举几个 html tag 都没答出来。。。 不过我是相信她能干活,在某些情况下甚至能干的很好。只是她不适合我们的职位而已。
    arrow2015
        6
    arrow2015  
       2017-06-22 11:10:58 +08:00 via Android
    所以,答案是什么
    ipwx
        7
    ipwx  
       2017-06-22 11:11:32 +08:00   1
    如果是科班的话,入门 C/C++ 就是要手工 malloc/free 堆内存的。再往后,操作系统甚至需要知道 malloc/free 的算法。

    不是我太严苛,楼主如果连堆和栈都不知道,怎么知道为什么尾递归不好?怎么优化大型服务器 Java 程序,免得 gc 破坏实时性?堆和栈,这是基础中的基础,如果连这类基础都不愿意去知道,你写得程序只能停留在 getXXX/setXXX 以及拖几个控件的程度。
    irgil
        8
    irgil  
       2017-06-22 11:18:06 +08:00
    为什么没有帮助???
    jadetang
        9
    jadetang  
    OP
       2017-06-22 12:02:02 +08:00 via Android
    @ipwx 我是做 Java 的,尾递归 Java 是不支持的。至于根据堆和栈的区别来优化程序,能举个例子吗?
    jadetang
        10
    jadetang  
    OP
       2017-06-22 12:12:54 +08:00   1
    @arrow2015 大致是这样的,JVM 中每个线程都会分配一个栈,栈里面存放的都是方法的本地变量和对象引用。栈的大小有限制的。JVM 中有一个堆,所有的对象内存都分配在堆上。(有些对象有常量池,例如 String )
    jadetang
        11
    jadetang  
    OP
       2017-06-22 12:18:28 +08:00
    @irgil 可能是我工作太 low,所以没有遇到过。神伤。
    Cloudee
        12
    Cloudee  
       2017-06-22 12:27:08 +08:00
    比如说局部变量为什么比对象里的变量快那么多
    twogoods
        13
    twogoods  
       2017-06-22 12:37:54 +08:00 via Android   2
    我们应届生也很困惑,面试一上来就 jvm,垃圾回收,没有场景来运用,就跟背书上说的东西差不多
    jadetang
        14
    jadetang  
    OP
       2017-06-22 12:43:42 +08:00
    @Cloudee 局部对象是存在栈里面的,虽然和堆一样,都是在内存中。但是栈的 cache 亲和性比较好。问题是这样的,你写程序的时候,能控制吗。
    leejanfin
        15
    leejanfin  
       2017-06-22 13:10:16 +08:00 via iPhone
    熟悉内存模型 对你写多线程的代码会有一些帮助
    ppwangs
        16
    ppwangs  
       2017-06-22 13:17:16 +08:00   1
    大家都一样,去面试都要刷题的。
    只不过大神们刷的题多了,都背熟了。
    jadetang
        17
    jadetang  
    OP
       2017-06-22 13:44:18 +08:00
    @leejanfin 貌似内存模型主要的是涉及数据修改的可见性,好像和堆和栈没关系。
    ofblyt
        18
    ofblyt  
       2017-06-22 13:54:00 +08:00
    @jadetang #17 有点关系的,方法内部不引用全局变量不会有线程安全问题(我是这么理解的)
    leejanfin
        19
    leejanfin  
       2017-06-22 14:22:00 +08:00 via iPhone
    @jadetang 嗯 我上面的描述确实不太对 JVM 和 JMM 不是一个层次的 不过面试嘛 总不能问你 Java 的 API 怎么用吧...
    teaaa
        20
    teaaa  
       2017-06-22 15:02:09 +08:00
    面试刷题很重要
    ipwx
        21
    ipwx  
       2017-06-22 18:50:51 +08:00
    @jadetang All right,我说的那个优化针对的是堆上面对象的优化。当然,我不写 Java,只是对 JVM 上面 GC 神调教的案例略有耳闻。如果你有兴趣,我觉得你可以去查找一下这方面的资料。
    ihuotui
        22
    ihuotui  
       2017-06-22 19:19:11 +08:00 via iPhone
    最高境界是对象不受 gc 影响和扫描
    wangdu2012
        23
    wangdu2012  
       2017-06-22 19:27:27 +08:00 via iPhone
    哪面试的?阿里的人最喜欢搞这种吧
    huhu3312
        24
    huhu3312  
       2017-06-22 19:49:34 +08:00
    栈是线程私有的,堆是线程共享的。
    smileme
        25
    smileme  
       2017-06-22 20:31:01 +08:00
    @twogoods 哈哈,背都不来背,面试没有诚意啊
    twogoods
        26
    twogoods  
       2017-06-22 21:39:34 +08:00 via Android
    @smileme 活捉一逗逼
    jadetang
        27
    jadetang  
    OP
       2017-06-22 22:30:41 +08:00
    @smileme 我最近也没在找工作,但是朋友非得内推,我就随意面试了一下。
    undeflife
        28
    undeflife  
       2017-06-22 23:16:54 +08:00
    @ipwx 尾递归不好?有编译器优化的尾递归可以视为普通迭代,不好在哪?
    stcasshern
        29
    stcasshern  
       2017-06-22 23:18:31 +08:00
    是不是可以这里解释啊,栈保存对堆中数据的引用,以及一些基本类型的数据,堆得话是保存实际数据。??
    sunqb
        30
    sunqb  
       2017-06-22 23:24:28 +08:00 via Android
    如果你够牛逼,你就知道哪些地方用到了
    kx5d62Jn1J9MjoXP
        31
    kx5d62Jn1J9MjoXP  
       2017-06-23 00:27:34 +08:00
    为什么楼上一堆回答性能的, 这根本没回答到点上吧.
    栈 /stack 是实现方法 /函数相互调用的基本数据结构, 每个线程都有自己的一个栈, 因为每个线程都要执行自己的方法.
    堆 /heap 则顾名思义就是存放一堆对象的内存区域
    xuboying
        32
    xuboying  
       2017-06-23 09:24:54 +08:00 via Android
    简历里自称的精通程度,和工资,被面试的问题难度挂钩。简历里吹牛就小心被打脸。不会堆栈可以写只会基础 java。
    oukichi
        33
    oukichi  
       2017-06-23 09:31:45 +08:00
    讲道理,你的工作用不到堆和栈的话可以赶紧考虑换工作了。
    miketeam
        34
    miketeam  
       2017-06-23 10:15:39 +08:00
    那是栈的地址位高还是堆高呢?我看 cs50 里面老师画了一个图,但是忘了!!
    ipwx
        35
    ipwx  
       2017-06-23 10:45:15 +08:00
    @ssynhtn 如果堆栈和性能无关,那你了解它干嘛?自娱自乐嘛?
    kx5d62Jn1J9MjoXP
        36
    kx5d62Jn1J9MjoXP  
       2017-06-23 15:12:19 +08:00 via Android
    @ipwx 我问你牛肉和苹果的区别,你连这两个一个是来自动物一个是来自植物都没做出区分,就大谈特谈牛肉怎么做才好吃,这不是答非所问是什么?
    eric2021
        37
    eric2021  
       2017-06-23 18:04:29 +08:00
    吓得我赶紧又去刷了一下题,可还是记不住
    dfguo
        38
    dfguo  
       2017-06-23 18:28:39 +08:00
    除非面试官经验比较少,一般面试不会因为一道题把人刷下去的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5462 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 03:33 PVG 11:33 LAX 19:33 JFK 22:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86