|
| ||||||||||||
| ||||||||||||
Динамическая память; классы Vector и StringBufferПеревод на русский © Сергей Миссан, 2000 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.
|
|
CITForum © 1997–2025