对于我的java程序,我的两个静态方法(实际上只是函数)是否导致内存泄漏

对于我的java程序,我的两个静态方法(实际上只是函数)是否导致内存泄漏,java,memory,Java,Memory,我的java程序永远运行(有意);main在从服务器读取JSON数据和在嵌入式h2数据库中进行大量内部处理方面做了大量工作 我在main之外定义了两个静态函数来完成大部分工作:getUrl(带输入参数的perfoms-HTTP-GET)和postrl(带参数执行httppost)。两者都只是从本地主机服务器请求HTTP数据,然后向调用者返回一个JsonNode对象(来自jackson json类),while(true)将数据从该对象处理到h2中 几天后,java进程神秘地被“杀死”;研究表明,

我的java程序永远运行(有意);main在从服务器读取JSON数据和在嵌入式h2数据库中进行大量内部处理方面做了大量工作

我在main之外定义了两个静态函数来完成大部分工作:getUrl(带输入参数的perfoms-HTTP-GET)和postrl(带参数执行httppost)。两者都只是从本地主机服务器请求HTTP数据,然后向调用者返回一个JsonNode对象(来自jackson json类),while(true)将数据从该对象处理到h2中

几天后,java进程神秘地被“杀死”;研究表明,OOM最有可能是罪魁祸首。我在最后尝试使用System.gc()(正确),但并没有帮助。这是postrl(getUrl几乎相同,postrl有2个参数输入,getUrl只需要1个)

这两个函数每秒被调用数百次。我可以在HTOP程序中看到RES字段每分钟左右都在增长。我根本不想把任何内存/对象带到每个交互中,虽然(是的),我想把它全部扔掉,但是System.gc()似乎没有帮助


这是导致我的问题的原因之一,还是其他原因?

Java将使用任何可用内存进行垃圾收集:

正如您所描述的,您有一个循环,它无休止地做一些事情,并且经常这样做,这意味着您一直在分配对象,例如,
ObjectMapper
和许多其他对象


无需调用
System.gc()
,因为垃圾收集器通常现在总是在后台运行,并且被调整为在收集发生时收集,以减少程序被拖慢的可能性。

简短回答。你看起来很好

长答案您必须学会使用内存分析工具lice
MAT

您可以将
JVM
配置为在内存转储因OOM而崩溃时保存内存转储。 当您得到一个时,将其加载到
MAT
中,并分析对象的数量和大小。它还可以向您显示导致对象泄漏的引用链


PS:
System.gc()
永远不会解决此类问题。不建议调用它。

分析会话的结果如何?评测将是获得有意义答案的唯一途径!旁白:
ObjectMapper
实例的构建成本非常高。创建一个静态的,并在所有
readValue
调用中重复使用它。好的,是的,感谢关于ObjectMapper的建议。我把它移出了那些函数,在main之外的类中将它声明为“publicstaticobjectmapper mapper=newobjectmapper();”,并调整了我的2个函数以使用它,而不是创建一个新函数。我也对主while(true)循环中的许多while/for循环中的许多变量做了同样的事情(但都在main中声明,而不是在类中声明)。泄漏的速度似乎减慢了很多。我已经安装了垫子,我会开始尝试。谢谢大家的建议。我没有设置和Xmx/Xms,不过我现在运行它,两个值都是100M,等待它崩溃。HTOP显示,它开始时的分辨率约为87K。现在的分辨率为113M,但由于某种原因,它仍然没有坠毁。每当它在我身上发出刺耳的声音时,我都会将hprof文件(也是以(-XX:+heapdumponAutofmemoryError)加载到MAT中,以查看发生了什么。此外,我还取出了System.gc().谢谢allok-所以我设置了我的程序以20M作为Xms和Xmx运行。它最终打开了,我在MAT中打开了我的hprof文件。无论我告诉它以何种方式显示内存罪犯,它都会给出MVStore,几乎占MAT给我的饼图的80%。org.h2.MVStore.MVStore。我从不直接使用那个类。我只使用PrepareStatement,resultset、语句和查询。我总是在完成后关闭它们,我会检查它们。H2错误?
  static JsonNode postUrl(String requestType, String postData) throws Exception {
  //use HTTP POST to API and return JSON data
    String output="";
    try {
      URL obj = new URL(post + requestType);
      HttpURLConnection con = (HttpURLConnection) obj.openConnection();
      con.setRequestMethod("POST");
      String urlParameters = urlParmPrefix + requestType + postData;
      con.setDoOutput(true);
      DataOutputStream wr = new DataOutputStream(con.getOutputStream());
      wr.writeBytes(urlParameters);
      wr.flush();
      wr.close();
      BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
      String inputLine;
      StringBuilder response = new StringBuilder();
      while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
      }
      in.close();
      output = response.toString();
      } catch (Exception postUrlFUNCTION) {
        System.out.println("Function postUrl failed for: " + postData);
        postUrlFUNCTION.printStackTrace(System.out);
      }
    if (arg.equals("debug")) System.out.println(output);
      ObjectMapper mapper = new ObjectMapper();
      return (JsonNode)mapper.readValue(output, JsonNode.class);
  }