我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。
我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。
我的问题是:
1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的内存分配实际上如何工作?
2)虚拟内存如何发挥作用?假设您有一个具有32GB物理内存的系统,并且已将所有32GB分配给Java进程。假设您的进程实际上消耗了所有32GB的内存,我们如何才能强制该进程使用虚拟内存而不是遇到OOM异常?
谢谢。
JVM如何实际为自己分配内存?
对于堆,它分配一个最大大小的连续大内存区域。最初是虚拟内存,但是随着时间的流逝,它变成了在操作系统的控制下所使用部分的真实内存
这与OS如何将可用内存传递给JVM有什么关系?
JVM对操作系统中的可用内存一无所知。
或更笼统地说,任何进程的内存分配实际上如何工作?
通常,它使用malloc和free。
虚拟内存如何发挥作用?
最初分配虚拟内存,然后将其转换为实际使用的内存。这对于任何过程都是正常的。
假设您有一个具有32GB物理内存的系统,并且已将所有32GB分配给Java进程。
你不能 操作系统需要一些内存,并且将有其他用途的内存。即使在JVM内,堆也仅是所使用内存的一部分。如果您有32 GB的内存,我建议最大为24 GB的堆。
假设您的进程实际上消耗了所有32GB的内存,
假设您有48 GB,然后启动一个使用32 GB主内存的进程。
我们如何强制该过程使用虚拟内存而不是遇到OOM异常?
该应用程序从一开始就使用虚拟内存。您不能使堆太大,因为如果堆开始交换,您的计算机(而不仅仅是应用程序)将变得不可用。
通过仔细使用堆外内存,可以使用比物理内存更多的内存。但是,托管内存必须位于物理内存中,因此,如果需要32 GB的堆,请购买64 GB的主内存。
我想真正了解内存分配在JVM中是如何工作的。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数,如Xms和Xmx,以增加JVM为正在运行的进程分配的堆空间。这是一个可能的解决方案,或者我可以检查我的代码内存泄漏并修复那里的问题。 我的问题是: 1)JVM实际上如何为自己分配内存?这与OS如何将可用内存传递给JVM有什么关系?或者更一般地说,为任何进程分配内存实际上是如何工作的
我是刚到爪哇的。我只是试图了解如何处理堆内存溢出及其原因。有人能在下面的代码中帮助我为什么它会抛出这个错误吗。我怎么能避免。 错误: 线程“main”Java.lang.OutOfMemoryError中出现异常:Java.util.arrays.copyof(arrays.Java:2361)在Java.lang.AbstractStringBuilder.ExpandCapacity(Abst
我有一个非常消耗内存的程序,想使用-Xmx2048m为java jvm分配更多的最大内存。但在启动时,我得到一个“无法为对象堆保留足够的空间”错误。 当尝试多个值并发现我的最大值是时,它就开始了。但我喜欢分配2GB。在使用-Xmx1560m启动java进程后,我有6GB的物理内存,Taskmanager显示3400MB可用。 有人知道我为什么不能分配2GB吗?
问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。
问题内容: 尝试在Eclipse中启动和运行flex / java项目时,我一直使用Eclipse,Tomcat和JRE收到“内存不足异常”和“ Java堆空间”。 在研究尝试调整内存设置时,我发现了三个地方来调整这些设置: Eclipse.ini 窗口>首选项下的JRE设置 Catalina.sh或Catalina.bat 在这些不同位置设置-xms和-xmx有什么区别,这是什么意思? 有什么方
问题内容: 今天,我运行了用于文件系统索引编制的脚本,以刷新RAID文件索引,并在4小时后崩溃并出现以下错误: 服务器配备16GB RAM和24GB SSD交换。我非常怀疑我的脚本是否超过了36gb的内存。至少不应该 脚本使用文件元数据(修改日期,权限等,无大数据)创建存储为对象数组的文件索引 过去,我曾经用此脚本经历过奇怪的节点问题,这使我不得不这样做。在处理诸如String之类的大文件时,由于