Когда `GC` будет запущен, когда 'OutOfMemoryException' пойман? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть пакет Java, который соединяется с базой данных и получает некоторые данные.В некоторых редких случаях я получаю исключение кучи памяти, поскольку размер данных выборочного запроса превышает пространство кучи Java.Увеличение пространства кучи Java - это не то, о чем может подумать бизнес.

Другой вариант - перехватить исключение и продолжить выполнение, остановив выполнение.(Я знаю, что ловить OOME не очень хорошая идея, но здесь меня затрагивают только локальные переменные).Мой код ниже:

private boolean stepCollectCustomerData() {
     try {          
          boolean biResult = generateMetricCSV(); 
     } catch (OutOfMemoryError e) {         
        log.error("OutOfMemoryError while collecting data ");            
        log.error(e.getMessage());      
        return false; 
     }
        return true;
    }

private boolean generateMetricCSV(){

        // Executing the PAC & BI cluster SQL queries.
        try (Connection connection = DriverManager.getConnection("connectionURL", "username", "password")) {

            connection.setAutoCommit(false);
            for (RedshiftQueryDefinition redshiftQueryDefinition: redshiftQueryDefinitions){
                File csvFile = new File(dsarConfig.getDsarHomeDirectory() + dsarEntryId, redshiftQueryDefinition.getCsvFileName());
                log.info("Running the query for metric: " + redshiftQueryDefinition.getMetricName());
                try( PreparedStatement preparedStatement = createPreparedStatement(connection,
                        redshiftQueryDefinition.getSqlQuery(), redshiftQueryDefinition.getArgumentsList());
                     ResultSet resultSet = preparedStatement.executeQuery();
                     CSVWriter writer = new CSVWriter(new FileWriter(csvFile));) {

                    if (resultSet.next()) {
                        resultSet.beforeFirst();
                        log.info("Writing the data to CSV file.");
                        writer.writeAll(resultSet, true);
                        log.info("Metric written to csv file:  " + csvFile.getAbsolutePath());
                        filesToZip.put(redshiftQueryDefinition.getCsvFileName(), csvFile);
                    } else {
                        log.info("There is no data for the metric " + redshiftQueryDefinition.getCsvFileName());
                    }
                } catch (SQLException | IOException e) {
                    log.error("Exception while generating the CSV file: " + e);
                    e.printStackTrace();
                    return false;
                }
            }
        }  catch (SQLException e){
            log.error("Exception while creating connection to the Redshift cluster: " + e);
            return false;
        }
        return true;
    }

Мы получаем исключение в строке "ResultSet resultSet = preparedStatement.executeQuery()" в более позднем методе, и я ловлю это исключение в родительском методе.Теперь мне нужно убедиться, что в первом методе обнаружено исключение: GC уже активировал и очистил память локальных переменных?(например, переменная соединения и результирующего набора). Если нет, когда это произойдет?

Меня беспокоит пространство кучи Java, потому что это непрерывный поток, и мне нужно продолжать извлекать данные для других пользователей..

Код, который я предоставил, предназначен только для объяснения основной проблемы и потока и любезно игнорирует синтаксис и т. Д., Я использую JDK8

Заранее спасибо.

...