工作中遇到的java内存溢出异常(OutOfMemoryError)和栈溢出异常(StackOverflowError)

1.栈溢出异常(StackOverflowError)
     形成原因:  死循环调用方法。
        前几天提了关于栈溢出的一个故障单。微服务A请求微服务B资源的一个方法变成了懒加载,懒加载方法中判断当资源为空时就向微服务C请求资源,请求得到资源后,先缓存,再通微服务A去更新数据库{更新表结构时候还会向微服务B请求资源},然后再返回资源,当资源不为空时,则直接返回资源。但是当资源微服务A一直没有导入资源,上述过程就会形成一个环形结构,最后堆栈空间用完,造成栈溢出异常(StackOverflowError)。
   
    解决方法:通知微服务之前加个判断:资源为空时则不通知。


2.内存溢出异常(OutOfMemoryError)
    形成原因:
        资源对象都缓存在单粒类对象中,客户端请求时需要做一些处理,所以处理之前要clone一下,由于对象层次太深,有一个深层次对象List<String> attribute 属性没有clone,而这个属性在客户端的每次请求中都会将list的符合条件的内容字符串用“+”连接,再放入List,请求一定次数后最后导致List的大小大约达到了2M,最终导致了内存溢出(OutOfMemoryError)

   
解决方法:彻底的深度clone。


   

展开阅读全文

没有更多推荐了,返回首页