"new"和"malloc"和"calloc"和其他家庭有什么区别?
(何时)除了"新"之外我还需要什么?
其中一个是否使用其他任何一个实现?
我目前正在研究Java应用程序并努力优化其内存使用.据我所知,我正在遵循适当的垃圾收集指南.但是,即使不需要,我的堆似乎仍然处于最大大小.
我的程序每小时运行一次资源密集型任务,当一个人没有使用计算机时.此任务使用了相当大的内存块,但在任务完成后立即释放所有内存.NetBeans探查器显示内存使用情况如下所示:

我真的很想在不使用时将所有堆空间都交还给操作系统.没有理由让我把它全部用掉,而程序甚至不会在至少一个小时内做任何事情.
这可能吗?谢谢.
我有一个Scala数据处理工具失败,但有java.lang.OutOfMemoryError异常.该工具需要对大型数据文件(我正在处理的文件超过700MB)进行一次传递,因此如果将整个文件存储在内存中会很方便.
我使用"scala"运行器从命令行或Bash脚本运行该工具.如何为此增加JVM堆大小?我试过传球-Xmx1024m,但它不承认这个论点.我正在使用Scala 2.8.0(r18678)的夜间版本.
维基百科说:
选择算法:使用堆可以在线性时间内完成最小值,最大值,最小值和最大值,中值或甚至第k个最大元素的查找.
它说的只是它可以完成,而不是如何完成.
你能给我一些关于如何使用堆来完成这项工作的开始吗?
内存分配是系统调用吗?例如,malloc和new.堆是由不同进程共享并由操作系统管理的.私有堆怎么样?如果堆中的内存分配由操作系统管理,这有多贵?
我还希望有一些链接到我可以阅读更多关于这个主题的地方.
以下代码在堆栈上创建一个对象:
Object o;
Run Code Online (Sandbox Code Playgroud)
在堆上创建对象时,我们可以使用:
Object* o;
o = new Object();
Run Code Online (Sandbox Code Playgroud)
而不是:
Object* o = new Object();
Run Code Online (Sandbox Code Playgroud)
当我们将堆对象创建分成两行并在第二行(o = new object())上调用构造函数时,这是否意味着在第一行(Object* o)中指针是在堆栈上创建的?因此Object o将对象放在堆栈上,而Object* o将指针放在堆栈上的未来对象中?
我的第二个问题涉及两行代码是否在类之外调用.我最近读过(堆栈或堆中的C中的全局内存管理?)全局变量不包含在堆栈/堆中但实际上是内存的另一部分?如果是这种情况,会Object* o创建一个指针,它将位于内存的其他部分,并指向堆对象?
我们有大约20个Linux刀片池.有些正在运行Suse,有些正在运行Redhat.ALL共享NAS空间,其中包含以下3个文件夹:
我们所有的机器都有2个处理器(超线程),4GB物理内存和4GB交换空间.我们将每台机器在给定时间可处理的"作业"数量限制为6(此数字可能需要更改,但这不会进入当前问题,因此请暂时忽略它).
我们的一些工作设置最大堆大小为512mb,其他一些保留最大堆大小为2048mb.同样,我们意识到如果在堆大小设置为2048的同一台机器上启动了6个作业,我们可以查看可用内存,但据我们所知,这还没有发生.
有一段时间,作业将立即失败,并显示以下消息:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Run Code Online (Sandbox Code Playgroud)
我们曾经在同一台机器上同时运行太多工作.这个问题很少发生(可能每月一次),我们只是重新启动它,一切都会好的.
这个问题最近变得更糟.我们所有请求最大堆大小为2048m的作业几乎每次都会立即失败,需要在完成之前重新启动几次.
我们已经去了各个机器,并尝试使用相同的结果手动执行它们.
事实证明,问题只存在于我们的SuSE盒子中.它更频繁发生的原因是因为我们一直在添加更多的机器,而新的机器是SuSE.
SuSE盒子上的'cat/proc/version'给我们:
Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005
Run Code Online (Sandbox Code Playgroud)
RedHat盒子上的'cat/proc/version'给我们:
Linux version 2.4.21-32.0.1.ELsmp (bhcompile@bugs.build.redhat.com) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-52)) #1 SMP …Run Code Online (Sandbox Code Playgroud) 我正在开发一个演示Djikstra算法的应用程序,并且要使用它,我需要在我的元素值减少时恢复堆属性.
关于复杂的问题是,当算法改变的元素的值,该元素的索引用于优先级队列中的内部结构(堆在这种情况下)是未知的.因此,我之前需要进行O(n)搜索,以便恢复索引,然后才能对其执行实际的减少键.
而且,我不确定操作所需的实际代码.我在这里使用D-Heap 作为我的优先级队列.伪代码会有所帮助,但我更喜欢Java中的一个例子,说明应该如何做.
每当我看到一个C"类"(通过访问将指针作为第一个参数的函数来使用的任何结构)时,我看到它们实现如下:
typedef struct
{
int member_a;
float member_b;
} CClass;
CClass* CClass_create();
void CClass_destroy(CClass *self);
void CClass_someFunction(CClass *self, ...);
...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它CClass_create始终malloc是内存并返回指向它的指针.
每当我看到newC++不必要地出现时,它似乎通常会让C++程序员疯狂,但这种做法在C中似乎是可以接受的.为什么堆分配的结构"类"如此常见?
为了找到未排序数组的中位数,我们可以在O(nlogn)时间内为n个元素创建一个最小堆,然后我们可以逐个提取n/2个元素来获得中值.但这种方法需要O(nlogn)时间.
我们可以在O(n)时间内通过某种方法做同样的事情吗?如果可以的话,请告诉或建议一些方法.