从Java运行外部命令时处理泄漏

时间:2018-12-12 07:12:03

标签: java handle

当我尝试执行外部进程时,我注意到我的Java程序存在句柄泄漏。下面提供了我的示例代码。你能指导我做错什么吗?

我正在Windows 10 OS上使用Open JDK 10运行此程序。有什么办法可以减少手柄?

2018-12-12 12:42:30,321 ERROR o.a.j.p.h.p.Proxy: [46349] ...
2018-12-12 12:42:30,321 ERROR o.a.j.p.h.p.Proxy: [46349]  Problem with keystore
java.io.IOException:   >> keytool error: java.lang.RuntimeException: java.io.IOException: DNSName components must begin with a letter <<
Command failed, code: 1
'keytool -genkeypair -alias 4o8rhl3t1a.execute-api.ap-southeast-1.amazonaws.com -dname "cn=4o8rhl3t1a.execute-api.ap-southeast-1.amazonaws.com, o=JMeter Proxy (TEMPORARY TRUST ONLY)" -keyalg RSA -keystore proxyserver.jks -storepass {redacted} -keypass {redacted} -validity 7 -ext san=dns:4o8rhl3t1a.execute-api.ap-southeast-1.amazonaws.com'
    at org.apache.jorphan.exec.KeyToolUtils.genkeypair(KeyToolUtils.java:172) ~[jorphan.jar:5.0 r1840935]
    at org.apache.jorphan.exec.KeyToolUtils.generateSignedCert(KeyToolUtils.java:286) ~[jorphan.jar:5.0 r1840935]
    at org.apache.jorphan.exec.KeyToolUtils.generateHostCert(KeyToolUtils.java:277) ~[jorphan.jar:5.0 r1840935]
    at org.apache.jmeter.protocol.http.proxy.ProxyControl.updateKeyStore(ProxyControl.java:1606) ~[ApacheJMeter_http.jar:5.0 r1840935]
    at org.apache.jmeter.protocol.http.proxy.Proxy.getSSLSocketFactory(Proxy.java:326) [ApacheJMeter_http.jar:5.0 r1840935]
    at org.apache.jmeter.protocol.http.proxy.Proxy.startSSL(Proxy.java:431) [ApacheJMeter_http.jar:5.0 r1840935]
    at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:194) [ApacheJMeter_http.jar:5.0 r1840935]

1 个答案:

答案 0 :(得分:0)

似乎我运行程序的操作系统或机器中存在问题。当我在另一台装有OpenJDK 10的计算机上运行时,没有句柄泄漏,但是句柄数增加到最大2800,下降到450。

在实验时以下注释。

  • 使用Oracle HotSpot JDK 7和8,即使我仅关闭输入和错误流,也没有句柄泄漏-(由于我不会在代码中使用它,所以不关闭输出流),但是相同的代码泄漏使用OpenJDK 10时可以处理。
  • 关闭所有三个流(输入,输出和错误)解决了句柄泄漏问题