我经常和操作系统中的虚拟化概念混淆。 考虑到RAM作为物理内存,为什么我们需要虚拟内存来执行进程? 当外部硬盘的进程(程序)被带到主内存(物理内存)执行时,这个虚拟内存在哪里? 谁负责虚拟内存和虚拟内存的大小? 假设如果RAM的大小是4GB(即2 ^ 32-1地址空间),那么虚拟内存的大小是多less?
在我们的生产机器上运行一个简单的Java程序,我注意到这个程序吃了更多的10G virt。 我知道虚拟内存是不相关的,但至less我想明白为什么这是必要的。 public class Main { public static void main(String[] args) { System.out.println("Hello World!"); try { Thread.sleep(10000); } catch(InterruptedException e) { /* ignored */ } } } 下面是什么当我运行这个小程序时说的: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 18764 myuser 20 0 10.2g 20m 8128 S 1.7 0.1 0:00.05 java 有谁知道这是为什么发生? uname […]
我想创build一个程序来模拟Unix服务器上的内存不足(OOM)情况。 我创造了这个超级简单的记忆食器: #include <stdio.h> #include <stdlib.h> unsigned long long memory_to_eat = 1024 * 50000; size_t eaten_memory = 0; void *memory = NULL; int eat_kilobyte() { memory = realloc(memory, (eaten_memory * 1024) + 1024); if (memory == NULL) { // realloc failed here – we probably can't allocate more memory for whatever reason return 1; } […]
这个问题是为了填补关于这个问题的好的免费信息的真空。 我相信一个好的答案可以适合于一个大的答案,或者至less在几个答案中。 主要目标是为初学者提供足够的信息,以便他们可以自己学习手册,并能够理解与分页相关的基本操作系统概念。 build议的准则: 答案应该是初学者友好的: 具体,但可能简化的例子是非常重要的 所示概念的应用是受欢迎的 引用有用的资源是好的 欢迎使用操作系统使用分页function的小型离线 PAE和PSE的解释是受欢迎的 欢迎使用x86_64进行小型离线 相关的问题和为什么我认为他们不是骗局: x86页表如何工作? :标题与这个问题几乎是一样的,但是身体询问有关cr3和TLB的具体问题。 这个问题是这个问题的一个子集。 x86虚拟化是如何工作的 :body只要求来源。
我在Linux下运行的Java应用程序有问题。 当我启动应用程序,使用默认的最大堆大小(64mb),我看到使用顶部应用程序,240 MB的虚拟内存分配给应用程序。 这就造成了一些与计算机上的其他软件有关的问题,这是相对资源有限的。 据我所知,保留的虚拟内存不会被使用,因为一旦我们达到了堆的限制,就会抛出一个OutOfMemoryError。 我在Windows下运行相同的应用程序,我发现虚拟内存大小和堆大小是相似的。 有什么办法可以在Linux下configuration虚拟内存用于Java进程吗? 编辑1:问题不是堆。 问题是,如果我设置一个128M的堆,例如,仍然Linux分配210 MB的虚拟内存,这是不需要的,永远。** 编辑2:使用ulimit -v可以限制虚拟内存的数量。 如果大小设置在204 MB以下,那么应用程序将不会运行,即使它不需要204MB,只有64MB。 所以我想了解为什么java需要这么多的虚拟内存。 这可以改变吗? 编辑3:系统中还有其他几个正在运行的应用程序。 系统确实有一个虚拟内存限制。 (来自评论,重要的细节)