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

关于 jvm 面试

  •  
  •   zxc1234 · 2020-05-03 22:58:26 +08:00 · 4074 次点击
    这是一个创建于 1665 天前的主题,其中的信息可能已经有所发展或是发生改变。

    面了某大厂,一面上来就是遇到过 jvm crash 吗

    我只好说没遇到过

    想问下大家这种 jvm crash 遇到过吗 经常吗

    迷茫~求指教~

    24 条回复    2020-05-09 15:58:54 +08:00
    hhhsuan
        1
    hhhsuan  
       2020-05-03 23:03:05 +08:00 via Android
    内存不够就会 crash
    mazai
        2
    mazai  
       2020-05-03 23:36:31 +08:00
    就是想问你一些调优的经验而已,你没遇到过不就没说了,编也编一个 OOM 的情况了吧,老哥,多半凉了
    Mohanson
        3
    Mohanson  
       2020-05-03 23:40:49 +08:00
    就个人经验, divide by zero, 内存越界, 内存未对齐, 超过最大栈深度, 结构化指令嵌套错误都能 crash 掉 vm. 虽然我没用过 JVM, 但按照 Webassembly 虚拟机来说就是这样...
    zxc1234
        4
    zxc1234  
    OP
       2020-05-04 00:36:07 +08:00
    @mazai oom 是 crash ??
    chihiro2014
        5
    chihiro2014  
       2020-05-04 01:07:44 +08:00
    @zxc1234 crash (可以理解为崩溃),oom 自然算。不过问 jvm 问题没意义,不如把代码写好点
    vk42
        6
    vk42  
       2020-05-04 06:17:08 +08:00
    @zxc1234 可能指爆 heap 吧,OOM 一般是 OS 行为,和 JVM 本身关系不大
    lewis89
        7
    lewis89  
       2020-05-04 10:08:02 +08:00
    @vk42 #6 JVM 可以设置堆大小,怎么会没有关系,OOM 不是 bark 调用申请不到物理内存了,而是 JVM 自己抛异常了
    lewis89
        8
    lewis89  
       2020-05-04 10:19:17 +08:00
    @mazai #2 说实话 OOM 遇到的情况也很少,业务代码里面的对象 大多都是栈上的引用指向它们,业务逻辑流程的栈空间一弹出,这些对象基本上就死了,基本上不存在业务代码会 OOM 的情况,OOM 大多发生在框架代码里,它们会使用一些 GCRoots 节点 类的静态变量 会引用这些对象,然后没有释放 才会发生 OOM 的情况
    vk42
        9
    vk42  
       2020-05-04 10:33:12 +08:00
    @lewis89 好吧,我们这边一般把 jvm 的 OOM exception 叫爆 heap,说 OOM 的话一般是指 OS 的 OOM handler 。怪我没说清……
    cheng6563
        10
    cheng6563  
       2020-05-04 14:06:12 +08:00 via Android
    用 openj9 时遇到过
    pursuer
        11
    pursuer  
       2020-05-05 00:37:51 +08:00
    @cheng6563 #10 今天刚好碰到一个 libgdx 上 jni 访问越界造成 jvm 崩溃的问题,把源码全部扒出来查了半天最后发现是 openj9 的问题,换上了 zulujdk11 就好了。。。
    tension2012
        12
    tension2012  
       2020-05-05 09:59:23 +08:00
    jvm crash 的时候,会生成一个 hs_err_pidxxx.log, 里面的内容就是会记录 jvm crash 的时候,寄存器,堆,加载的动态库等的情况,要让 jvm crash,其实很简单, 就是执行 kill -11 {pid}, 它就会 crash 掉
    fewok
        13
    fewok  
       2020-05-05 12:48:37 +08:00
    所以,问这个的意义是什么??考察你之前的公司是否经常 crash ?还是你是否喜欢探索异常处理?
    ligiggy
        14
    ligiggy  
       2020-05-05 15:17:20 +08:00
    @fewok 如果你现在面试的公司,有对这方面有要求,他就不会管你之前有没有或者说需不需要从事相关事务。也许这对面试者来说,很不公平,但是面试官并不是出于考察你在前公司的表现为前提的。
    mazai
        15
    mazai  
       2020-05-05 15:39:10 +08:00
    @ligiggy 老哥正解,其实就是考察你有没有相关的经验,或者对这方面研究的深不深。
    yinzhili
        16
    yinzhili  
       2020-05-05 17:17:09 +08:00
    就怕是面试造导弹,工作拧螺丝
    zxc1234
        17
    zxc1234  
    OP
       2020-05-05 20:06:54 +08:00
    问题是,现在不是很多 crash 都 try catch 住了吗,还问有没有遇到。。。
    zxc1234
        18
    zxc1234  
    OP
       2020-05-05 20:12:35 +08:00
    @ligiggy
    @mazai

    楼上
    dousha99
        19
    dousha99  
       2020-05-05 20:49:28 +08:00
    @zxc1234 #17 crash 一般是无法被 catch 的,它和 exception 不同。crash 是发生严重的、不可恢复的错误才会出现的。
    zxc1234
        20
    zxc1234  
    OP
       2020-05-05 20:53:05 +08:00
    @dousha99 三楼所说的 divide by zero 不就是可以 catch ??还是说 divide by zero 不是 crash ?
    dousha99
        21
    dousha99  
       2020-05-05 21:04:58 +08:00
    @zxc1234 #20 Java 里面除以 0 不是 crash 是 exception: java.lang.ArithmeticException.

    不过硬要说的话,除非是内部错误(比如 JNI 库中的或者 JVM 本身的非法内存访问),否则类似与内存耗尽这样的应该导致 crash 的异常也是可以被 catch 的。不过一般情况下不会尝试 catch 这类异常。

    其实 crash 更像是一种结果而不是一个过程。JVM 进程异常退出了,我们就认为发生了 crash, 哪怕这只是因为一个没有 catch 到的异常。
    zxc1234
        22
    zxc1234  
    OP
       2020-05-05 21:11:09 +08:00
    @dousha99 也就是说如果 除以 0 没有被捕获,它是有可能导致 jvm 进程异常退出的吧?那我是不是可以理解 除以 0 也可能导致 crash ?

    还有平时项目中会遇到内部错误吗?这种情况多吗?我好像没怎么遇到过 JNI 库中的或者 JVM 本身的非法内存访问 这种情况??
    dousha99
        23
    dousha99  
       2020-05-05 21:23:37 +08:00
    @zxc1234 #22 是的,可以认为如果 /0 没有捕获也会导致 crash.

    至于平时项目,真正能见到的最常见的 crash 算是 NullPointerException, IndexOutOfBoundsError 其次是 OutOfMemoryError. 不过如果平常只是写写 CRUD, 那么在各种框架和静态代码分析的加持下就都很难见到(当然,一旦见到就说明出大事了)。JNI 库的话自己写不经意的话就容易出 segfault. JVM 的非法内存访问就更罕见了。
    peachpeach
        24
    peachpeach  
       2020-05-09 15:58:54 +08:00 via iPhone
    嵌入式菜鸡弱弱路过,内存问题是基础。
    内存不够,会导致 oom,这很常见的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2760 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:18 · PVG 19:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.