我正在尝试调查大型多线程服务器的内存使用情况.据mallinfo(),我得到arena=350M和fordblks=290M,这表明大部分空间实际上是浪费了里面malloc().该malloc_info()函数提供了一个很好的XML数据结构,应该是不言自明的.不过,有人可以向我解释
0特别吗?是所有其他人居住的主要竞技场吗?<size from=.../>分配了块,免费/可用或两者兼而有之?<system>元素是什么?内存分配使用mmap()/sbrk()?<aspace>元素是什么?有效内存?<aspace type="mprotect" .../>?只是一开始,我希望能够根据malloc()想法绘制应用程序分配的总内存,即分配但尚未释放的所有内容.
几周后,SWI-Prolog Java界面立即崩溃JNI_CreateJavaVM.好吧,在大多数机器上.它在我的一台机器上运行正常,它运行相同版本的Ubuntu和openjdk ......我把它剥离到这个小程序:
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
static JavaVM *jvm;
int
main(int argc, char **argv)
{ JavaVMInitArgs vm_args = {0};
JNIEnv *env;
JavaVMOption opt[8] = {0};
int optn = 0;
int r;
opt[optn++].optionString = "-Djava.class.path=" "jpl.jar:.";
opt[optn++].optionString = "-Xrs";
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = optn;
vm_args.options = opt;
r = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
fprintf(stderr, "Got %d\n", r);
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
这是使用编译的
JVM=/usr/lib/jvm/java-8-oracle
#JVM=/usr/lib/jvm/java-1.8.0-openjdk-amd64
gcc -I$JVM/include \
-I$JVM/include/linux \
-L$JVM/jre/lib/amd64/server \
-L$JVM/jre/lib/amd64 \
-g -Wall -o t t.c …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 libffi 在 macos (10.11) 上访问 stat()。这是用于 SWI-Prolog 的新的基于 FFI 的外部接口的一部分。该接口解析<sys/stat.h>头以获取函数原型和struct stat类型。但是,我得到了虚假的值。如果我编译下面的代码并mystat从生成的.dylib.
#include <sys/stat.h>
int
mystat(const char *name, struct stat *buf)
{ return stat(name, buf);
}
Run Code Online (Sandbox Code Playgroud)
我怀疑我stat从dlsym(). /usr/lib/libc.dylib和都试过了/usr/lib/libSystem.B.dylib。这给出了相同的结果。如果我nm在上面的 dylib 上运行,我会得到
U _stat$INODE64. dlsym不适用于stat$INODE64. 查看 libc.dylib 我们得到
534_> nm /usr/lib/libc.dylib | grep stat
0000000000001ac5 T R8289209$_pthread_attr_setdetachstate
0000000000001af7 T R8289209$_stat
U _pthread_attr_setdetachstate
U _stat
Run Code Online (Sandbox Code Playgroud)
两者有什么关系?任何人都知道可能会发生什么?
我发现了一种似乎完全没问题的特定使用模式,并且以前没有编译器抱怨过。现在它对 gcc-11 发出警告:下面是一个接近最小的示例。另存为t.c并使用 进行编译gcc-11 -O2 -Wall -c t.c。
#include <stdlib.h>\n#include <string.h>\n\nextern void f(const char *s);\n\nvoid\nt(int len, char *d)\n{ char tmp[500];\n char *s, *o;\n int i;\n\n if ( len <= sizeof(tmp) )\n s = tmp;\n else if ( !(s=malloc(len)) )\n return;\n\n for(o=s,i=0; i < len; i++)\n *o++ = d[i]+1;\n\n f(s);\n// i = strlen(s);\n if ( s != tmp )\n free(s);\n}\n\nRun Code Online (Sandbox Code Playgroud)\n编译结果为:
\ngcc-11 -O2 -Wall -c t.c\nt.c: In function \xe2\x80\x98t\xe2\x80\x99:\nt.c:20:3: warning: \xe2\x80\x98s\xe2\x80\x99 may be used …Run Code Online (Sandbox Code Playgroud) 我正在尝试重新定义 cmake 中的函数。但是,只有这个函数的一些签名。如果我不认识签名,我只想用所有原始参数调用原始签名。这工作正常,除非函数 os 以空字符串 ( "") 作为参数调用。这个问题可以这样说明:
function(y)
list(LENGTH ARGN len)
message("y got ${len} elements: ${ARGN}")
endfunction()
function(x)
list(LENGTH ARGN len)
message("x got ${len} elements: ${ARGN}")
y(${ARGN})
endfunction()
x(a b "")
x(a "" c)
Run Code Online (Sandbox Code Playgroud)
将以上内容保存到x.cmake并运行cmake -P x.cmake,打印
> cmake -P x.cmake
x got 3 elements: a;b;
y got 2 elements: a;b
x got 3 elements: a;;c
y got 2 elements: a;c
Run Code Online (Sandbox Code Playgroud)
即,y没有得到空字符串,并且我重新定义的函数停止工作。任何关于如何传递所有参数(包括空字符串)的线索?
真实的用例是尝试重新定义file以更改安装。您的替代方案似乎不适用于此:
function(file)
message("Calling file(${ARGN})")
_file("${ARGN}")
endfunction() …Run Code Online (Sandbox Code Playgroud)