JavaRush /Java 博客 /Random-ZH /容器和 Java 有什么关系?
Павел
第 11 级

容器和 Java 有什么关系?

已在 Random-ZH 群组中发布
适合那些读过容器和 Docker,但不了解 Java 如何与容器结合的人。首先,让我们回顾一下Java内存。让我提醒您,内存由堆栈和堆组成,它们使用服务器的RAM(随机存取存储器);当进一步谈到内存时,我们指的是RAM。 现在让我们看看容器的横截面。 容器和 Java 有什么关系? - 1 不,当然不是,我们对臀部和大腿不感兴趣,我们会看容器中的内存结构。它可以分为三个部分: • 堆内存——堆本身;• 堆外是指不在堆中的所有内容;• OS Overhead 是在容器内实现进程的内存开销。 容器和 Java 有什么关系? - 2 比方说:我们为容器分配了 1 Gb,在图中它将是容器限制- 其边界由蓝色矩形表示。我们为容器中的Java内存分配了80%,即0.8 Gb,而Heap占用了我们大约80%的容器,即不小于0.8 Gb,因为OS Overhead占用了部分资源(开销)用于维护流程。容器中大约有 20% 的空间留给未连接到堆(Off Heap)的所有内容。图中的Used区域显示了运行应用程序时所使用的内存区域。现在我们需要谈谈容器中的内存可能会耗尽的情况。 OutOfMemoryError 如果应用程序的内存消耗(已使用区域)达到堆限制(Heap),我们将捕获OutOfMemoryError(OOM 错误)。这表示堆中没有足够的空间,即放置应用程序中以编程方式创建的对象的内存区域。 容器和 Java 有什么关系? - 3 如果还不完全清楚,我会用猫来解释。 OOM错误 是当一只猫在阳台的门前尖叫了很长很长时间,而当这扇门打开时,他站在门口不走任何一条路,他们常说猫被冻住了。如果你及时推他,他就会惊掉下巴,去阳台上做他的小猫生意。 容器和 Java 有什么关系? - 4 OOM Killer 这是当内存耗尽时容器中可能发生的另一种情况。 容器和 Java 有什么关系? - 5 如果程序超出容器,我们会遇到OutOfMemory Killer (OOM Killer) - 这是一个终止应用程序以防止内核崩溃的进程。它牺牲了应用程序来保持容器运行。容器不会倒下并不是事实,但其中运行的应用程序肯定会倒下。如果您不控制 Java 应用程序的内存消耗,就会发生这种情况。再说猫。如果你决定周六多睡一会却忘记给猫吃食物,那么OOM Killer花有保证,花盆可能不会损坏,但花必须重新种植。 容器和 Java 有什么关系? - 6 OOM 错误和 OOM Killer 有什么区别? 您可以处理OOM 错误并执行一些操作(例如:扩展应用程序),OOM Killer将简单地终止整个进程。 OOM Killer类似于kill-9 (kill 减九)—— Linux中杀死进程的命令。 容器和 Java 有什么关系? - 7 问题是,最流行的容器实现是Docker容器,它基于Linux,即使你在Windows下运行它,内核仍然来自Linux。在Linux中,我们感兴趣的是一个概念: CGroups(英文控制组)——一种限制和隔离进程组的计算资源(处理器、网络、内存资源、I/O资源)的Linux内核机制。 简而言之,这种机制允许您管理容器中的资源,在我们的例子中是内存。 Java 与此有何关系?Java 正是通过CGroups 机制来获取容器内存。但这一切都取决于Java的版本。例如,Java 7不知道如何使用CGroups,并且不知道容器限制。默认情况下,最大堆大小 = 1/4物理内存。如果应用程序超出了容器限制,那么就会出现OOM Killer,如果不设置容器限制,那么应用程序会从服务器上的其他应用程序中获取内存(最好设置限制,否则大家都会输) 。当然,您可以使用设置或使用特殊的“图像”来解决此问题,但最简单的方法是使用正确的 Java 版本。正确的版本从Java 8 x131 (从 Java 9 移植)开始,它开始理解CGroups。而在Java 10 中,出现了对容器的支持:UseContainerSupport,后来这个功能被移植到Java 8 x 191。或者您可以只使用Java: 11+。可以得出什么结论: 使用容器内存时,您可能会收到 OutOfMemoryError(OOM 错误)或 OutOfMemoryKiller(OOM Killer)。在第一种情况下,应用程序不会立即崩溃,OOM Error 可以被捕获、处理并可以采取控制操作。例如,扩展应用程序。如果发生 OOM Killer,应用程序将立即崩溃,并且没有任何选项可以保存它。最糟糕的是,从表面上看,容器本身并没有什么问题,也就是说,你甚至可能不会怀疑有东西掉在那里。Linux机制用于与容器和Java内存交互。但并不是每个 Java 都实现它们。为了避免 Java 8 出现问题,您需要使用从 131 开始的版本,或者更好的是从 191 开始。或者使用 Java:11+。 练习: OutOfMemoryError:如果可以的话捕获它
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION