当前位置: 首页 > 面试题库 >

Java中的内存使用量突发

陈茂
2023-03-14
问题内容

我正在尝试处理Java中正确的内存使用和垃圾回收。无论如何,我都不是新手程序员,但是在我看来,一旦Java接触到一些内存,它就永远不会被释放供其他应用程序使用。在这种情况下,您必须确保
峰值内存 永远不会太高,否则应用程序将继续使用峰值内存使用率。

我编写了一个小示例程序试图证明这一点。它基本上有4个按钮…

  1. BigList = new ArrayList<string>()用大约25,000,000个长字符串项目填充类范围变量。
  2. 呼叫 BigList.clear()
  3. 重新BigList = new ArrayList<string>()分配列表- 再次(以缩小列表大小)
  4. 致电System.gc()-是的,我知道这并不意味着GC会真正运行,但这就是我们所拥有的。

因此,接下来,我在Windows,Linux和Mac OS上进行了一些测试,同时使用默认任务监视器检查报告的内存使用情况的进程。这是我发现的…

  • 窗户 -抽水列表,通话清晰,然后在所有调用GC几次不会减少内存使用情况。但是,使用new几次重新分配列表,然后多次调用GC会将内存使用量降低到起始级别。海事组织,这是可以接受的。
  • Linux (我将Mint 11发行版与Sun JVM一起使用)-与Windows相同。
  • Mac OS-执行了与上述相同的步骤,但是即使重新初始化对GC的列表调用似乎也没有效果。该程序将使用数百MB的RAM,即使我的内存不足。

谁能向我解释一下?
有人告诉我一些有关“堆”内存的信息,但我仍然不完全了解它,因此我不确定它是否适用于此。从我所听到的信息来看,无论如何我都不会看到我在Windows和Linux上的行为。

这仅仅是Mac OS的Activity Monitor测量内存使用方式的不同还是发生了其他情况?我希望程序不会因大量的RAM使用而闲置。感谢您的见解。


问题答案:

Sun / Oracle
JVM不会将不需要的内存返回给系统。如果您给它提供最大的最大堆大小,并且实际上在某个时候使用了该堆空间,那么JVM不会将其退还给操作系统以用于其他用途。其他JVM会做到这一点(JRockit曾经这样做,但我认为它不再这样做了)。

因此,对于Oracle
JVM,您需要调整应用程序和系统的使用高峰期,这就是它的工作原理。如果您正在使用的内存可以通过字节数组进行管理(例如处理图像等),则可以使用映射的字节缓冲区而不是Java字节数组。映射的字节缓冲区直接从系统获取,不属于堆。当您释放这些对象时(我相信,但不能确定它们是GC的),内存将返回给系统。假设它甚至完全适用,您可能必须使用它。



 类似资料:
  • 问题内容: 我知道Java有其自己的垃圾收集器,但有时我想手动删除垃圾。有什么办法可以做这样的工作吗?考虑到我声明了许多变量的很长或很长,这是在使用函数而不是在函数末尾自动收集后立即删除未使用的内存的好主意吗?如果手动删除垃圾,是否会影响应用程序的速度?感谢您的帮助! 问题答案: 在Java中没有直接和立即的释放内存的方法。您可以尝试使用众所周知的方法 说服 垃圾收集器带走一些对象: 但是不能保证

  • 我有一个关于java如何处理未使用变量的问题。 假设我有以下代码: 那么我就不会在代码中使用notUsedVariable。该变量是否会被存储,或者java是否足够聪明,可以在编译时忽略该变量? 谢谢

  • 问题内容: 我的磁盘上只有168MB的文件。这只是一个逗号分隔的单词,id的列表。该单词的长度可以为1-5个字符。有650万行。 我在python中创建了一个字典,将其加载到内存中,因此我可以针对该单词列表搜索传入的文本。当python将其加载到内存中时,它显示已使用的1.3 GB RAM空间。知道为什么吗? 假设我的word文件如下所示… 然后再加上650万。然后,我遍历该文件并创建一个字典(p

  • 我有一个很小的java控制台应用程序,我想在内存使用方面进行优化。它是在Xmx设置为仅64MB的情况下运行的。根据不同的监视工具(htop、ps、pmap、Dynatrace)显示进程的总体内存使用量超过250MB。我主要在Ubuntu18上运行它(也在其他操作系统上测试)。 我使用了-xx:nativeMemoryTracking,java param和jcmd的本地内存跟踪,以找出为什么在堆之

  • 我正在建立一个有许多自治代理的模型。他们决定在他们的直接环境或“邻里”中选择哪个目标。他们这样做是为了检索对象,将它们添加到列表中,根据首选项对列表进行排序,并在每次迭代中选择首选项。这个决定决定了他们的行动。 不幸的是,一旦特工人数过多,该计划就会大幅放缓。 我使用比较方法(下图),它相对较短,但使用大量内存来比较对象。我想知道你们是否知道任何其他方法可能在计算上更有效?

  • 我使用的是Android studio 3.1.3(编写本文时的最新版本)和Gradle 3.1.3。 我不知道这是否重要,但我最近升级到了Ubuntu18.04 每当我启动Android studio时,它都是从非常小的内存占用开始的。(一个名为java的进程占用大约1GB的RAM) 还有其他人面临这个问题吗?当我在Ubuntu16.04和旧的android工作室时,这不是问题。Ubuntu一定