Java程序运行在Docker等容器环境有哪些新问题?
Docker等容器早已不是新生事物,正在逐步成为日常开发、部署环境的一部分。Java能否无缝地运行在容器环境,是否符合微服务、Serverless等新的软件架构和场景,在一定程度上也会影响未来的技术栈选择。当然,Java对Docker等容器环境的支持也在不断增强,自然地,Java在容器场景的实践也逐渐在面试中被涉及
今天我要问你的问题是,Java程序运行在Docker等容器环境有哪些新问题?
典型回答
- 对于Java来说,Docker毕竟是一个较新的环境,例如,其内存、CPU等资源限制是通过CGroup(Control Group)实现的,早期的JDK版本(8u131之前)并不能识别这些限制,进而会导致一些基础问题:
- 如果未配置合适的JVM堆和元数据区、直接内存等参数,Java就有可能试图使用超过容器限制的内存,最终被容器OOM kill,或者自身发生OOM
- 错误判断了可获取的CPU资源,例如,Docker限制了CPU的核数,JVM就可能设置不合适的GC并行线程数等
- 从应用打包、发布等角度出发,JDK自身就比较大,生成的镜像就更为臃肿,当我们的镜像非常多的时候,镜像的存储等开销就比较明显了
- 如果考虑到微服务、Serverless等新的架构和场景,Java自身的大小、内存占用、启动速度,都存在一定局限性,因为Java早期的优化大多是针对长时间运行的大型服务器端应用
考点分析
- 如果我是面试官,针对这种问题,如果你确实没有太多Java在Docker环境的使用经验,直接说不知道,也算是可以接受的,毕竟没有人能够掌握所有知识点嘛
- 但我们要清楚,有经验的面试官,一般不会以纯粹偏僻的知识点作为面试考察的目的,更多是考察思考问题的思路和解决问题的方法。所以,如果有基础的话,可以从操作系统、容器原理、JVM内部机制、软件开发实践等角度,展示系统性分析新问题、新场景的能力。毕竟,变化才是世界永远的主题,能够在新变化中找出共性与关键,是优秀工程师的必备能力