问题标签 [heap-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
5227 浏览

c - 我可以在不使用堆的情况下编写 C 应用程序吗?

我在嵌入式环境中遇到了似乎是堆栈/堆冲突的情况(有关一些背景信息,请参阅此问题)。

我想尝试重写代码,以便它不会在堆上分配内存。

我可以在不使用 C 中的堆的情况下编写应用程序吗?例如,仅当我需要动态内存分配时,我将如何使用堆栈?

0 投票
6 回答
15400 浏览

c++ - 在堆上创建数组并用指针寻址它们

我无法理解以下代码,我希望在堆上创建一个数组并用字符 9 填充到 0(我知道我可以像使用 [] 符号的普通堆栈数组一样索引数组这样做,但我这样做是为了更深入地理解指针):

它打印出完全出乎意料的值。

据我了解,“new”命令在堆上创建了一个数组,并向我发送了一个指向数组所在地址的指针。由于我分配的指针 (ptrHeapArray) 是 int 大小,我认为我可以使用指针后递增来导航数组。然而,结果表明我的假设是错误的。

这让我想到,“new”关键字传回的指针可能只是指向整个数组的指针,并且由于某种原因不能用于单步执行数组。所以我尝试创建另一个指向“new”关键字返回的指针的指针,并用它来填充我的数组:

这工作得很好。谁能向我解释为什么我必须这样做并且不能只使用通过“new”关键字传递给我的指针?

谢谢

0 投票
4 回答
225 浏览

c++ - 使用新创建的向量的操作

有人能帮忙吗...

我得到:错误 C2228:'.reserve' 的左边必须有类/结构/联合

我正在使用 new 运算符创建一个向量,以便它比创建它的函数的寿命更长。因此,这给了我一个指向堆上那个向量的指针,而不是一个实际的向量对象本身。因此它不会让我执行任何 push_backs 的 .reserve()。我看不到解决方法,有人可以帮忙吗?

0 投票
5 回答
4284 浏览

java - 如何配置 Spring 以节省尽可能多的内存?

我们正在一个有内存限制的半嵌入式设备上部署一个应用程序。为了尽可能地保存我们正在分析应用程序的堆转储并攻击最大的消费者。

我们将 Spring 2.5 与 Spring DM 1.1 一起使用,我们注意到我们的一些具有更复杂 Spring 上下文的包正在使用相当多的内存,因为 Spring 似乎保留了包含从 XML 解析的所有 BeanDefinitions 的整个对象图. 我认为一旦应用程序初始化并注入所有内容,大部分这些都是不必要的。

Spring 是否有允许控制这种行为的配置选项?在一些低内存模式下运行?扔掉所有不必要的东西?用计算时间换大小?

0 投票
1 回答
9763 浏览

c - 它在堆栈还是堆上?

我有一些令人困惑的 C 代码。出于与此代码有关的原因,我想知道如何判断一个struct对象是在堆上还是在堆栈上?

对象不是malloc或创建的calloc。他们以数组的形式开始他们的生活。出于本文的目的,我将调用 struct Emp。

以各种方式对对象进行排序和操作,在某些时候,对象被复制然后交给数组指针。复制是通过memcpy. 然后将对象放入以下内容中:Emp* emps_a[6].

对象来自副本并分配到上述emps_a。

我不确定这是否与我的问题有关。我从不需要 free() 或清理内存……恐怕我对 C 不太了解。

非常感谢您的帮助。

0 投票
15 回答
161977 浏览

java - Java 拒绝启动 - 无法为对象堆保留足够的空间

背景

我们有一个大约 20 个 linux 刀片的池。有些运行 Suse,有些运行 Redhat。ALL 共享 NAS 空间,包含以下 3 个文件夹:

  • /NAS/app/java - 指向 Java JDK 安装的符号链接。当前版本 1.5.0_10
  • /NAS/app/lib - 指向我们应用程序版本的符号链接。
  • /NAS/data - 写入输出的目录

我们所有的机器都有 2 个处理器(超线程),具有 4gb 的物理内存和 4gb 的交换空间。我们将每台机器在给定时间可以处理的“作业”数量限制为 6 个(这个数字可能需要更改,但这不属于当前问题,因此请暂时忽略它)。

我们的一些作业将最大堆大小设置为 512mb,而另一些作业将最大堆大小保留为 2048mb。同样,我们意识到如果在同一台机器上启动 6 个作业并将堆大小设置为 2048,我们可能会超出可用内存,但据我们所知,这还没有发生。

问题

有时,作业会立即失败并显示以下消息:

我们过去常常将此归咎于在同一台机器上同时运行的作业太多。这个问题很少发生(可能每月一次),我们只需重新启动它,一切都会好起来的。

这个问题最近变得更糟了。我们所有请求最大堆大小为 2048m 的作业几乎每次都会立即失败,并且需要重新启动几次才能完成。

我们已经使用了个别机器并尝试手动执行它们,结果相同。

调试

事实证明,这个问题只存在于我们的 SuSE 盒子中。它发生得更频繁的原因是因为我们一直在添加更多的机器,而新的机器是 SuSE。

SuSE 框中的“cat /proc/version”为我们提供:

RedHat 盒子上的“cat /proc/version”为我们提供:

'uname -a' 在两种类型的机器上都为我们提供了以下信息:

机器上没有运行任何作业,也没有其他进程占用太多内存。当前运行的所有进程可能总共使用 100mb。

“顶部”当前显示以下内容:

“vmstat”当前显示以下内容:

如果我们使用以下命令行(Max Heap of 1850mb)启动一项工作,它可以正常启动:

如果我们将最大堆大小增加到 1875mb,它会失败:

很明显,当前使用的内存是用于缓冲/缓存的,这就是为什么很少显示为“空闲”的原因。不清楚的是为什么会有一个神奇的 1850mb 行,任何更高的值都意味着 Java 无法启动。

任何解释将不胜感激。

0 投票
2 回答
5704 浏览

linux - SuSE Linux 的最大 Java 堆空间是多少

这个问题与Java Refuses To Start - could Not Resrve Enough Space for Object Heap 有关,应该很容易弄清楚。然而; 我的搜索没有产生任何有用的东西。

本质上,我们在具有相同硬件的不同机器上拥有 2 个 32 位操作系统(RedHat 和 SuSE)。两者都使用相同的 JVM,都执行相同的命令行。RedHat 运行良好,但 SuSE 报告内存不足。

我们只需要知道这是否是我们正在使用的 SuSE 版本的限制,还是其他原因。

'cat /proc/version' 给我们:

'uname -a' 在两种类型的机器上都为我们提供了以下信息:

0 投票
5 回答
14697 浏览

java - JVM 如何确保 System.identityHashCode() 永远不会改变?

通常,默认实现Object.hashCode()是内存中对象的分配地址的某些功能(尽管JLS没有强制要求)。鉴于虚拟机在内存中分流对象,为什么System.identityHashCode()在对象的生命周期内返回的值从不改变?

如果它是“一次性”计算(对象的hashCode计算一次并隐藏在对象头或其他东西中),那么这是否意味着两个对象有可能具有相同的identityHashCode(如果它们恰好在内存中的相同地址)?

0 投票
23 回答
13960 浏览

c++ - 为什么不在 C++ 中对所有内容都使用指针?

假设我定义了一些类:

然后使用它编写一些代码。为什么我要执行以下操作?

来自 Java 世界,我总是这样写:

他们基本上做同样的事情,对吧?一个在堆栈上,另一个在堆上,所以我必须稍后将其删除。两者有什么根本区别吗?为什么我应该更喜欢一个而不是另一个?

0 投票
1 回答
335 浏览

java - Java 对象方法栈帧参数

所以在java中,假设你在一个类'Foo'中有一个非静态方法'bar()'。

然后说你这样调用这个方法:

现在调用的堆栈帧包括整数参数,以及用作对象内部引用的“this”参数。

除了“this”和方法参数之外,还有哪些有趣的参数被复制到新的堆栈帧中?

.