我一直试图在我的应用程序中找到内存泄漏一周,但没有任何成功.我尝试进行堆转储并使用jhat查看转储并追踪内存泄漏.
这是最好的方法吗?什么是使用堆转储追踪内存泄漏的最佳方法.
感谢您的帮助.
使用的VM: java版"1.6.0_25"Java(TM)SE运行时环境(版本1.6.0_25-b06)Java HotSpot(TM)64位服务器VM(版本20.0-b11,混合模式)
JVM选项: -Xmx1600m -XX:+ UseParallelGC -XX:MaxPermSize = 256m -Xms1600m -XX:+ HeapDumpOnOutOfMemoryError -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -verbose:gc -Xloggc:/tmp/gc.log
OOME Stack trace:无法得到这个.内核因内存不足错误而终止进程.
GC日志:最后几行
48587.245: [GC [PSYoungGen: 407168K->37504K(476160K)] 506729K->137065K(1568448K), 3.0673560 secs] [Times: user=3.53 sys=0.00, real=3.07 secs]
50318.617: [GC [PSYoungGen: 444224K->37536K(476416K)] 543785K->175177K(1568704K), 3.6635990 secs] [Times: user=3.70 sys=0.00, real=3.67 secs]
50453.841: [GC [PSYoungGen: 70092K->2912K(476672K)] 207734K->178513K(1568960K), 1.0164250 secs] [Times: user=1.29 sys=0.00, real=1.02 secs]
50454.858: [Full GC (System) [PSYoungGen: 2912K->0K(476672K)] [PSOldGen: 175601K->137776K(1092288K)] 178513K->137776K(1568960K) [PSPermGen: 60627K->60627K(74368K)], 2.0082140 secs] [Times: user=2.09 sys=0.00, …Run Code Online (Sandbox Code Playgroud) 我用以下方式启动我的PHP脚本:
bash
cd 'path'
php -f 'scriptname'.php
Run Code Online (Sandbox Code Playgroud)
php脚本运行时没有输出.
过了一段时间,php脚本响应:
Killed
Run Code Online (Sandbox Code Playgroud)
我的想法是它达到了memory_limit: ini_set('memory_limit', '40960M');
增加内存限制似乎可以解决问题,但它只会增加优势.
这Killed句话究竟是什么意思?
我正在编写一个程序来查找给定字符串的所有子集。然而,它导致了一个名为Killed: 9.
class Strings(object):
def __init__(self,string):
self.list1=[]
self.string=string
def appendToList(self,ch1):
self.list1.append(ch1)
for i in self.list1:
self.list1.append(i+ch1)
def subset(self):
for ch in self.string:
self.list1=self.appendToList(ch)
print self.list1
obj=Strings('hello')
obj.subset()
Run Code Online (Sandbox Code Playgroud) 所以在Joe Armstrongs声称erlang进程很便宜并且vm可以处理数百万个之后.我决定在我的机器上测试它:
process_galore(N)->
io:format("process limit: ~p~n", [erlang:system_info(process_limit)]),
statistics(runtime),
statistics(wall_clock),
L = for(0, N, fun()-> spawn(fun() -> wait() end) end),
{_, Rt} = statistics(runtime),
{_, Wt} = statistics(wall_clock),
lists:foreach(fun(Pid)-> Pid ! die end, L),
io:format("Processes created: ~p~n
Run time ms: ~p~n
Wall time ms: ~p~n
Average run time: ~p microseconds!~n", [N, Rt, Wt, (Rt/N)*1000]).
wait()->
receive die ->
done
end.
for(N, N, _)->
[];
for(I, N, Fun) when I < N ->
[Fun()|for(I+1, N, Fun)].
Run Code Online (Sandbox Code Playgroud)
对于百万个流程来说,结果令人印象深刻 - 我得到6.6微米的aprox!秒平均产卵时间.但是当启动3m进程时,OS shell打印出的"Killed"与erlang运行时一样.我使用+ P 5000000标志运行erl,系统是:使用quadcore …
当我启动弹性搜索时,我在控制台上看到“Killed”,并且该过程结束。我无法启动弹性搜索过程。我缺少什么?
:~/elasticsearch-5.5.2/bin$ ./elasticsearch
Killed
Run Code Online (Sandbox Code Playgroud)
如果相关,我将其安装在 VPS 上。我没有看到任何其他错误消息 - 这使得调试变得困难。