- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 JDK 8 ,默认最大堆大小为
1/4th of the physical memory or 1GB
并且可以使用 -Xmx
开关覆盖它:
You can override this default using the -Xmx command-line option.
Xmx
开关适用于字节,而不是分数。是否有一种直接方法将最大堆设置为计算机物理内存的 X%?
编辑:
你问为什么?嗯,首先是好奇心。我觉得很奇怪,默认的 Xmx 是根据物理内存的一小部分定义的,但是一旦我触摸它,它就会突然变成一个绝对值。其次,如果我将相同(或类似)的应用程序部署到两台不同的服务器,并且其中一台具有更多的物理内存,我希望能够选择自动让 JVM 利用额外的内存。它并不总是有意义,但有时确实有意义。
显而易见的解决方案是使用 shell 脚本来检查可用空间量并计算 Xmx,但这似乎是一个笨拙的解决方案。我想用纯 Java 应该可以实现。
最佳答案
自 Java 8u191 (October 16, 2018) 以来,存在三个专用 JVM 选项来控制堆大小(作为可用内存的一部分)。它们被记录在 here 中。
请注意,与它的名称所暗示的相反,MinRAMPercentage
设置最大堆大小
-XX:InitialRAMPercentage=percent
Sets the initial amount of memory that the JVM will use for the Java heap before applying ergonomics heuristics as a percentage of the maximum amount determined as described in the -XX:MaxRAM option. The default value is 1.5625 percent.
-XX:MaxRAMPercentage=percent
Sets the maximum amount of memory that the JVM may use for the Java heap before applying ergonomics heuristics as a percentage of the maximum amount determined as described in the -XX:MaxRAM option. The default value is 25 percent.
-XX:MinRAMPercentage=percent
Sets the maximum amount of memory that the JVM may use for the Java heap before applying ergonomics heuristics as a percentage of the maximum amount determined as described in the -XX:MaxRAM option for small heaps. A small heap is a heap of approximately 125 MB. The default value is 50 percent.
以下是使用 jdk 11u10 在 x64 上使用 docker 运行的一些示例:
docker run --memory <limit> openjdk:11 java -XX:MaxRAMPercentage=25 -XX:MinRAMPercentage=50 -XX:InitialRAMPercentage=5 -XX:+PrintFlagsFinal 2>&1 | grep HeapSize
| Memory Limit | Initial Heap Size | Max Heap Size |
|--------------|-------------------|------------------|
| 100Mi | 10485760 (~10%) | 52428800 (~50%) |
| 256Mi | 27262976 (~10%) | 132120576 (~50%) |
| 512Mi | 54525952 (~10%) | 134217728 (~25%) |
| 1Gi | 109051904 (~10%) | 268435456 (~25%) |
关于Java 将最大堆大小 (Xmx) 设置为物理内存的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47377336/
我真的很困惑。 Xmx 根据 java 文档,是允许的最大堆大小。 Xms 是所需的最小 Java 堆大小,在 JVM 启动时分配。 在 32 位 JVM(4GB 内存)上,java -Xmx1536
我有一个疑问。让我们假设我有两个参数传递给 JVM: -Xms256mb -Xmx1024mb 在程序开始时分配了 256MB。接下来,创建一些对象,JVM 进程尝试分配更多内存。假设 JVM 需要分
我试图在Windows机器上运行Elasticsearch,但是出现错误“无法创建Java虚拟机”。 Windows 10、32GB RAM,64位 JVM 1.8.0_201 Elasticsear
我正在使用一个名为 Talend 的 BI 数据集成工具,该工具使用 Java 在 Eclipse 上构建。 在启 Action 业时,它说 Could not create the Java vir
我使用 -Xms256m and -Xmx256m JVM options 将初始和最大 Java 堆大小设置为 256MB . GC 日志(使用 -XX:+PrintHeapAtGC)表明堆大小为
我正在使用 java -Xmx60g 命令运行以下代码。 每个阵列应该在 8.5GB 左右,总共 17GB。该机器总共有 64GB,其中有 63GB“免费”。它打印 DONE DECLARING RI
这SO answer澄清了一些关于 -Xmx JVM 标志的事情。为了进行实验,我做了以下事情: import java.util.List; import java.util.ArrayList;
我有很多 JVM 在 Linux Redhat 上运行,具有 32GB 的物理内存和 32GB 的虚拟内存。这些 JVM 配置为具有超过 32GB 的 Xmx 总值,并且可能让 Linux 使用了它的
我们知道我们可以在 window->preferences->java->installed jres->edit->default vm arguments 中设置 -Xmx1024M 在 ecli
我的 Java 应用程序通过运行“java -jar j.jar”进程来运行另一个 Java 应用程序。众所周知,J.jar 会根据给定的数据集使用大量内存,并且经常会获得 OutOfMemoryEr
有没有办法限制javac的最大虚拟内存使用量?运行 java 时,我可以使用“-XmxAm”(其中 A 是可用兆字节数)运行它来限制它。 javac 有这样的东西吗?谢谢。 最佳答案 您可以使用 -J
问题 我有一个包含大量公式的 .xlsx 文件。我想将此文件转换为新的 .xlsx 文件,其中所有公式都替换为其绝对值。为什么? 可能与这个问题无关。 我做了什么? 我的目标是在尽可能少的堆内存中执行
我正在 Fedora 上运行 jre 6u24 (Linux xxx 2.6.33.7.2-rt30 #1 SMP PREEMPT RT Mon Mar 21 00:50:23 UTC 2011 i6
在阅读了诸如this和JEP-346之类的答案之后,我意识到G1确实将内存释放回了操作系统。 但是,它是否将内存释放回操作系统,甚至导致当前的内存使用量可能降至初始堆内存以下(即,在此JEP之前,对于
我有两台运行 Mac OS X El Capitan 和 Ubuntu 16.04 LTS 的计算机。两者都安装了 Java SDK 1.8.0_101。 当我尝试在 Ubuntu 上启动游戏服务器时
当我尝试使用 -Xms32m -Xmx128m 加载列表中的 39MB 文本时出现内存不足错误。所以我开始一点一点地增加Xmx,直到加载成功,发现我至少需要Xmx170m才能加载内存中的39MB文件
JacORB 通知服务的 JVM (java 1.6) 消耗内存超过 -Xmx 值,设置为 240MB。 Windows 任务管理器中的 java exe 超过 900MB Privatebytes,
在 JDK 8 ,默认最大堆大小为 1/4th of the physical memory or 1GB 并且可以使用 -Xmx 开关覆盖它: You can override this defau
我在我的应用程序中遇到了臭名昭著的 OutOfMemoryException,我没有简单地增加可用的堆空间量,而是试图查看问题所在,以防万一,出现某种泄漏从我的应用程序。 我添加了 JVM 参数 -X
在 java 中,我们可以使用 xmx 参数定义进程可以占用的最大内存。对于 perm gen,我们可以定义 MaxPermSize。 perm gen 空间也是使用分配的内存的一部分xmx参数。 那
我是一名优秀的程序员,十分优秀!