多么痛的领悟-代码优化导致的BUG
一大早服务器报警,top一下,系统CPU负载已经飚到了15,导致无法访问!
jstack pid打印堆栈,大量解析json的线程在RUNNABLE。
忽然想到之前为了json解析的效率,放弃了现成的类库,手动做json解析,这样做的结果是效率提高了50倍以上,当时还沾沾自喜了好一阵子!
万万没想到今天忽然一条格式不合法的数据,竟然导致了死循环!
暂且不去说脏数据是如何进入到系统的,看一下解析Json的代码:
public static java.util.List<Thread> list_threads(){ int tc = Thread.activeCount(); Thread[] ts = new Thread[tc]; Thread.enumerate(ts); return java.util.Arrays.asList(ts);}@Path(value = "/api/stackinfo")@GETpublic ActionResult stackinfo() {String str = "<strong>Memory:</strong>";str +="<ol>";str +="<li>freeMemory="+Runtime.getRuntime().freeMemory()/(1024*1024)+"M</li>";str +="<li>totalMemory="+Runtime.getRuntime().totalMemory()/(1024*1024)+"M</li>";str +="<li>maxMemory="+Runtime.getRuntime().maxMemory()/(1024*1024)+"M</li>";str +="</ol>";str +="<br/>";str +="<strong>Thread:</strong>";str +="<ol>";for(Thread t : list_threads()){str +="<li>"+t.getName()+","+t.getState()+":"+ t.getClass().getName()+"</li>";StackTraceElement[] elems = t.getStackTrace();str += "<ol>";for(StackTraceElement elem : elems){str +="<li> "+elem.toString()+"</li>";}str += "</ol>";}str +="</ol>";beat.getResponse().setContentType("text/html;charset=UTF-8");return new ContentResult(str);}