【问题标题】:Java running out of memory on VPSJava 在 VPS 上内存不足
【发布时间】:2014-02-06 07:01:06
【问题描述】:

该程序没有明显的内存泄漏,当我观察它在我的机器上本地运行时,它运行良好。在 VPS 上,它会在几个小时后崩溃,并显示一系列错误消息,如下所示。

线程“Thread-10422”java.lang.OutOfMemoryError 中的异常:Java 堆空间

如果发生内存泄漏,我不明白为什么会在几小时后而不是几分钟后发生这样的错误。我使用 VisualVM 等工具来观察程序的行为,并且内存始终保持不变。

有没有人知道我可以通过什么方法来调试它并深入了解它或如何避免它?

有没有不需要安装,可以通过ssh观察进程内存使用情况的工具?

编辑: 所有异常都没有堆栈跟踪,这很奇怪。但是错误发生在不同类的不同线程中。

at java.io.BufferedWriter.<init>(BufferedWriter.java:104)
at java.io.BufferedWriter.<init>(BufferedWriter.java:87)
at java.io.PrintStream.init(PrintStream.java:100)
at java.io.PrintStream.<init>(PrintStream.java:142)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:411)
at sun.net.www.http.HttpClient$2.run(HttpClient.java:457)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.http.HttpClient.privilegedOpenServer(HttpClient.java:454)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:521)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:240)
at sun.net.www.http.HttpClient.New(HttpClient.java:321)
at sun.net.www.http.HttpClient.New(HttpClient.java:338)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:935)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:914)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:801)


at java.util.HashMap.resize(HashMap.java:479)
at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:431)
at java.util.HashMap.put(HashMap.java:402)
at org.jsoup.nodes.Attributes.put(Attributes.java:58)
at org.jsoup.parser.Token$Tag.newAttribute(Token.java:65)
at org.jsoup.parser.TokeniserState$34.read(TokeniserState.java:791)
at org.jsoup.parser.Tokeniser.read(Tokeniser.java:42)
at org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java:47)
at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:41)
at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:37)
at org.jsoup.parser.Parser.parseInput(Parser.java:30)
at org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:102)
at org.jsoup.helper.HttpConnection$Response.parse(HttpConnection.java:498)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:154)

编辑: 设置最大内存后出现此错误

OpenJDK 64 位服务器 VM 警告:尝试分配堆栈保护页失败。

【问题讨论】:

  • 这是网络应用还是独立应用?
  • 请发布整个堆栈跟踪。
  • 您能否为我们提供更多有关该应用程序的详细信息,例如其运行的平台以及它正在做什么的要点?任何产生这么多线程的东西听起来像是一个危险信号。
  • @supersam654 这只是线程 ID 我有大约 200 个线程正在运行。
  • 它只是运行一些在线执行简单任务的线程。

标签: java memory memory-leaks vps


【解决方案1】:

这清楚地表明您的堆空间已用完。所以你可以尝试使用 coomand java -Xms&lt;initial heap size&gt; -Xmx&lt;maximum heap size&gt; 增加 Java 虚拟机的堆空间

据我所知,默认值为initial: 32M and maximum: 128M。所以可以让它最大值为256M或512M。

查看这里以获取有关 Java VM 的信息。 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

【讨论】:

  • 我不知道默认最大值是 128M。在我的 Windows 机器中,堆空间从 500mb 开始。我会尝试你的建议,让你知道它是否有效。非常感谢。
  • 这是我现在得到的错误 OpenJDK 64-Bit Server VM warning: Attempt to allocate stack guard pages failed.
  • 你的内存是多少?
  • 所以我认为,您没有足够的内存来运行 200 个线程。尝试在其他内存更大的机器上运行相同的程序。
  • 请记住,执行 5 小时后会出现错误。无论如何,代码的失败与内存不足并不完全相关,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2013-10-23
  • 2012-06-21
  • 2013-09-10
  • 2012-12-12
相关资源
最近更新 更多