Ошибка Java: ошибка (невозможно выделить память) с кодом 12 - PullRequest
0 голосов
/ 10 мая 2019

Я написал программу для вызова через 24 часа в сутки. И у меня есть 350 работающих устройств на сервере. Мне нужно обновлять отчет об устройствах автоматически каждый день.

@POST
@Path("/UpdateDevicesStats")
public static void updateAllLiveDevicesStats(){

long period = 1*24*60*60*1000;
long delay = 0;

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        try {
            ArrayList<Device> devices = DeviceBuilder.getCurrentLiveDevices();
            try {
                for(int i=0;i<devices.size();i++){
                    System.out.println("Updating Device = "+devices.get(i).getId());

                    // This below line is custom code line.
                    // This is not any in-built library. 
                    SummaryBuilder.updateDBStats(devices.get(i).getId());


                    Thread.sleep(1*60*1000);
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}, delay, period);

}

Когда я запускаю этот кусок кода. Это идет очень хорошо в течение 4-5 часов, но после этого показывает мне следующее:

failed: error='Cannot allocate memory' (errno=12)

There is insufficient memory for the Java Runtime Environment to continue. Native memory allocation (mmap) failed to map 12288 bytes for committing reserved memory.

ignoring option PermSize=500m; support was removed in 8.0

ignoring option MaxPermSize=256m; support was removed in 8.0

Setting property 'maxSpareThreads' to '75' did not find a matching property.

Кто-нибудь знает какой-нибудь другой лучший подход?

1 Ответ

0 голосов
/ 24 мая 2019

Я решил эту проблему с помощью Runtime.getRuntime().gc();, поставив после обновления статистики и после Thread.sleep();, а также другие операторы after после утечки памяти.Теперь это не получает никакой ошибки кучи Java.Спасибо @JoopEggen, @ JavaJd.

...