Я профилировал свое веб-приложение локально на моем компьютере с помощью VisualVM. Я почти уверен, что у меня небольшая утечка памяти. Сделав снимок приложения, я выбрал объект, у которого было наибольшее количество экземпляров объектов, и просмотрел Allocation Call Tree , чтобы посмотреть, смогу ли я найти, какой класс (мой) способствовал «потенциальной утечке» .
Я нашел три своих класса в дереве и взглянул на методы, которые были точно определены.
Вот фрагмент кода (метода) из одного из моих сервлетов - этот метод получает имена атрибутов сеанса, которые я хочу сохранить в сеансе, и удаляет остальные.
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
stmt = conn.createStatement();
HttpSession session = req.getSession();
getExemptSessionAttributes(Customer_Number,rs,stmt,session);
}//try
catch (Exception e) { }
finally {
if (rs != null) {
try { rs.close(); } catch (SQLException e) { ; }
}
if (stmt != null) {
try { stmt.close(); } catch (SQLException e) { ; }
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { ; }
}
}//finally
}//post
public void getExemptSessionAttributes(int Customer_Number, ResultSet rs, Statement stmt, HttpSession session) {
try {
rs = stmt.executeQuery("Select Name from exemptsessionattributes");
String[] exemptAttributes = null;
int count = 0;
while(rs.next()) {
count++;
}
rs.beforeFirst();
exemptAttributes = new String[count];
count = 0;
while(rs.next()) {
exemptAttributes[count] = rs.getString(1);
count++;
}
session.setAttribute("ExemptSessionAttributes",exemptAttributes);
//garbage collect
exemptAttributes = null;
}//try
catch(Exception e) {}
}//end
//....
Единственной модификацией, которую я сделал до сих пор, начиная с профилирования моего веб-приложения, было добавление установки для массива объекта exemptAttributes [] равным нулю.
Мой вопрос -
Если массив String (или какой-либо объект) установлен в атрибуте сеанса, означает ли это, что ссылка на этот объект, если в коде не установлено значение NULL, все еще «ссылается» и не будет собирать мусор?