V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jadetang
V2EX  ›  职场话题

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

  •  
  •   jadetang · 2017-06-22 09:59:00 +08:00 · 7492 次点击
    这是一个创建于 2497 天前的主题,其中的信息可能已经有所发展或是发生改变。
    感觉这么基础的知识不知道,确实不应该。但是我工作也有一段时间了,我知道了堆和栈的区别对我工作也没有任何帮助啊,平时也用不上。
    第 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
    如果你够牛逼,你就知道哪些地方用到了
    ssynhtn
        31
    ssynhtn  
       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 如果堆栈和性能无关,那你了解它干嘛?自娱自乐嘛?
    ssynhtn
        36
    ssynhtn  
       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   ·   我们的愿景   ·   实用小工具   ·   3397 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:04 · PVG 08:04 · LAX 17:04 · JFK 20:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.