Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2013, 12:13   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию Освобождение памяти

Есть код что то в роде этого
Код:
class MyClass
{
    int array[];

    void f()
    {
        array = new int[10000];
    }
}
В ходе выполнения программы метод f может вызыватся несколько раз.
Есть подозрения что при каждом новым вызовом f память от пред идущих вызовов не освобождается. Так ли это?
Как я пришел к такому выводу? -После многочисленных вызовов метода f, программа падает.
SAMOUCHKA вне форума Ответить с цитированием
Старый 05.11.2013, 12:24   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Вообще в Java очистка памяти происходит автоматически.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 27.11.2013, 21:59   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Вообще в Java очистка памяти происходит автоматически.
Я знаю. Тем не менее после нескольких вызовов метода f приложение падает.
А вот когда массив array объявлен внутри метода f , все работает нормально.

Я забыл сказать это тестировалось на платформе Android 2.3.6. Но думаю это роли не играет, ибо как написано "принцип java -один код на разных устройствах", что то в этом роде.

Скажите -есть ли возможность принудительно освободить память? Что бы самому контролировать процесс? Я привык быть хозяином этого процесса, как в С++, а не ждать пока машина java сделает это за меня.
SAMOUCHKA вне форума Ответить с цитированием
Старый 27.11.2013, 23:54   #4
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Если значение переменной (ссылка) не покидает метода (проверка идет на этапе JIT компиляции), то она попадает в скоп сгенерированной функции и мгновенно уничтожается по выходу из функции.

Что касаемо "нескольких" вызовов - тут вы преувеличили, я думаю речь идет о нескольких тысячах вызовов. Еще меня гложат сомнения что вы каждый раз вызываете метод f() над новым объектом, не обнуляя ссылки на старые.

Основное, даже единственное, по настоящему работающее решение - оптимизировать алгоритм. Еще можно звать gc() почаще, но это уже не дает 100% гарантии.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.11.2013, 00:27   #5
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Еще два вопроса
1
Код:
// Объявляем ссылку
int array[];

// Выделяем память
array = new int[10000];

// Присваиваем ссылке null  
array = null;
Освободится ли память в последней строчке кода?

2
Можно ли узнать сколько программе выделяется памяти, в определенном месте?
SAMOUCHKA вне форума Ответить с цитированием
Старый 28.11.2013, 17:35   #6
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Код:
package javaapplication15;

public class JavaApplication15 {
   
    int array[];

    public void f()
    {
        array = new int[10000];
    }
    
    public static void main(String[] args) {
        JavaApplication15 obj = new JavaApplication15();
        for(int i = 0; i < 10000000; i++){
            obj.f();
        }
    }
}
результат:
Цитата:
run:
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 23 секунды)
скорее всего у вас все же менее 10 млн вызовов. Поэтому я предпочел бы увидеть полный вариант кода... где то, что то вы упускаете.
BleStaR вне форума Ответить с цитированием
Старый 29.11.2013, 11:46   #7
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Да код не совсем точный, там массив десятки мегобайт.
Но я все же хотел бы получить ответы на мои вопросы.
SAMOUCHKA вне форума Ответить с цитированием
Старый 26.01.2014, 21:24   #8
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
Еще два вопроса
1
Код:
// Объявляем ссылку
int array[];

// Выделяем память
array = new int[10000];

// Присваиваем ссылке null  
array = null;
Освободится ли память в последней строчке кода?
в С/С++ это как то яснее, я сам этим управляю


2
Можно ли узнать сколько программе выделяется памяти, в определенном месте?
или так
Код:
// после выше написаного
array = new int[234];
ранее выделенная память освободится?

Последний раз редактировалось SAMOUCHKA; 26.01.2014 в 21:26.
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
освобождение памяти Homa_1983 Общие вопросы C/C++ 7 31.08.2013 14:36
Освобождение памяти millepetrozza Общие вопросы C/C++ 4 27.10.2012 15:13
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36