在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
我正在编写一个应用程序,需要大量内存用于缓存目的,正如我在此描述的那样.现在我正在玩一些malloc/new结构来弄清楚我是如何实现它的.我做了一个奇怪的观察:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
while(1) {
char *foo = (char*)malloc(1024);// new char[1024];
if(foo == NULL) {
printf("Couldn't alloc\n");
fflush(stdout);
return 0;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么永远不会达到printf?如果我的系统运行的内存,malloc的据说返回NULL,因为它是解释在这里.但我总是收到SIGKILL(我正在使用linux ......).
我正在使用512GB RAM(由几个AMD Opteron 6212 CPU寻址)的单台机器上工作.目前大约有300GB RAM免费.通过运行运行大型Java计算
java path/to/myApp -Xms280g -Xmx280g > output.txt
Run Code Online (Sandbox Code Playgroud)
应该使Java立即保留280GB,如果失败则会出错.奇怪的是,没有发生错误,但top只显示30.4GB的内存使用量,但它不会崩溃.怎么会发生这种情况?如果无法分配初始堆大小,是不是java应该崩溃?
实际上,一旦30.4GB已满,我就会在达到280GB之前获得OutOfMemory/Java堆空间/ GC开销限制错误.使用250GB或300GB运行会产生类似的30.3GB~30.4GB限制.我在Gentoo Linux上运行带有OpenJDK运行时环境(IcedTea6)的OpenJDK 64位服务器VM,并且有足够的可用RAM(超过300GB).