问题标签 [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.
c++ - 哪个更快:堆栈分配或堆分配
这个问题听起来可能相当初级,但这是我与另一位共事的开发人员进行的辩论。
我小心翼翼地在可能的地方堆栈分配东西,而不是堆分配它们。他正在和我说话,看着我的肩膀并评论说这没有必要,因为它们在性能方面是相同的。
我一直认为堆的增长是恒定的时间,堆分配的性能取决于堆的当前复杂性,用于分配(找到适当大小的孔)和取消分配(折叠孔以减少碎片,如如果我没记错的话,许多标准库实现在删除期间需要时间来执行此操作)。
这让我觉得可能非常依赖编译器。特别是对于这个项目,我将Metrowerks编译器用于PPC架构。了解这种组合会很有帮助,但总的来说,对于 GCC 和 MSVC++,情况如何?堆分配的性能不如堆栈分配吗?没有区别吗?或者差异如此之小以至于变得毫无意义的微优化。
java - 如何分析 .hprof 文件?
我有一个使用以下标志运行的生产服务器: - XX:+HeapDumpOnOutOfMemoryError
昨晚,当我们的服务器遇到堆错误时,它生成了一个 java-38942.hprof 文件。事实证明,系统的开发人员知道该标志,但无法从中获取任何有用的信息。
有任何想法吗?
operating-system - 除了 malloc/free 程序是否需要操作系统来提供其他任何东西?
我正在为我正在开发的操作系统设计内核(我实际上将其称为“核心”只是为了不同,但它基本相同)。如果我无法启动并运行多任务、内存管理和其他基本功能,那么操作系统本身的细节就无关紧要了,所以我需要先解决这个问题。我有一些关于设计 malloc 例程的问题。
我认为 malloc() 要么是内核本身的一部分(我倾向于这个)要么是程序的一部分,但我将不得不编写自己的 C 标准库的实现方式,所以我开始写一个malloc。在这方面我的问题实际上相当简单,C(或C++)如何管理它的堆?
我在理论课上一直被教导的是,堆是一块不断扩展的内存,从指定的地址开始,并且在很多意义上表现得像一个堆栈。这样,我知道在全局范围内声明的变量在开头,更多的变量在各自的范围内声明时被“推送”到堆上,超出范围的变量只是留在内存空间中,但是该空间被标记为空闲,因此如果需要,堆可以扩展更多。
我需要知道的是,C 究竟如何以这种方式处理动态扩展堆?编译后的 C 程序是否会自己调用 malloc 例程并处理自己的堆,还是需要为它提供自动扩展空间?另外,C 程序如何知道堆的开始位置?
哦,我知道同样的概念也适用于其他语言,但我希望任何示例都使用 C/C++,因为我最熟悉那种语言。我也不想担心堆栈等其他事情,因为我认为我能够自己处理这样的事情。
所以我想我真正的问题是,除了 malloc/free(它自己处理获取和释放页面等)之外,程序是否需要操作系统来提供其他任何东西?
谢谢!
编辑我对 C 如何使用与堆相关的 malloc 比对 malloc 例程本身的实际工作更感兴趣。如果有帮助,我会在 x86 上执行此操作,但 C 是交叉编译器,所以没关系。^_^
进一步编辑:我知道我可能会混淆术语。我被告知“堆”是程序存储诸如全局/局部变量之类的东西的地方。我习惯于在汇编编程中处理“堆栈”,我刚刚意识到我可能是这个意思。我的一些研究表明,“堆”更常用来指代程序为自己分配的总内存,或者操作系统提供的内存页的总数(和顺序)。
那么,考虑到这一点,我该如何处理不断扩大的堆栈?(看来我的 C 理论课有点……有缺陷。)
java - Java very large heap sizes
Does anyone have experience with using very large heaps, 12 GB or higher in Java?
- Does the GC make the program unusable?
- What GC params do you use?
- Which JVM, Sun or BEA would be better suited for this?
- Which platform, Linux or Windows, performs better under such conditions?
- In the case of Windows is there any performance difference to be had between 64 bit Vista and XP under such high memory loads?
c - 高效的堆管理器,用于处理大量流失、微小的分配?
我正在寻找堆管理器的想法来处理非常具体的情况:很多非常小的分配,每个分配范围从 12 到 64 字节。任何更大的东西,我都会传递给常规的堆管理器,所以只需要处理小块。只需要 4 字节对齐。
我主要担心的是
- 高架。常规的 libc 堆通常会将分配四舍五入为 16 字节的倍数,然后添加另一个 16 字节标头 - 这意味着 20 字节分配的开销超过 50%,这很糟糕。
- 表现
一个有用的方面是 Lua(它是这个堆的用户)会在调用 free() 时告诉你它正在释放的块的大小——这可能会启用某些优化。
我会发布我目前的方法,它工作正常,但如果可能的话,我想改进它。有任何想法吗?
c++ - 为什么我们甚至需要“delete[]”操作符?
这是一个困扰我一段时间的问题。我一直认为 C++ 的设计应该使delete
运算符(不带括号)即使与new[]
运算符一起工作。
在我看来,写这个:
应该等同于分配一个包含 1 个元素的数组:
如果这是真的,那么delete
操作符总是可以删除数组,我们就不需要delete[]
操作符了。
delete[]
在 C++ 中引入运算符有什么原因吗?我能想到的唯一原因是分配数组的内存占用很小(您必须将数组大小存储在某个地方),因此区分delete
vsdelete[]
是一个小的内存优化。
java - 一般问题:Java 有堆和本地堆栈。你可以从堆中访问任何对象吗?
我真的在研究按值传递与 Java 如何分配对象以及 java 将对象放入堆栈中的作用之间的区别。
无论如何可以访问堆上分配的对象吗?java 强制执行哪些机制来保证正确的方法可以访问堆外的正确数据?
看起来如果您很狡猾,甚至可能在运行时操纵 java 字节码,那么您可能能够在不应该的时候操纵堆外的数据?
.net - 我可以(并且我曾经想要)在.net 中设置最大堆大小吗?
来自 java 背景,我习惯的一件事是告诉 JVM 最大堆大小应该是多少。如果正在运行的程序尝试吞下的资源超出了允许范围,而垃圾收集器无法释放更多资源,则会抛出 OutOfMemoryError 并且一切都会发生。所以设置最大堆大小在 Java 中很重要。
这适用于.net吗? 你能设置堆大小限制吗?CLR 是否会不断增长其堆,直到达到机器的物理极限?或者,由于某种微妙的原因,我的 Java 闪烁器阻止我看到,这在 .net 中不是问题吗?
java - Java 对象的内存分配过程中的步骤
当一个类实例化以下对象时,内存中会发生什么?
在课堂上SomeClass1
:
在课堂上SomeClass2
:
如何为新实例化的对象及其属性分配内存?
c++ - 堆上的 C++ 多维数组
我将如何动态分配多维数组?