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