Я столкнулся с рядом ограничений, связанных с подготовленным оператором:
Среди предлагаемых решений я бы выбрал тот, который не уменьшает производительность запроса и уменьшает количество запросов. Это будет # 4 (партия нескольких запросов) из ссылки @Don или указание значений NULL для ненужных '?' знаки, предложенные В.Дужевым
в этой статье здесь объясняется, как GC работает на Java 7. В двух словах есть много разных сборщиков мусора. Обычно память хранится для процесса Java, и только некоторые GC выпускают ее в систему (по вашему запросу). Но память, используемая процессом Java, не будет расти бесконечно, так как существует верхний предел, определяемый опцией Xmx (обычно это 256 м, но я думаю, что это зависит от ОС / машины).
JVM в некоторых случаях освобождает память, но (по соображениям производительности) это не происходит, когда какая-либо память собирает мусор. Это также зависит от JVM, OS, сборщика мусора и т. Д. Вы можете наблюдать за потреблением памяти вашего приложения с помощью JConsole, VisualVM или другого профилировщика.
Также см. Этот отчет об ошибке , связанный с ошибкой
HotSpot JVM выводит память обратно в ОС, но делает это неохотно, так как изменение размера кучи дорого, и предполагается, что если вам понадобится эта куча, когда вам понадобится снова.
Вы можете сделать его более агрессивным, установив -XX:GCTimeRatio=19 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30
, что позволит ему тратить больше времени процессора на сбор и ограничение количества выделенной, но неиспользуемой памяти кучи после цикла GC.
Предполагая, что вы используете параллельный сборщик, вы также можете установить -XX:InitiatingHeapOccupancyPercent=N
с N на некоторое низкое значение, чтобы позволить GC запускать параллельные коллекции почти непрерывно, что будет потреблять еще больше циклов ЦП, но скорее сократит кучу. Этот в целом не является хорошей идеей, но на некоторых типах машин с большим количеством запасных ядер процессора, но с малой памятью, это может иметь смысл.
Если вы используете сборщик с целью определения времени паузы по умолчанию (CMS или G1) вы также можете уменьшить эту цель, чтобы уменьшить количество ограничений на сборщике, или вы можете переключить параллельный коллектор, чтобы определить приоритет по времени на паузе.
Дополнительно с Java Опция 9 -XX:-ShrinkHeapInSteps
может использоваться для более жесткого применения сокращения, вызванного двумя предыдущими вариантами. Релевантная ошибка OpenJDK .
Обратите внимание, что способность к усадке и поведение зависит от выбранного сборщика мусора. Например, G1 только получил возможность вернуть неиспользуемые куски в середине кучи с помощью jdk8u20.
Поэтому, если требуется сокращение кучи, оно должно быть проверено для конкретной версии JVM и GC.
GC Logging с PrintAdaptiveSizePolicy
также может обеспечить понимание, например когда JVM пытается использовать больше памяти для молодого поколения для достижения некоторых целей.
Также есть проект JEP , чтобы G1 возвращал назад память более охотно, но являлся черновиком неясно, когда и когда оно будет реализовано. Он также упоминает Shenandoah и VM OpenJ9, обладающие способностями.