我很难理解为什么我的Java应用程序正在慢慢消耗pod可用的所有内存,导致Kubernetes将pod标记为内存不足。JVM(OpenJDK 8)由以下参数启动:
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
我正在监控pod和JVM内存使用的内存,并期望看到一些相关性,例如在主要的垃圾回收机制之后,使用的pod内存也会下降。但是我没有看到这一点。我在下面附上了一些图表:
我正在纠结的是,为什么在16:00之前堆内存显着减少时,pods内存不会也下降?
看起来您正在创建一个资源限制为1GB内存的pod。您正在设置-XX: MaxRAMFraction=2
,这意味着您将50%的可用内存分配给JVM,这似乎与您绘制的Memory Limit
相匹配。
然后,JVM保留大约80%的内容,这是您在内存消耗
中绘制的内容。
当您查看内存消耗
时,您将看不到内部垃圾回收机制(如第二张图所示),因为GC内存被释放回JVM,但仍被它保留。
您的java应用程序中是否可能存在内存泄漏?随着时间的推移,它可能会导致更多内存被保留,直到满足JVM限制(512MB)并且您的pod被OOM杀死。
1.1 程序计数器 JVM 支持多线程同时执行,每个线程都有自己的程序计数器,线程正在执行 Java 代码,则存放正在执行的指令地址,如果正在执行 C 代码(本地方法),则为空。 1.2 虚拟机栈 线程私有,每个方法创建一个栈帧,用于存储局部变量表(this、参数列表、局部变量)、操作数栈(将下一个指令入栈,执行时出栈)、动态链接、方法出口等信息。方法从调用到执行完成对应栈帧的入栈到出栈,线程内串
我试图了解垃圾收集是如何工作的。我很清楚以下几点: 当JVM无法将对象分配给年轻一代时,它将触发小型GC 列表项 当堆满时,JVM将触发完整的GC(两个次要的主要GC)。 但是,年轻一代和老一代中不再引用、符合GC条件但没有触发GC的对象如何(即年轻/老一代堆空间未满,因此没有GC发生) 这是否意味着在GC发生之前,这些对象将保留在年轻/老一代堆空间中? 我的阅读材料 > http://www.c
问题内容: 在最近的10年中,当讨论Java和/或垃圾回收时,我无法抗拒的唯一性能损失是,在分页内存体系结构中运行时,垃圾回收算法或多或少会中断,并且堆的某些部分会越来越多。分页。 Unix系统(尤其是Linux)积极地调出一段时间未使用的内存,尽管这对于您的普通泄漏c应用程序很有用,但它在内存紧张的情况下会杀死Java性能。 我知道最佳实践是将最大堆保留为小于物理内存。(或者您将看到您的应用程序
一、垃圾收集算法 1.标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如同它的名字一样,算法分为“标记”和“清除”两个阶段。 ①首先标记出所有需要回收的对象 ②在标记完成后统一回收所有被标记的对象。 不足: 效率问题:标记和清除两个过程的效率都不高 空间问题:标记清除之后产生大量不连续的内存碎片,空间碎片太多可能会导致以后程序运行过程中需要分配较大对象时,无法找到足够
问题内容: 我正在读取一个很大的文件,并从每一行中提取文本的一小部分。但是,在操作结束时,我的工作记忆很少。似乎垃圾收集器在读取文件后无法释放内存。 我的问题是:有什么办法释放这种记忆?还是这是JVM错误? 我创建了一个SSCCE来演示这一点。它读取一个1 mb(由于16位编码,在Java中为2 mb)的文件,并从每行中提取一个字符(约4000行,因此大约为8 kb)。测试结束时,仍将使用全部2
问题内容: 谁能 建议一本书 (或任何其他来源)来彻底揭示 JVM内存管理和垃圾回收的内部知识 (优化,工作,循环引用,特殊性,各种JVM隐喻的讨论…)? [到目前为止,我发现的是单独的文章,涉及各个方面,但没有重量级的书:)。这里是一些用于实施Hotspot的好材料。] 非常感谢您提供的任何建议。 问题答案: 如果您寻找与 供应商无关的 资源来揭示和彻底描述所有已研究/设计的各种GC算法,我建议