Динамическая память; классы Vector и StringBuffer

Перевод на русский © Сергей Миссан, 2000
Оригинал статьи опубликован на сайте Javable.com

Java Q&A

Я хочу динамически распределять память для любого типа. Также, когда я использую класс Vector, он иногда выдает OutOfMemoryError. Как мне справиться с этой ситуацией?

Еще одна проблема возникает, когда я хочу создать длинную строку последовательно добавляя маленькие строки. Использование оператора + для перекрывания класса String занимает слишком много времени. Как можно сделать подобную операцию быстрее?

Отвечая на ваш вопрос по-поводу динамической памяти, когда вы создаете объект используя new, это все-равно что malloc() в C/C++. То есть, он выделяет память при создании объекта, динамически.

Для того, чтобы решить вашу проблему с классом Vector и OutOfMemoryError, создайте нить следящую за общим объемом памяти и свободной памятью. Когда память закончится, освободите ссылки вызвав gc. fee как в этом примере:

Runtime rt = Runtime.getRuntime();
long total = rt.freeMemory();
long free = rt.freeMemory();
if(total-free < 5000000) { //if it is less than 1MB
//release refs to some objects here
//the systems that create cache will release
//LRU objects here
rt.gc();
}

Для решения проблемы со строками, используйте класс StringBuffer. String являеться немодифицируемым объектом (immutable), то есть вы не можете его менять. Каждое изменение будет создавать новый Object. StringBuffer, в свою очередь, значительно быстрее и может модифицироваться -- вы можете добавлять к нему строки не создавая новый объект. Например, так:

String initialString = "initial ";
StringBuffer sb = new StringBuffer(initialString);
String newString = "some thing new ";
//use append as many times as you want
sb.append(newString);
//and when you want to get String
System.err.println(sb.toString());

Об авторе

Random Walk Computing это наибольшая консалтинговая фирма в Нью Йорке, специализирующаяся на Java/CORBA решениях для предприятий. Известные своим выдающимся знанием Java, консультанты Random Walk публикуются и выступают на самых престижных форумах мира. Для связи с Random Walk используйте javaqa@javaworld.com.

Reprinted with permission from the March 2000 edition of JavaWorld magazine.
Copyright © ITworld.com, Inc., an IDG Communications company.
View the original article at: http://www.javaworld.com/javaworld/javaqa/1999-08/02-qa-short.html

Назад | Содержание