Что быстрее между прямой памятью и памятью кучи

Java задняя часть Tomcat NLP
Что быстрее между прямой памятью и памятью кучи

предисловие

Большую часть времени прямую память также называют памятью вне кучи.С момента появления NIO в JDK использование прямой памяти становится все более и более распространенным. Память вне кучи можно выделять с помощью собственных методов и управлять ею с помощью объектов DirectByteBuffer.

Прямая память не принадлежит куче Java, поэтому она не ограничена размером кучи, но ограничена размером физической памяти.

настроить

Максимально доступную прямую память можно задать с помощью параметра -XX:MaxDirectMemorySize.Если он не задан при запуске, по умолчанию используется максимальный размер памяти кучи, который совпадает с параметром -Xmx. То есть, если максимальный объем памяти кучи равен 1 ГБ, то и прямая память по умолчанию также равна 1 ГБ, поэтому максимальный размер памяти, необходимый для JVM, составляет 2 ГБ. Сборщик мусора запускается, когда прямая память достигает максимального предела, и возникает ошибка OutOfMemoryError, если сбор не удается.

Время выделения памяти

Среда — JDK9, и два типа выделения памяти занимают следующее время: запустите его дважды, чтобы разогреть. Видно, что прямое выделение памяти занимает больше времени, тогда как операции выделения памяти в куче занимают в несколько раз меньше времени.

public static void directMemoryAllocate() {
		long tsStart = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			ByteBuffer buffer = ByteBuffer.allocateDirect(400);

		}
		System.out.println("direct memory allocate: " + (System.currentTimeMillis() - tsStart) + " ms");
		tsStart = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			ByteBuffer buffer = ByteBuffer.allocate(400);
		}
		System.out.println("heap memory allocate: " + (System.currentTimeMillis() - tsStart) + " ms");
	}
direct memory allocate: 149 ms
heap memory allocate: 41 ms
direct memory allocate: 122 ms
heap memory allocate: 31 ms

Операции чтения и записи требуют времени

Среда - JDK9, и операции чтения и записи двух типов памяти занимают следующее время.Он также запускается дважды для прогрева, и видно, что скорость операций прямого чтения и записи памяти относительно выше.

public static void memoryRW() {
		ByteBuffer buffer = ByteBuffer.allocateDirect(400);
		ByteBuffer buffer2 = ByteBuffer.allocate(400);
		long tsStart = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			for (int j = 0; j < 100; j++) {
				buffer.putInt(j);
			}
			buffer.flip();
			for (byte j = 0; j < 100; j++) {
				buffer.getInt();
			}
			buffer.clear();
		}
		System.out.println("direct memory rw: " + (System.currentTimeMillis() - tsStart) + " ms");

		tsStart = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			for (int j = 0; j < 100; j++) {
				buffer2.putInt(j);
			}
			buffer2.flip();
			for (byte j = 0; j < 100; j++) {
				buffer2.getInt();
			}
			buffer2.clear();
		}
		System.out.println("heap memory rw: " + (System.currentTimeMillis() - tsStart) + " ms");
	}
direct memory rw: 39 ms
heap memory rw: 34 ms
direct memory rw: 23 ms
heap memory rw: 46 ms

Суммировать

Теоретически скорость доступа к механизму прямой памяти выше, но нельзя условно сказать, что прямая память быстрее, кроме того, прямая память медленнее в операции выделения памяти. Прямая память больше подходит для сценариев с небольшим количеством запросов к памяти, но частыми операциями чтения и записи.

------------- Рекомендуем прочитать ------------

Резюме моей статьи за 2017 год — машинное обучение

Краткое изложение моих статей за 2017 год — Java и промежуточное ПО

Резюме моих статей 2017 года — глубокое обучение

Краткое изложение моих статей за 2017 год — исходный код JDK

Резюме моей статьи за 2017 год — обработка естественного языка

Резюме моих статей 2017 года — Java Concurrency


Поговори со мной, задай мне вопросы:

这里写图片描述

Меню официальной учетной записи было разделено на «Сводка для чтения», «Распределенное», «Машинное обучение», «Глубокое обучение», «НЛП», «Глубина Java», «Ядро параллелизма Java», «Исходный код JDK», "Tomcat Core" "Подождите, может быть, есть тот, который соответствует вашему аппетиту.

Зачем писать «Анализ проектирования ядра Tomcat»

Добро пожаловать, чтобы следовать:

这里写图片描述