- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近承担了对 Java 服务器中的内存利用率进行基准测试和优化的任务,同时修复内存泄漏(如果有)。我们有 4 个 JVM 服务器运行在一台机器上,有 15G 物理内存和 32G 交换内存。以下是free -m
快照。
total used free shared buff/cache available
Mem: 15289 14786 392 1 110 342
Swap: 32767 3776 28991
如果我理解正确的话:-
现在我的每台服务器都以 7G
运行,最大堆大小通过 -Xmx
选项设置。以下是 GC Utils 的输出
$ jstat -gcutil 8317
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 6.97 0.22 96.77 91.89 72 8.027 33 10.975 19.002
$ jstat -gcutil 8332
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 5.17 50.76 96.57 91.65 274 51.001 51 179.106 230.107
$ jstat -gcutil 8249
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 2.10 80.37 69.53 96.87 92.08 421 69.478 13 56.569 126.047
$ jstat -gcutil 23875
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
27.91 0.00 37.07 86.29 97.59 94.60 232 7.294 2 0.030 7.324
运行手动Full GC后,它完全释放了所有服务器的年轻代和年老代。现在我需要帮助来理解这个特征,基本上我的假设是否正确?
我问这个,因为Full GC确实释放了所有内存,所以不存在内存泄漏,但是如何通过调整GC设置在内存使用和应用程序吞吐量之间取得平衡。任何人都可以通过考虑上述机器状态来提供更多指导或建议吗?
JVM Details:
Java Version: openjdk version "1.8.0_131" Server Class
GC: Parallel Collector(Default one)
最佳答案
简而言之:如果您想了解您的系统,基本上了解某个时间点的内存使用情况是一个坏主意。随着时间的推移观察行为会更有帮助。为此,请使用 JConsole 或专业分析器(如 YourKit 或 JProfiler)。另一方面,Hotspot-VM 的默认设置非常合理,因此除非您有非常具体的应用程序内存配置文件,否则您可能不会通过摆弄来赢得很多,而通过简单地投入更多硬件来解决问题可能不会赢得更多。
请注意,您的服务器很可能尺寸不足(请参阅问题 4)
长答案:
问题 1: 对象如何在不同的内存区域中进行处理?每个对象都是在 eden 空间中创建的。第一个次要垃圾收集(也会触发主要收集)会将该对象放入幸存者中(如果有足够的空间)或直接放入终身对象中。对于已经在幸存者中的对象,它们从一个幸存者空间移动到另一个,并在某个时刻(由虚拟机内的启发式确定)被移动到终身。规则始终成立,至少有一个幸存者始终是空的。
问题 2: 老年人比年轻人从事更多的工作是否意味着您收集的频率不够?绝对不是。如果很少执行,Java 中的垃圾收集效果会更好(更高效)。基本上,如果自上次收集以来有更多对象死亡,则收集会更有效,因为它可以一次清理更多内存。 gc 的设计目的是让 tenured 填满,直到达到非常高的填充水平(接近 100%),然后再触发 full-gc。我们观察到生产系统数周内都没有进行 full-gc,因为年轻代足够大,因此所有临时分配都会在 eden 或 Survivor 中消亡。除此之外:您的所有缓存、Spring Beans 或其他任何内容都将始终处于长期状态。
问题 3: 我应该调整内存参数以优化内存消耗吗? 无论如何:不!除非你确切地知道自己在做什么,否则永远不要碰那些东西。扩大年轻代可能会导致您的应用程序因内存不足错误而终止。在摆弄这些东西之前,您应该非常清楚应用程序的长期行为,并且热点虚拟机的启发式方法非常好。另一方面,如果您知道自己在做什么,则可以显着减少 gc 时间。在一个系统(上面提到的那个)中,我们看到次要收集从大约 20 秒一次减少到几分钟一次,并且在调整后 full-gc 几乎完全停止。但在学习和理解我们的应用程序随着时间的推移如何在内存方面表现的过程中,我们也杀死了很多执行。
问题 4: 我应该增加内存而不是摆弄吗? 视情况而定。您的系统并不健康。增加内存会使情况变得更糟。您在物理内存为 16g 的系统上运行 4 个虚拟机,堆容量高达 7g(总共 28g)。如果所有虚拟机都将内存消耗扩大到最大,您将看到大量交换,这肯定会将性能降低到您难以想象的水平。在这种情况下,我会选择更多的硬件,特别是考虑到 java 应用程序的实际消耗大约是堆的 1.5 倍(您必须添加 permgen/metaspace、堆栈、代码缓存和 vm 本身消耗的内存) )。如果您确定,您的应用程序正在使用 -xmx7g 运行,您可以从这里开始:增加总体内存,同时减少旧代部分,以便绝对旧大小保持不变。然而,这意味着需要更多的硬件。
关于java - 了解 JVM 内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46727858/
是否可以复制一个完整的 JVM,并且在故障转移的情况下只需将负载转移到复制的 JVM 上? 如果是,那我们该怎么做呢? 最佳答案 如果您的应用程序是 Web 应用程序,请阅读“集群”和“负载平衡”。大
我读了下面的话,但我想知道它们之间的区别...... JVM 规范、JVM 实现、JVM 运行时 最佳答案 JVM 规范:描述 JVM 应如何运行的文档。 JVM 实现:基于 JVM 规范的 JVM
我目前有四个不同的 java 应用程序,它们由 .bat 文件启动的 jar 运行,这些文件位于 Windows XP Embedded 开始菜单的 starup 文件夹中。我还启动了 Firefox
有人能给我一些关于强制 64 位 jvm 作为 32 位 jvm 运行的想法吗? 我需要为蓝牙连接编写一个 jse 桌面应用程序。为此,我需要实现 Bluecove jar 。它只有 32 位文件。所
我看到过关于这个问题的多条评论——有人说是,有人说不是,许多答案模棱两可。任何人都可以用更简单的术语描述它所在的位置吗?在一篇文章中,我什至看到有人说它与类加载器加载类的类内存共享相同的内存位置 -
我正在寻找所有可能的 jvm 退出代码的完整列表(不是 java System.exit(x))。我使用搜索引擎唯一能找到的是 SIGTERM 退出代码列表:http://journal.thobe.
为了监视任何正常的 Java 进程 JVM,我们可以使用 Attach API。是否有可用于监控 WebSphere JVM 的 API? 最佳答案 您可以使用 PMI(性能监控基础设施)来监控 JV
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: Java - C-Like Fork? 我想知道如何从 JDK fork 子 JVM,甚至有可能这样做吗? 一些框架
JVM 上的哪些图灵完备语言实现不使用 JVM 堆栈作为调用堆栈? (我问是因为我想在同一个线程中实现 Scala 和另一种语言之间的协程。) 最佳答案 闪蝶 SISC(方案代码的第二解释者) 曾经不
我看到here除了 Java 之外,还有很多语言可以在 JVM 上运行。我对在 JVM 中运行的其他语言的整个概念有些困惑。所以: 为 JVM 使用其他语言有什么优势? 为 JVM 编写语言/编译器需
我已经运行了 straced JVM (OpendJDK 11): strace -e trace=mmap java -Xms8192m Main 输出是: mmap(NULL, 8192, PRO
我已经运行了 straced JVM (OpendJDK 11): strace -e trace=mmap java -Xms8192m Main 输出是: mmap(NULL, 8192, PRO
我编写了一个简单的数独求解器。为了粗略测试性能,我使用简单的 System.currentTimeMillis 调用。 我在文本文件中准备了一组初始数独配置。该程序读取该文件并解决每个数独配置。运行测
JVM 被广泛使用:Scala、Groovy、Jython 等。我听说它被描述为“卓越”、“出色”和“严重低估”。为什么? 更具体地说,是什么让 JVM 独一无二?随着所有资金投入 .NET,或者 C
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Are there any Java VMs which can save their state to a fi
想象一下 6-7 台服务器的设置都完全相同Java 版本“1.6.0_18”OpenJDK 运行时环境 (IcedTea6 1.8) (fedora-36.b18.fc11-i386)OpenJDK
(如有错误请指正) 我了解到,当您通过发出 java 命令来运行 java 程序时, java MyProg 程序将在新的 JVM 上运行。 什么将程序加载到新的 JVM 中?是生成新线程的 JRE
我们有一个使用 JNI 的桌面应用程序偶尔会导致 JVM 崩溃。幸运的是,JVM 会生成一个 hs_err_pidXXXX.log 文件,这对于调试此类错误非常有用。然而,它似乎总是转到当前工作目录,
我在命令提示符下运行一个程序集 jar 文件并得到下面的异常。并导致终止。 Uncaught error from thread [ccp-akka.persistence.dispatchers.d
一、什么是Java虚拟机 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java
我是一名优秀的程序员,十分优秀!