что означает размер виртуальной памяти сверху?

<p>я запускаю <code>top</code> для контроля производительности моего сервера, и 2 из моих процессов java показывают виртуальную память объемом до 800 мб-1 гб. это плохо?</p><p>что означает виртуальная память?</p><p>и, кстати, у меня есть своп 1 гб, и это показывает, 0% используется. так что я в замешательстве.</p><p>процесс java = 1 сервер tomcat + мой собственный java сервер демона = ubuntu 9.10 (karmic)</p>

<p>виртуальная память даже не обязательно является памятью. например, если процесс отображает в памяти большой файл, файл фактически сохраняется на диске, но он все еще занимает "адресное пространство" в процессе.</p><p>адресное пространство (т. е. виртуальная память в списке процессов) ничего не стоит; это нереально. что реально, так это столбец rss (res), который является резидентной памятью. вот сколько вашей реальной памяти занимает процесс.</p><p>но даже это не полный ответ. если процесс вызывает fork (), он разделяется на две части, и обе они первоначально совместно используют все свои rss. таким образом, даже если бы rss изначально был 1 гб, результатом после разветвления было бы два процесса, каждый с rss 1 гб, но вы все равно использовали бы только 1 гб памяти.</p><p>смущены еще? вот что вам действительно нужно знать: используйте команду <code>free</code> и проверьте результаты до и после запуска вашей программы (на <code>+/- buffers/cache</code> линия). эта разница в том, сколько <em>новой</em> памяти использовала ваша недавно запущенная программа.</p>

<p>с верхней (1) страницы справочника:</p><pre><code>o: virt -- virtual image (kb) the total amount of virtual memory used by the task. it includes all code, data and shared libraries plus pages that have been swapped out. virt = swap + res. </code></pre><p>где res означает резидентную память (используется физическая память).</p><p>на самом деле это не правильно (больше). когда он говорит "swap", это также включает файлы, которые программа отображает в свое адресное пространство, которое может или не может фактически потреблять реальное ram пока. эта память имеет файловую поддержку, но не на самом деле не поменяться.</p><p>virt также включает страницы, которые были выделены, но еще ни для чего не используются. любая страница в этом состоянии сопоставляется с нулевой страницей ядра (блестящая концепция - вам следует поискать ее), поэтому она отображается в virt, но фактически не потребляет никакой памяти.</p>

<p>я нашел это <a href="http://mugurel.sumanariu.ro/linux/the-difference-among-virt-res-and-shr-in-top-output/">объяснение мугурел суманариу</a> очень ясно:</p><blockquote> <p><code>virt</code> обозначает виртуальный размер процесса, который представляет собой сумму памяти, которую он фактически использует, памяти, которую он отобразил в себя (например, ram для видеокарты) x-сервер), файлы на диске, которые были сопоставлены с ним (наиболее часто это общие библиотеки), и память, используемая совместно с другими процессами. virt показывает, какой объем памяти программа может получить в настоящий момент.</p> <p><code>res</code> обозначает резидентный размер, который является точным представлением того, сколько фактической физической памяти потребляет процесс. (это также напрямую соответствует столбцу% mem.) это практически всегда будет меньше, чем размер virt, поскольку большинство программ зависят от библиотеки c.</p> <p><code>shr</code> указывает, какая часть размера virt на самом деле является разделяемой (память или библиотеки). в случае библиотек это не обязательно означает, что вся библиотека является резидентной. например, если программа использует только несколько функций в библиотеке, вся библиотека отображается и будет подсчитываться в virt и shr, но на самом деле только части библиотеки, содержащие используемые функции, будут фактически загружены и подсчитаны под res.</p> </blockquote>

<p>столбец virt в выводе ps/top практически не имеет значения для измерения использования памяти. не беспокойся об этом. <a href="https://serverfault.com/questions/122810/apache-heavy-load-virt-vs-res-memory">apache с высокой нагрузкой virt против res-памяти</a> </p><p> <a href="https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used">https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used</a> </p>

<p>столбец <code>virtual</code> в верхней части относится к суперпространству (пространству сверхпотребления) процесса, которое процесс может фактически не занять во время выполнения. есть еще один столбец <code>resident</code>, который указывает на фактическую физическую память/пространство, выделенное процессом, во время выполнения.</p><p>причину различий между ними можно понять из примера: если процесс использует определенную библиотеку, то размер библиотеки также поможет <code>virtual-size</code>. однако, поскольку будет использоваться только часть библиотеки (т.е. используются некоторые методы), так что это поможет в <code>resident-size</code>.</p><p>см. <a href="http://mugurel.sumanariu.ro/linux/the-difference-among-virt-res-and-shr-in-top-output/">подробнее</a> </p>

<p>linux поддерживает виртуальную память, то есть использует диск как расширение ram, так что эффективный размер используемой памяти соответственно увеличивается. ядро записывает содержимое неиспользуемого в данный момент блока памяти в жесткий диск, чтобы память можно было использовать для других целей. когда исходное содержимое снова необходимо, оно считывается обратно в память. все это полностью прозрачно для пользователя; программы, работающие под linux, видят только больший объем памяти доступны и не замечают, что их части время от времени находятся на диске. конечно, чтение и запись на жесткий диск медленнее (в тысячу раз медленнее), чем при использовании реальной памяти, поэтому программы не t работать так же быстро. часть жесткого диска, которая используется в качестве виртуальной памяти, называется пространством подкачки.</p><p>linux может использовать либо обычный файл в файловой системе, либо отдельный раздел для пространства подкачки. раздел подкачки работает быстрее, но легче изменить размер файла подкачки (нет необходимости перераспределять весь жесткий диск и, возможно, устанавливать все с нуля). когда вы знаете, сколько места подкачки вам нужно, вам следует перейти к разделу подкачки, но если вы не уверены, вы можете сначала использовать файл подкачки, некоторое время использовать систему, чтобы вы могли почувствовать, сколько вы поменяете нужно, а затем сделать раздел подкачки, когда вы уверены в его размере.</p><p>вы также должны знать, что linux позволяет использовать несколько разделов подкачки и/или файлов подкачки одновременно. это означает, что если вам иногда требуется необычный объем пространства подкачки, вы можете настроить дополнительный файл подкачки в такое время, вместо того, чтобы постоянно выделять всю сумму.</p><p>примечание по терминологии операционной системы: компьютерные науки обычно различают подкачку (запись всего процесса в пространство подкачки) и подкачку страниц (запись только частей фиксированного размера, обычно по несколько килобайт за раз). пейджинг обычно более эффективен, и это то, что делает linux, но традиционная терминология linux в любом случае говорит об обмене.</p><p>источник: <a href="http://www.faqs.org/docs/linux\_admin/x1752.html">http://www.faqs.org/docs/linux\_admin/x1752.html</a> </p>

<p>"virt" - это просто адресное пространство, res - это "реальная" память, но "shr" (= общая) сумма "res" - это часть res, которая используется совместно с другими процессами. поэтому для большинства процессов я считаю, что вычитая shr из res, вы получаете объем памяти, который действительно относится к этому конкретному процессу.</p>