图灵学院 java高级架构师教程-JVM崩溃了怎么办?
当内存溢出时,JVM仅仅会终止当前运行的程序,那么什么时候JVM会崩溃呢?
什么是异步请求?
我们知道,Web服务器和客户端采用HTTP通信,而HTTP底层采用TCP通信。异步通信就是当客户端向服务器发送一个HTTP请求后,将这个请求的TCP连接委托给其它线程,然后它转而做别的事,那条被委托的线程保持TCP连接,等待服务器的回信。当收到服务器回信后,再将收到的数据转交给刚才的线程。这个过程就是异步通信过程。
异步请求如何造成JVM崩溃?
如果一个Web应用使用了较多的异步请求(AJAX),每次主线程发送完请求后都将TCP连接交给一条新的线程去等待服务器回信,那么如果网络不流畅时,这些受委托的线程迟迟等不到服务器的回信,因此保持着TCP连接。当TCP连接过多时,超过JVM的承受能力,JVM就发生崩溃。
如何处理大对象?
大对象对于JVM来说是个噩耗。如果对象过大,当前新生代的剩余空间装不下它,那么就需要使用分配担保机制,将当前新生代的对象都复制到老年代中,给大对象腾出空间。分配担保涉及到大量的复制,因此效率很低。
那么,如果将大对象直接放入老年代,虽然避免了分配担保过程,但该对象只有当FullGC时才能被回收,而FullGC的代价是高昂的。如果大对象过多时,老年代很快就装满了,这时就需要进行FullGC,如果FullGC频率过高,程序就会变得很卡。
因此,对于大对象,有如下几种处理方法:
1.在写程序的时候尽量避免大对象
从源头降低大对象的出现,尽量选择空间利用率较高的数据结构存储。
2.尽量缩短大对象的有效时间
对象用完后尽快让它失效,好让垃圾收集器尽快将他回收,避免因在新生代呆的时间过长而进入老年代。
如果你想了解更多关于java架构师的专业知识,可以一起交流:1160405674这里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!