我有一个运行Solaris 10的服务器,它报告70+ GiB空闲内存。我试图在64位模式下使用Java 1.7.0_80启动Tomcat 7.0.68。
服务器声称它无法分配717 MiB的内存。每次尝试时,我都会得到一个hs_err_pidxxx.log文件。它提出如下建议:
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 717225984 bytes for committ
我尝试编译QxOrm源码提供的demo,编译时遇到这个报错
cc1plus.exe: out of memory allocating 65536 bytes
诡异的是,每次报错的问题都不一样,而且经过多次编译后,居然成功了。 这是什么原因,我在网上找了很多相关问题,没有跟我这个现象一致的,我该怎么解决这个问题呢?
char *p = (char*) mmap(...);
....; /* check if p is not -1 */
a = *p;
在运行最后一条语句时,发生页错误。内核中的错误处理程序将在物理内存中分配一个页面,并将4K字节从文件复制到该页面中,然后修改页面条目。读取*p的指令将再次执行,这次成功。
但是错误处理程序如何知道与页面相关联的文件名和路径。文件名(或fd)存储在哪里?和文件中的偏移量。
如果进程的数据段中的一个页面被换出(我猜是换到一个交换文件中),该怎么办?当页面稍后需要换入时,内核如何知道从何处进行复制?
我对一些非常简单的事情感到非常沮丧(或者说我想是这样),所以在这件事上的帮助是非常感谢的。(对不起,如果这件事已经被回答了,我还没能在别的地方找到它,这就是为什么我要问……)因此,为了测试目的,我编写了以下非常简单的程序。
class myclass{
int x[99999];
public:
myclass(){}
};
int main(){
myclass *x = new myclass;
delete x;
}
在main的第一行中使用了一个断点后,我很容易(使用visual studio 2010和windows资源监视器)来实现:在调用了del
我有一个Jetty服务器,用于我正在开发的应用程序的websocket连接。唯一的问题是Jetty消耗了太多的虚拟内存(!2.5 of的虚拟内存)和大约650RES。
我的问题是,如上所述,大多数内存(大约12 of )不是堆大小,因此分析它并理解发生了什么变得更加困难。
关于如何理解12 Do的消耗以及如何找出内存泄漏或服务器的任何其他问题,您有什么建议吗?
我想证明我所说的虚拟内存是什么意思(因为我的理解可能是错误的)。当我运行top时,虚拟内存是"VIRT“。下面是我得到的结果:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIM