问一下Websphere上的GC流程?
Ask about GC process on Websphere?
我的系统每个节点有 3 个服务器,我们有 02 个节点,并为每个 JVM 设置 HeapSize 16Gb -> 这意味着我们总共有 06 个 JVM 来提供在线服务。
我们有02层:通过面向客户的网络发布的网络层,1层是应用层,用于响应和回复网络客户请求的查询。
我每天都在监控,设置了当JVM的RAM使用率达到90%时会发出报警信息。然后它自动减少,我的理解是 GC 将收集垃圾 java 并在达到高时释放 ram。
我用ManageEngine Application Management来监控,它在一些JVMs上发出告警信息。
我在 ManageEngine Application Management(简称:AM)上进行监控,在高工作负载时间(每日工作时间:14:00PM - 15:00 PM)和低工作负载时间( 01:00 上午 - 02:00 上午)。
我的问题:这些情况正常吗?我是否应该为这些 JVM 增加并提供更多 RAM 物理量,我担心 OOM,并希望系统运行稳定?您能解释一下 GC 过程吗?
这是一篇描述 Java 垃圾收集 (GC) 工作原理的文章。 GC 基础知识在不同的 Java 版本中几乎相同,本文中有一些特定于 IBM Java 或 IBM 硬件的项目。
https://www.eclipse.org/openj9/docs/gc/
JVM 向 OS 请求内存以满足 JVM 的各种操作需要。通常 JVM 内存的最大部分由 Java 堆使用 - 但 JVM 也需要不属于堆的内存,通常称为堆外内存或本机内存。
JVM 自动管理 Java 堆内的内存。 activity 包括在创建新对象时在堆上分配内存,以及在对象不再使用时清除该内存。 GC 是 activity 清除 Java 堆中未使用的内存。
但是通过 GC 清除堆内的内存不会 return 将内存分配给 OS - 而只是在 JVM 内将内存标记为 'free',以便新对象可以放在那个内存里。
因此在 JVM 中执行 GC 不会减少 JVM 使用的 RAM 的 OS 视图。
JVM 可以将未使用的内存 return 分配给 OS,但这不是典型的默认行为。将未使用的 Java 堆内存返回到 OS 通常对性能没有帮助,因为当 Java 堆增长时,JVM 可能需要从 OS 回收该内存再次.
部署 Java 系统时,确保有足够的 RAM 来满足 Java 堆最大大小和 off-heap/native 元素的 Java 是至关重要的运行时间。本机堆的数量根据系统上的工作负载类型 运行 而有很大差异。
我通常的经验法则是 JVM 使用的 RAM 可能比最大堆大小多 25%,但根据工作负载,这个数字可能会小一些或大一些。因此,确定 JVM 需要多少 RAM 的唯一方法是 运行 工作负载并从 OS.
监控进程大小
您应该在负载下随着时间的推移监视每个 JVM 的进程大小 - 在 运行ning 一段时间后,java 进程大小应该大致稳定在一定数量的 RAM 上,这比比 Java 堆大小。
盒子上的所有 JVM 和所有其他进程 运行ning 使用的总 RAM 应该比系统中的总 RAM 少一些,因为 unusual/unexpected 事件可能会导致一些进程消耗比平时更多的 RAM。如果发生 RAM 耗尽,OS 可能会以不同的方式做出反应 - 交换到磁盘、使用大量 RAM 终止进程等 - 这些都对应用程序的性能非常不利。
您选择的 'free RAM margin' 取决于您个人和组织的风险承受能力。就个人而言,我不希望看到在正常运行中使用的 RAM 超过 90%。
我的系统每个节点有 3 个服务器,我们有 02 个节点,并为每个 JVM 设置 HeapSize 16Gb -> 这意味着我们总共有 06 个 JVM 来提供在线服务。
我们有02层:通过面向客户的网络发布的网络层,1层是应用层,用于响应和回复网络客户请求的查询。
我每天都在监控,设置了当JVM的RAM使用率达到90%时会发出报警信息。然后它自动减少,我的理解是 GC 将收集垃圾 java 并在达到高时释放 ram。
我用ManageEngine Application Management来监控,它在一些JVMs上发出告警信息。 我在 ManageEngine Application Management(简称:AM)上进行监控,在高工作负载时间(每日工作时间:14:00PM - 15:00 PM)和低工作负载时间( 01:00 上午 - 02:00 上午)。
我的问题:这些情况正常吗?我是否应该为这些 JVM 增加并提供更多 RAM 物理量,我担心 OOM,并希望系统运行稳定?您能解释一下 GC 过程吗?
这是一篇描述 Java 垃圾收集 (GC) 工作原理的文章。 GC 基础知识在不同的 Java 版本中几乎相同,本文中有一些特定于 IBM Java 或 IBM 硬件的项目。
https://www.eclipse.org/openj9/docs/gc/
JVM 向 OS 请求内存以满足 JVM 的各种操作需要。通常 JVM 内存的最大部分由 Java 堆使用 - 但 JVM 也需要不属于堆的内存,通常称为堆外内存或本机内存。
JVM 自动管理 Java 堆内的内存。 activity 包括在创建新对象时在堆上分配内存,以及在对象不再使用时清除该内存。 GC 是 activity 清除 Java 堆中未使用的内存。
但是通过 GC 清除堆内的内存不会 return 将内存分配给 OS - 而只是在 JVM 内将内存标记为 'free',以便新对象可以放在那个内存里。
因此在 JVM 中执行 GC 不会减少 JVM 使用的 RAM 的 OS 视图。
JVM 可以将未使用的内存 return 分配给 OS,但这不是典型的默认行为。将未使用的 Java 堆内存返回到 OS 通常对性能没有帮助,因为当 Java 堆增长时,JVM 可能需要从 OS 回收该内存再次.
部署 Java 系统时,确保有足够的 RAM 来满足 Java 堆最大大小和 off-heap/native 元素的 Java 是至关重要的运行时间。本机堆的数量根据系统上的工作负载类型 运行 而有很大差异。
我通常的经验法则是 JVM 使用的 RAM 可能比最大堆大小多 25%,但根据工作负载,这个数字可能会小一些或大一些。因此,确定 JVM 需要多少 RAM 的唯一方法是 运行 工作负载并从 OS.
监控进程大小您应该在负载下随着时间的推移监视每个 JVM 的进程大小 - 在 运行ning 一段时间后,java 进程大小应该大致稳定在一定数量的 RAM 上,这比比 Java 堆大小。
盒子上的所有 JVM 和所有其他进程 运行ning 使用的总 RAM 应该比系统中的总 RAM 少一些,因为 unusual/unexpected 事件可能会导致一些进程消耗比平时更多的 RAM。如果发生 RAM 耗尽,OS 可能会以不同的方式做出反应 - 交换到磁盘、使用大量 RAM 终止进程等 - 这些都对应用程序的性能非常不利。
您选择的 'free RAM margin' 取决于您个人和组织的风险承受能力。就个人而言,我不希望看到在正常运行中使用的 RAM 超过 90%。