近日,用Springboot做了一个网络服务器,原理很简单,网络访问以后,用数据库存储访问。
代码如下:
@RestController
@RequestMapping("/test")
public class ThirdParkController {
private EntityManagerFactory mFactory = null;
private EntityManager mEm = null;
//
/// 车辆入场接口
///
/// 空
///
@Transactional(rollbackFor = Exception.class)
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(@RequestBody Data data) {
String result = null;
if (data == null) {;
return null;
}
try {
mFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
mEm = mFactory.createEntityManager();
mEm.getTransaction().begin();
//相关 *** 作
//一系列存储 *** 作
mEm.getTransaction().commit();
mEm.clear();
mEm.close();
mFactory = null;
result = "服务成功!";
} catch (Exception e) {
mEm.getTransaction().rollback();
mEm.clear();
mEm.close();
mFactory = null;
mEm = null;
result = "服务异常,请稍后重试!";
mLogger.error("Api/ThirdPark/EnterVenue 异常信息=%s 内部异常信息=%s 数据=%s",
e.getMessage(),
e.getStackTrace(),
mGson.toJson(data)
);
e.printStackTrace();
}
retrun result;
}
}
然后,调用极限测试,竟然发现有“java.lang.OutOfMemoryError: GC overhead limit exceeded”错误。
GC overhead limit,显然是垃圾处理机制出问题了。相关解决方案一般为:加大堆内存。于是,加大堆内存。
发现该方案最终只是让该问题出现的时间变长了,但并未解决问题。
认真看了下,该问题为:
“Exception in thread "Hibernate Connection Pool Validation Thread" Exception in thread "Hibernate Connection Pool Validation Thread" java.lang.OutOfMemoryError: GC overhead limit exceeded”
发现该问题,网上并无太好解决方案。
认真研究了下,发现该问题的实质原因和解决方案如下:
1)该问题实质是多次创建线程池,造成线程池崩溃了;
2)线程池显然并不需要多次创建,保持常态的线程池即可;
3)创建线程池的语句为Persistence.createEntityManagerFactory,让该语句少运行即可;
4)如果线程池和EntityManagerFactory是唯一的,创建一次即可;如果是多样的,保持同种类型创建创建一次即可;
5)笔者这里,EntityManagerFactory(Hibernate工厂)需要多个,笔者创建了一个单例创建和存储该工厂,保证同种类型的Hibernate工厂只有一个。
该问题,完美解决。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)