Java Sigar巨大的RAM使用率
我正在linux工作站服务器(dist.Mint)上使用Sigar库。这是我的代码:Java Sigar巨大的RAM使用率,java,ram,Java,Ram,我正在linux工作站服务器(dist.Mint)上使用Sigar库。这是我的代码: ConnectionUtils connection = new ConnectionUtils(); Sigar sigar = new Sigar(); String query = ""; connection.openConnection(); Mem mem; CpuPerc cpuperc; FileSystemUsage filesyste
ConnectionUtils connection = new ConnectionUtils();
Sigar sigar = new Sigar();
String query = "";
connection.openConnection();
Mem mem;
CpuPerc cpuperc;
FileSystemUsage filesystemusage;
long RAM;
long CPU;
long HDD;
while(true) {
mem = sigar.getMem();
cpuperc = sigar.getCpuPerc();
filesystemusage = sigar.getFileSystemUsage("/");
RAM = Math.round(mem.getUsedPercent());
CPU = Math.round((cpuperc.getCombined()*100));
HDD = Integer.valueOf((int) (filesystemusage.getUsePercent()*100));
query = "UPDATE ServerInfo SET RAM="+RAM+",CPU="+CPU+",HDD="+HDD+" WHERE ServerName=\"XgenVPS\"";
connection.sendQuery(query);
System.out.println("informacje sostały pomyśnie wysłane do bazy danych");
Thread.sleep(1000);
}
}
}
它在几个小时后增加了RAM的使用量,在一天崩溃后——程序停止了间隔,没有响应,但不会因为致命错误而停止。有人能帮我吗?我希望这个程序能在没有bug的情况下工作很多天
哦。这来自ConnectionUtils函数:
private Connection conn;
private String host = "localhost";
private String port = "3306";
private String database = "xgen-dashboard";
private String user = "root";
private String pass = "asdzxcasdzxc123";
public ConnectionUtils() {
}
public synchronized void openConnection(){
if(!isConnected()){
try{
conn = DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database+"?user="+user+"&password="+pass+"&useSSL=false");
} catch(SQLException e){
e.printStackTrace();
}
}
}
public synchronized void closeConnection(){
if(isConnected()){
try{
conn.close();
} catch(SQLException e){
e.printStackTrace();
}
}
}
public boolean isConnected() {
try{
if(conn == null) return false;
if(conn.isClosed()) return false;
} catch(SQLException e){
e.printStackTrace();
}
return true;
}
public ResultSet sendQuery(String query) {
try {
return conn.createStatement().executeQuery(query);
} catch (SQLException e) {
try {
conn.createStatement().executeUpdate(query);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
return null;
}
作为第一步,您可以使用
jmap-histopid
(应用程序的pid)进行查看。您从不关闭创建的语句。看看这个。那么,如何正确关闭这些语句呢?在程序关闭之前,这些语句是否仍在RAM中?您可以看看JDBC教程。您的内存占用在哪里,例如,您可以使用jmap
找到,如前所述。我们只能对此作出假设。首先找出内存消耗的原因。然后找到问题的解决方案。如果有必要的话,提出一个新问题。好的,我终于有时间回答了。我打开了一个jmap-histo。这是几秒钟后我得到的: