java 进程内存分配 java 进程是怎样在Linux服务器上进行内存分配的
zhqqqq 人气:0众所周知,Java进程在启动的时候我们可以通过 -Xms 和-Xmx来设置内存的上限和下限。直到我发现使用top命令监控的Java进程在-Xms设置4g的情况下占用的内存并不是4g,这就产生了一个疑问Linux服务器的内存到底是如何进行分配的。
于是乎,我查阅了一些知乎,课程以及Linux相关的书籍。这里分享并记录的一下相关的知识。
在Linux上运行的进程不仅限于Java。都有一个概念,逻辑内存(Logic Memory),而物理机真是持有的内存,我们称为 物理内存(Physic Memory)。
进程在开始运行时并不会直接分配物理内存,进程只是傻乎乎的以为自己持有了内存,也就是逻辑内存。当程序运行需要内存分配的时候,Linux服务器会以页的(Page)至小4k的方式分配,并一对一映射物理内存和逻辑内存的关系,看到了吗这里其实用了代理的思想是得内存的分配进行了解耦。
这样做的好处是什么呢? 1进程之间相互隔离 2进程自己认为占有了一段独立连续的内存 3可以申请比物理内存更大的内存空间。
第三点怎么理解呢?其实Linux在这里设计了一种机制叫Swap 就是在进程分配的内存空间超过物理内存的时候,如果各个进程运行所占的内存真的有这么多,超过了物理内存就会触发Swap,把不持有CPU的部分进程的内存数据和磁盘进行io数据交换。因为CPU一时间不可能超过所有占有的内存,所以这种优化就造就了能多申请一些内存,大概是原来内存的2-3倍,这就很可观了,毕竟内存是非常贵的。
Swap虽然好,也带来了一些问题。
比如频繁的Swap,这会导致内存操作转化为磁盘的的IO操作,拖慢应用进程的运行速度。所以说Swap在我的理解里属于可以应急不使进程崩溃,适当使用可以减少成本,过分了不当人的使用就会被反噬的机制。
当然如果太不当人,进程还是会崩溃了,Swap是一个类似Buffer的机制,有大小的。超过设置的上限,Kernel内核就会触发OOM Killer,杀死一部分进程腾空间。
加载全部内容