- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小程序,它需要更多或更少的内存,具体取决于客户端有多少数据。
我们通常建议使用 Java 1.6 最新版本,但我们实际上支持 Java 1.5+,因此我们在小程序中提供了保护,其中显示一个对话框,其中包含有关“内存不足”的警告以及如何增加内存的说明。内存。
但是,我真的很惊讶地发现 -Xmx 在小程序和独立进程中的工作方式不同,而且我实际上无法确定小程序是否有足够的内存。
这是如何完成的:
如果我使用 0.9 的系数来避免 JVM 中的任何近似,似乎效果很好,但这是正确的值 - 0.9 吗?他们如何计算这个限制以及为什么它在独立应用程序和小程序中不同?
最佳答案
是时候深入探讨 Java 内存了。
首先,Java 中内存不足(即实际上得到 OutOfMemoryError )受到正在运行的 GC 特性的影响。
与名称所暗示的相反,您可能会得到 OutOfMemoryError,但实际上并没有耗尽内存;当运行时决定花费大量时间进行 GC 时,它也会抛出( source ,它埋在那里)。
此外,如果耗尽特定种类的内存,您可能会收到 OutOfMemoryError 错误。请记住,Java GC 是分代收集器,如果您碰巧耗尽了其中一代(我想说的是“终身”收集器,但我可能是错的),您实际上也会耗尽内存。这意味着您可以在操作系统 View 中保留剩余的堆空间,但无法在 Java 堆上分配任何内容。
最后,与 GC 相关的一些实际开销可能会占用一些堆空间。
<小时/>在您的情况下,更可能发生的是以下情况的一些变体:您的代码在独立上下文和小程序上下文中运行,每个上下文都有不同的安全管理器和不同的启动行为;这意味着涉及一组不同的类(它们被纳入永久代),具有不同的依赖关系。我猜想小程序“堆栈”更厚,因为对其行为有更严格的限制,这可能解释了 maxMemory() 的大部分差异。
简而言之,可用内存的差异可能是由于 Java 运行时为其自身操作保留的内存发生了一些变化。这可能与 GC 相关、与安全策略相关,或者只是为 Applet 环境与独立环境加载的不同类。在确定返回内容时,Runtime.maxMemory() 还可能考虑上述任何“内存不足”条件。因此,0.9 值可能是一种实现副作用,将来可能会发生变化。
关于java - -Xmx 小程序和独立 Java 进程之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1125515/
我真的很困惑。 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参数。 那
我是一名优秀的程序员,十分优秀!