V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1536011373
V2EX  ›  程序员

为什么 Java 垃圾自动回收,面试的时候还要问垃圾回收机制?

  •  
  •   1536011373 · 2017-10-05 15:07:04 +08:00 · 11977 次点击
    这是一个创建于 2601 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Java 面试必问的就是垃圾回收,为什么 Java 垃圾自动回收,面试的时候还要问垃圾回收机制?
    67 条回复    2017-10-13 09:58:53 +08:00
    tscat
        1
    tscat  
       2017-10-05 15:10:59 +08:00 via Android   ❤️ 1
    因为这个最基本的都没有动力去了解那么你就是个菜鸡程序员
    cxbig
        2
    cxbig  
       2017-10-05 15:11:28 +08:00
    考察你对 Java 语言机制的理解程度
    cuebyte
        3
    cuebyte  
       2017-10-05 15:13:04 +08:00
    丢垃圾还要分类呢,又不是考你垃圾回收算法
    EPr2hh6LADQWqRVH
        4
    EPr2hh6LADQWqRVH  
       2017-10-05 15:14:56 +08:00 via Android   ❤️ 4
    看你需不需要被回收喽
    takanasi
        5
    takanasi  
       2017-10-05 15:15:03 +08:00
    因为你是开发人员,这是基本知识
    fwee
        6
    fwee  
       2017-10-05 15:23:52 +08:00   ❤️ 2
    蛤蛤蛤,显得逼格比较高而已,实际工作中不需要。
    说实话基础的算法数据结构和架构能力更重要。
    但是很多面试的是垃圾回收算法、字符串 intern 等等,这种东西面试被试几乎都没实际用过实现过,只是道听途说。真的很讽刺
    SoulSleep
        7
    SoulSleep  
       2017-10-05 15:27:58 +08:00
    这是调试 jvm 参数最基本的东西啊,如果脑子里没有这个意识,调内存时候怎么调啊...蒙吗?
    SoulSleep
        8
    SoulSleep  
       2017-10-05 15:29:44 +08:00
    @fwee 实际工作中不需要 我觉得很需要...特别是 Java 这种语言..我们程序比较复杂,涉及到一些算法和比较高的 tps,硬件敞开着用,但是必须得达到性能指标。会调参数可以省很多机器。
    Luckyray
        9
    Luckyray  
       2017-10-05 15:36:07 +08:00 via iPhone   ❤️ 1
    虽然每次面试都尽力准备,但是工作两年生产环境和测试环境的 jvm 参数从来都没碰过……要么是不调,要么是高一级的 leader 写好了就不动了……
    hantsy
        10
    hantsy  
       2017-10-05 15:46:09 +08:00
    实话说,我也忘记了。

    对 JVM memory model,GC 这些,每个 JVM 版本都有差别,要仔细看过 JVM 规范都会有了解。

    但对写 Java 的,不去了解 Java 语言本身的特性,不懂 Java EE 的规范我才觉得有问题,因为这些与日常开发几乎是相关的。

    然而,国内没哪个公司会叫你去写 JVM。一般问这种问题的人,最大的可能就是哪个什么认证题上看的,拿出来问别人装 B。

    楼上各位大神 @tscat , @takanasi,能不能借这个题讲讲 Java 8 与 Java 7 的 JVM 内存模型,垃圾回收上的差别。
    eightqueen
        11
    eightqueen  
       2017-10-05 15:57:08 +08:00   ❤️ 1
    这些东西你不清楚,上线一个应用应该分配多少内存,你有概念吗?那些说不需要知道的,估计你们应用 qps 只有几十。
    Suddoo
        12
    Suddoo  
       2017-10-05 15:58:51 +08:00 via Android   ❤️ 1
    最近秋招面试,有一家问了点垃圾回收的细节,回答得不好。
    takanasi
        13
    takanasi  
       2017-10-05 16:00:48 +08:00
    @hantsy 我的 java 也就入门水平。我还以为是问有几种回收机制呢,这种细节问题确实太难。
    changwei
        14
    changwei  
       2017-10-05 16:10:10 +08:00 via Android   ❤️ 16
    面试造火箭,入职拧螺丝。
    hantsy
        15
    hantsy  
       2017-10-05 16:44:55 +08:00
    @changwei 很多公司的确是这样。
    hantsy
        16
    hantsy  
       2017-10-05 16:45:43 +08:00
    @eightqueen 请教一下我上面一楼贴出的问题。。。
    hantsy
        17
    hantsy  
       2017-10-05 16:51:11 +08:00
    @fwee 嗯。是的,基础知识不是一般的重要。

    对于招 Java 开发人员,Java Collection 下的接口和类的重点。对于 Java Web/EE,如果不懂 Servlet/Filter, JDBC 这些基础,写出来的程序基本上坑爹。
    chinawrj
        18
    chinawrj  
       2017-10-05 16:53:27 +08:00 via Android
    恩,看来 c 不用问指针
    gam2046
        19
    gam2046  
       2017-10-05 16:54:16 +08:00
    @changwei 生动形象,初级乃至中低级程序员其实没有十分清楚的了解这些,知道有这么个东西了。真的需要 JVM 调参是不会让一个中低级码农去调的。但是以我所在的公司,我发现有些 Java 程序员,有这样一条脑回路

    Java 有垃圾回收 + Java 垃圾回收是自动 = 无脑创建新对象即可

    且不说 gc 会短暂暂停程序,那你好歹打开一个 Stream,也记得 close 啊。

    就碰到过个别人写的东西,文件只管开,不管关。跑了一段时间,程序莫名其妙挂了,甩锅给运维,说服务器有问题。运维排查了两天,翻了能看到的日志,实在找不到原因。程序跑一段时间,就自己挂了。再丢回给程序,一审计.......也是绝了。每次都是系统句柄不够分类了,然后系统杀掉了程序。心疼运维五分钟。
    LosLord
        20
    LosLord  
       2017-10-05 16:56:05 +08:00 via Android
    新发布的 java9 换成 G1 了,以前的知识又得更新了
    hantsy
        21
    hantsy  
       2017-10-05 17:15:37 +08:00
    @gam2046 请贵公司还在 Java 哪个版本?

    我记得没错的话,应该是 Java 7 (还是更早版本?我记不清了) 都有应用了 AutoClosable 接口,可以使用 `try(资源打开)` 语法,都会自动管理资源(关闭资源)。

    https://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html

    你自己看看你用的实现类是哪个。

    要是我来写,我也不用去关闭啊,总不会没事闲得蛋痛吧。
    EmdeBoas
        22
    EmdeBoas  
       2017-10-05 17:25:53 +08:00 via Android
    公司筛人也不好筛啊,就应届生的感觉,那些大厂一个职位可以上百甚至上千人去争……总得用些方法筛人吧,而且我觉得这些知识还是挺有意思的,不怕知识多得没地方用,就怕需要用的时候不知道啊!
    gam2046
        23
    gam2046  
       2017-10-05 18:01:23 +08:00
    @hantsy 说出来可能你不信。我还在用的是 Java 1.3,由于运行环境限制。另一个部门的同事是做 web 应用的。Java 条件宽松许多,但是由于不明的原因,他们选型是 1.6 还是 1.7,也没用最新的。
    x18960
        24
    x18960  
       2017-10-05 18:04:38 +08:00 via iPhone
    悲哀,前五楼一半喷子
    1536011373
        25
    1536011373  
    OP
       2017-10-05 18:08:41 +08:00
    楼主表示已经做了两年的 Java Web 开发,平时也学习了解过 JVM 的知识,摸着良心说,平时开发真的很少很少用到 GC 方面的知识,可能就分析一下 dump 文件用,楼主很菜别喷我
    nicevar
        26
    nicevar  
       2017-10-05 18:33:48 +08:00
    有些东西了解一下是有必要的,能写出更高效的程序,真的有很多做开发的以为 Java 是内存自动回收的就随便写,毫无内存管理意识,分配了就不管了,一直到程序不能跑了才开始挠头,以前我带了不少做 android 的就这样,比如 activity 在 destory 的时候不取消 timer 造成 activity 长时间无法回收,程序加载的图片又多,压力测试的时候来回切换就歇菜了
    其实招聘的时候这种问题如果是初级程序员你能大致说出原理性的东西就差不多了
    hcymk2
        27
    hcymk2  
       2017-10-05 18:36:16 +08:00
    前面说的资源用了要关和 java 垃圾回收机制其实没多大关系
    stcasshern
        28
    stcasshern  
       2017-10-05 18:38:28 +08:00
    其实答案和问题都相对固定啊,的确是面试造飞机,平时拧螺丝,但是这些也的确是区分·工程师和码农的一个标准吧
    v2orz
        29
    v2orz  
       2017-10-05 18:54:05 +08:00
    一方面作为高级或者有潜力成为高级,这都是基础必备
    另一方面,Java 实在是没多少东西问,面试官也想不出更多东西能考考你们的学习能力或者说基本功了
    tscat
        30
    tscat  
       2017-10-05 19:03:29 +08:00 via Android
    @hantsy 你这样问有意思吗?故意挑一个以为很难的题目恶心人。我就问你,两个程序员,其他条件都一样,一个对 jvm 很熟悉,一个听都没听过或者只是听过名字,你要哪一个?
    kindjeff
        31
    kindjeff  
       2017-10-05 19:10:40 +08:00
    面试已经太套路了,我觉得很不好
    murmur
        32
    murmur  
       2017-10-05 19:17:29 +08:00
    最简单的垃圾回收不就背一下么

    真问那种实际上的没做过你也就停留在背上了
    HaoyangWei
        33
    HaoyangWei  
       2017-10-05 19:30:05 +08:00
    一些场景上因为性能的要求是要尽量避免 jvm 的自动 GC 的
    depress
        34
    depress  
       2017-10-05 19:34:51 +08:00
    要调优,不同项目 JVM 参数不同,垃圾回收那边参数也一堆,一般也就高级工调,初中级接触不到,算做个预备,看你有没有往这方面知识延伸,面试初中级这种属于加分项。
    patx
        35
    patx  
       2017-10-05 20:12:11 +08:00
    JVM 的机制,平时可能用不到,只有在碰到问题时,你才觉得重要。
    另外,对 JVM 的深入理解,也能让面试官觉得你是有潜力的,值得被招进公司的。
    bumz
        36
    bumz  
       2017-10-05 20:17:46 +08:00
    正因为垃圾自动回收,所以程序员才必须知道垃圾回收的机制。

    因为决定两个程序员差距的,不是不出错误的时候,而是出错的时候。
    clearbug
        37
    clearbug  
       2017-10-05 20:23:17 +08:00 via Android
    @eightqueen 老铁真相了!我感觉我在公司做的应用就十来个人用的,所以功能实现就行,从来没有 jvm 调优的需求!我感觉中国的公司有百分之八九十都是这样子吧
    hantsy
        38
    hantsy  
       2017-10-05 20:32:56 +08:00   ❤️ 1
    @tscat 我肯定挑没听说过的那个。

    我帮朋友公司招过很多人,见过太多自以为是的人。我宁可去教一个什么都不懂,愿意去学的人,不愿意与一个满嘴跑火车而做事挑三捡四各种借口的人处事。
    hantsy
        39
    hantsy  
       2017-10-05 20:35:23 +08:00
    @gam2046 这真让我开眼界了。你确定你的是 2017 年的事?
    hantsy
        40
    hantsy  
       2017-10-05 20:38:14 +08:00
    @clearbug 调优都是需要的。

    但面试扯什么 JVM,GC 原理根本都是扯蛋,在中国不到 1/10000 的公司的工作会和这个相关。
    hantsy
        41
    hantsy  
       2017-10-05 20:42:01 +08:00
    @gam2046 如果你还在 5 以前的版本,只能同情一下你了。
    maemual
        42
    maemual  
       2017-10-05 20:53:24 +08:00 via Android
    用来过滤掉没有自我驱动主动学习能力的人
    gam2046
        43
    gam2046  
       2017-10-05 21:19:07 +08:00
    @hantsy 确实是 2017 年的事情。我司是乙方,甲方是全国各地的运营商(电信、联通、移动以及地域性的小运营商)。甲方大佬只提供这样的运行环境给我们,我也很绝望啊。

    说出来你可能不信,上次出差浙江某地方性运营商,带我去他们的机房,他们的局端服务器就是一台用着 DDR3 内存,总共只有 4G 的 AMD 真·四核处理器。连 1U 服务器都没有。现在 2000 块钱配个家用机都比这个强得多。我去过的几个地方,其实电信、联通也没好到哪里去,也是一堆淘汰服务器。

    还有一个你可能也不信,也是出差到某地一个小运营商,他们的办公场所在一栋居民楼里,我和公司确认了几次地址,告诉我就是这个地址......我都觉得进了传销组织。
    movistar
        44
    movistar  
       2017-10-05 21:21:23 +08:00
    @hantsy 这就取决于你招的是应届生还是社招生了
    应届生不懂很正常,基础数据结构过关,基本算法了解,其他基础知识好一点就可以了
    要是一个工作了 5 年甚至以上的人,一直写 Java 的从来没听说过没了解过 JVM/GC
    要么说明做的工作一直很简单,都是 CRUD,而且几乎没啥 QPS,要么就是不思进取......
    tscat
        45
    tscat  
       2017-10-05 21:29:06 +08:00 via Android
    @hantsy 因噎废食。了解 jvm 就会跑火车吗。
    hantsy
        46
    hantsy  
       2017-10-05 22:33:33 +08:00
    @gam2046 对方这种环境提供的项目有多大?
    Charkey
        47
    Charkey  
       2017-10-05 23:07:28 +08:00
    考察能不能了解 Java 高级知识,能不能写 JVM 友好的代码等等;还有就是不排除有些面试官的装逼需求;
    zhx1991
        48
    zhx1991  
       2017-10-05 23:47:02 +08:00
    难道这么多答题的都没有任何相关的工作经验吗?

    问这个当然是有用的, 比如突然 GC 次数突然增加至少要会查问题和简单的调参数啊
    sosloop
        49
    sosloop  
       2017-10-05 23:49:32 +08:00 via Android
    同理,就如同 cocos2dx 有引用计数,但面试还是必问引用计数是怎么实现的,整个流程要大概说一遍。
    loveCoding
        50
    loveCoding  
       2017-10-06 01:23:11 +08:00
    对于有几年工作的程序员就是一个筛选条件 , 筛选掉没有兴趣,没有上进心的程序员.
    wenzhoou
        51
    wenzhoou  
       2017-10-06 07:47:03 +08:00 via Android
    不学习的人总是能给自己知道不学习的借口的。
    跟是不是垃圾回收没有多大关系。
    有人工作一年学的东西比别人 10 年学的都多,就是这个道理。
    cuzfinal
        52
    cuzfinal  
       2017-10-06 09:34:37 +08:00
    java 人太多了,过滤一些咯。
    cjyang1128
        53
    cjyang1128  
       2017-10-06 09:52:55 +08:00
    不懂垃圾回收,你怎么调试内存泄漏问题???
    jeffson
        54
    jeffson  
       2017-10-06 11:34:50 +08:00
    @changwei hahaha
    likuku
        55
    likuku  
       2017-10-06 12:52:01 +08:00
    @gam2046 是啊,程序跑起来就不断吃资源,耗尽资源崩掉 /系统死掉,这些明显就是资源没有正确回收造成的泄漏,写码人的锅最大,但有人就是敢说“我写的码不会有问题!",资深嘛,没人反驳,也没人去审计代码,被领导无条件信任(看不懂源码的管理人员),运维被虐的久了,只有走人了事。
    hcymk2
        56
    hcymk2  
       2017-10-06 13:16:33 +08:00
    @gam2046
    代码上线前至少要简单的压测下吧。上线之后应该有 APM 吧,出问题运维直接拉日志去操写代码的人啊。
    gam2046
        57
    gam2046  
       2017-10-06 13:33:51 +08:00
    @likuku @hcymk2 也许现在你们知道为什么很多运营商的系统做的那么差了(大雾)。反正我司其他产品都有测试流程,唯独 Web 这一块是没有测试的。原因不明。开发人员自己觉得没毛病,就直接丢线上了,大白天重启服务器也是隔三差五有的(貌似听到了有人说服务不可用?没事的,是你光猫出问题了,等两分钟,重启下就好了)。因为这种情况出过很多问题了,运维和被背锅了好几次。

    我个人是和运维建议,找上级建议增加个压力测试的环节,上线至少甩锅 甩不到他这里。业务逻辑有问题,怎么也和运维无关了。
    DoctorCat
        58
    DoctorCat  
       2017-10-06 23:34:23 +08:00
    需要参与内存管理的语言都需要 GC 机制的,不然要码农自己(手动或半自动)管理内存了,因忘记释放内存,排查时太痛苦了,内存泄露会显得程序不健壮、程序猿太低能。

    为啥考察这类姿势呢,因为 JVM 支持的 GC 花样儿很多(多种 GC 收集器、大量可调参数)目的是为了更好的配合不同类型的应用长期运行。不懂是做不好的,知其所以然让工作生产更有效率嘛。
    DoctorCat
        59
    DoctorCat  
       2017-10-06 23:41:27 +08:00
    补充一句:对于有性能要求,尤其是低 RT 要求的中大规模服务,GC 方式的选择和调优就会很明确的暴露出来了。不懂 GC 肯定没法做调优的,老板终归不会让你无限制的 +机器解决嘛。
    sagaxu
        60
    sagaxu  
       2017-10-07 03:38:53 +08:00
    因为总有 sb 能写出内存泄露的代码来还对此毫无意识,不问能行吗?

    不用懂 gc 细节,只要熟悉对象生存周期内在内存中的流动,看得懂 gclog,会调几个参数就够了

    JVM789 的 GC 变化不大,不大用的 serial,默认的 parallel,并发的 CMS 和 G1(JVM9 默认 G1),CMS 已经 deprecated。所以只需要了解 parallel 和 g1 了。

    JMM 变化更小,核心的东西从 Java 5 开始没有变过,到 Java 9 也不过细节上稍有增强,当然了,JMM 跟 gc 没什么关系。
    gnaggnoyil
        61
    gnaggnoyil  
       2017-10-07 09:14:56 +08:00
    基于 JVM 的开发者跑去了解主流 JVM 的 GC 实现和适应方式本身就是一件十分讽刺的事情:JVM 上的 GC 原本目的就是为了让基于其上的开发者可以无视内存的管理而设计出来的抽象,结果到头来大量开发者不得不去 overfitting 对应 JVM 的 GC 实现,从这一点上看来 JVM 的全局托管式 GC 作为一种抽象层级真的是完全失败,相比而言 C++/Rust 的 RAII 在内存和资源管理上的设计水平远高于 JVM 的 GC ——而且还不需要 hack 特定实现的实现原理.
    sagaxu
        62
    sagaxu  
       2017-10-07 14:30:57 +08:00
    @gnaggnoyil 但是 C++的指针容器不是线程安全的,也要手动处理循环引用。Rust 也一样,需要时刻明确 ownership,多线程时还要搞明白 Send 和 Sync。门槛可比 JVM 的 GC 高的多,JVM 语言只要留意别让全局变量持有对象引用,其他内存问题一般不用管了,极少数性能非常敏感的库,才会去玩 off-heap 那套东西,比如 netty 的 buffer,netty 不但大玩 off-heap,还用 JNI 实现了 JDK 不支持的功能,但这只是月薪 50K 以上开发才需要熟悉的事情,一般人碰不着。
    noli
        63
    noli  
       2017-10-07 17:39:32 +08:00
    因为写 Java 的人太多。
    这样在面试的时候面临的问题就不是找不找到最适合的,而是找到最好的。
    宁可技能用不上,也要找一个强一点的,付同样的工资,美滋滋呀美滋滋。
    DoctorCat
        64
    DoctorCat  
       2017-10-07 21:11:39 +08:00
    @sagaxu JNI 写个库不是读读文档、有内存管理意识,明白 Direct Memory 和观察 GCLog 就搞定的么… 50k 的待遇这么高…卧勒个槽。
    DoctorCat
        65
    DoctorCat  
       2017-10-07 21:15:50 +08:00
    @gnaggnoyil 历史缘故历史缘故,要说对比一下,Python VM 的 GC vs JVM 的可以比一下的…
    sagaxu
        66
    sagaxu  
       2017-10-07 22:36:42 +08:00
    @DoctorCat 读读文档就能写出 netty 这样水准的库,鹅厂 3.3 起,阿里 P8 起,税后 50K 都不算高,毕竟现在写个增删改查都 15K 以上了
    iceheart
        67
    iceheart  
       2017-10-13 09:58:53 +08:00 via Android
    @gnaggnoyil 没错,内存管理这么重要的事,就是得程序员来做,交给 jvm 就是扯淡。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1482 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 17:24 · PVG 01:24 · LAX 09:24 · JFK 12:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.