centos でアプリケーションのメモリ テストを行っています。私たちが気付いたのは、JVM が余分なスペースを必要とするためにメモリが増え続けていることを top が示していることです。さらに、アプリケーション コードの最後にこの数行があります。これは、使用メモリとヒープ サイズも増加し続けていることを示しており、最初は数十メガバイトでしたが、現在は数百メガバイトの値になっています。
Runtime runtime = Runtime.getRuntime();
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("\n\nUsed memory is bytes: " + memory);
//Print the jvm heap size.
long heapSize = runtime.totalMemory();
System.out.println("\n\nHeap Size = " + heapSize);
一方、このコマンド /usr/java/jdk1.7.0_03/bin/jstat -gcutil 22805 を使用すると、しばらくすると S0 と S1 の両方がゼロにクリーンアップされていることがわかります。この解釈は、メモリの問題を示していますか、それとも Java の通常の動作ですか?
以下は、コードのスケルトンです。ステートメント6から、whileの大きなループがあり、その中でさらに多くのクエリを取得しましたが、これが原因でしょうか?
try{
try{ //inner try for each complete message read from the socket connection
//lots of inner queries run based on some logics of if else etc
//sample query of opening and closing both statement and resultsets.
Statement stmt1 = null;
stmt1 = dbconn.createStatement();
String selectQuery1 = "Select query";
ResultSet rs1 = stmt1 .executeQuery(selectQuery1);
while(rs1.next()) {
//process here
}
try{
if (rs1 != null ){
rs1.close();
}
if (stmt1!= null ){
stmt1.close()
}
}
catch(SQLException ex){
ex.printStackTrace(System.out);
}
Statement stmt6 = null;
stmt6 = dbconn.createStatement();
String selectQuery3 = "Select query....";
ResultSet rs3 = stmt6.executeQuery(selectQuery3);
while(rs3.next()) {
var1= rs3.getInt("value1");
var2 = rs3.getString("value2");
if(var2.equals("POINT"){
Statement stmt7 = null;
stmt7 = dbconn.createStatement();
String selectQuery4= "select query ... ";
ResultSet rs4 = stmt7.executeQuery(selectQuery4);
if(rs4.next()){
Statement stmt8 = null;
stmt8 = dbconn.createStatement();
if(lastID>0){
String updateQuery2 = "update query .......";
count = stmt8.executeUpdate(updateQuery2);
String insertQuery2 = "insert query .....";
count = stmt8.executeUpdate(insertQuery2);
String selectLast1 = "SELECT last_insert_id()";
ResultSet rs5 = stmt8.executeQuery(selectLast1);
if(rs5.next()){
gFAlertIDOut=rs5.getInt(1);
gFOutID = lGFID;
}
String insertQuery3 = "insert query .....";
count = stmt8.executeUpdate(insertQuery3);
String selectLast2 = "SELECT last_insert_id()";
rs5 = stmt8.executeQuery(selectLast2);
if(rs5.next()){
gFAlertIDIn=rs5.getInt(1);
gFIntID = lGFID;
}
try{
if (rs5 != null ){
rs5.close();
}
if (stmt8!= null ){
stmt8.close();
}
}
catch(SQLException ex){
ex.printStackTrace(System.out);
}
}
else{
}
}
try{
if (rs4 != null ){
rs4.close();
}
if (stmt7!= null ){
stmt7.close();
}
}
catch(SQLException ex){
ex.printStackTrace(System.out);
}
}
else{
Statement stmt7 = null;
stmt7 = dbconn.createStatement();
String selectQuery4= "select query ... ";
ResultSet rs4 = stmt7.executeQuery(selectQuery4);
if(rs4.next()){
}
try{
if (rs4 != null ){
rs4.close();
}
if (stmt7!= null ){
stmt7.close();
}
}
catch(SQLException ex){
ex.printStackTrace(System.out);
}
}
}
try{
if (rs3 != null ){
rs3.close();
}
if (stmt6!= null ){
stmt6.close();
}
}
catch(SQLException ex){
ex.printStackTrace(System.out);
}
dbconn.commit();
}
catch (SQLException ex) {
try {
dbconn.rollback();
}
catch (Exception rollback){
rollback.printStackTrace(System.out);
}
}
catch (Exception e){
try{
dbconn.rollback();
}
catch (Exception rollback) {
rollback.printStackTrace(System.out);
}
}
}
catch (SocketTimeoutException ex){
ex.printStackTrace();
}
catch (IOException ex) {
ex.printStackTrace();
}
catch (Exception ex){
ex.printStackTrace(System.out);
}
finally{
try {
if ( dbconn != null ){
dbconn.close();
}
}
catch(SQLException ex){
ex.printStackTrace();
}
try{
if ( writer1 != null ){
writer1.close();
}
}
catch(IOException ex){
ex.printStackTrace(System.out);
}
}