У меня есть некоторый код обработки данных, который использует следующий рецепт:Как оценить объем памяти, оставшийся при вызове System.gc()?
- чтения в столько данных, сколько поместится в памяти (называют это «кусок»)
- выполнять обработку на куске
- Написать из обрабатываются кусок на диск
- Repeat
- ...
- Объединить все обработанные куски, чтобы получить окончательный ответ.
Этот последний этап наиболее эффективен, когда есть как можно меньше кусков, поэтому я хочу, чтобы первый этап считывал столько данных, сколько поместилось в память. Я могу сделать это, запросив Runtime.freeMemory()
.
Однако это означает, что мне нужно позвонить System.gc()
, или номер, возвращаемый Runtime.freeMemory()
, намного меньше объема памяти, которую я мог бы безопасно распределить.
Я слышал, что ряд органов власти заявили, что вызов System.gc()
явно является плохими идеями. Есть ли способ избежать этого?
Несомненно, это поможет, если у меня есть надежный способ измерения объема памяти, которую я выделяю, когда я иду. –
Даже тогда это не сработает, поскольку VM, возможно, уступила страницы, которые впоследствии выделяются другими процессами. Но эмпирическое правило в таких случаях заключается в том, что первое приближение, по крайней мере, предсказуемо. –