《JVM》(五)内存溢出异常与调优

内存溢出异常
前端

除了程序计数器以外,jvm的其余几个运行时区域都存在着OOM异常的可能性java

java堆溢出web

对象数量达到最大堆的容量限制后算法

虚拟机栈和本地方法栈溢出缓存

线程请求的栈深度大于虚拟机所容许的最大深度服务器

虚拟机在扩展栈时没法申请到足够的内存空间网络

方法区和运行时常量池溢出session

生成大量的class的状况负载均衡


JDK的可视化工具框架

JConsole:java监视与管理控制台

概述;类;vm摘要;MBean;

内存(至关于jstat);

线程(至关于jstack);

VisualVM:多合一故障处理工具

显示虚拟机进程以及进程的配置,环境信息(jps,jinfo)

监视应用程序的CPU,GC,堆,方法区以及线程的信息(jstat,jstack)

dump以及分析堆转储快照(jmap,jhat)

方法级的程序运行性能分析,找出被调用最多,运行时间最长的方法

离线程序快照


调优案例分析

1.高性能硬件上的程序部署策略

问题:将网站堆内存固定在12GB,网站不按期出现长时间失去响应的状况。

缘由:失去响应是由于过大的堆内存,程序设计产生成批大对象,进入老年代,GC停顿致使的。

解决:给java虚拟机分配超大堆的前提是,把握程序的Full GC频率控制得足够低。

                控制GC频率的关键是不能有成批的,长时间生存的大对象产生,这样才能保证老年代的稳定。

现阶段64位jdk性能测试结果广泛低于32位jdk,多数人选择使用若干个32位虚拟机创建逻辑集群:在一台物理机器上启动多个应用服务器进程,每一个进程分配不一样端口,在前端搭一个负载均衡器。

无session复制的亲和式集群:均衡器按照必定的算法(通常根据sessionId分配)将一个固定的用户请求永远分配到固定的一个集群节点处理。

2.集群间同步致使的内存溢出

问题:亲和式集群,节点间没有session同步,须要有一些数据共享,使用JBossCache构建一个全局缓存。不按期出现屡次内存溢出问题

缘由:JBossCache 的缺陷。JBossCache在发送数据时有一个全局filter,把数据操做时间同步到全部的节点中,当网络状况不知足,重发数据在内存中不断堆积

解决:须要被集群共享的数据,使用相似JBossCache的缓存框架同步时,能够读操做频繁,不能写频繁。

3.堆外内存致使的溢出错误

问题:GC并不频繁,Eden区,surviver区,老年代以及永久代均表示压力不大,但仍是报错内存溢出

缘由:除了java堆和永久代,还有些区域会占用必定的内存:Direct Memory;线程堆栈;socket缓冲区...

4.服务器jvm进程崩溃

问题:使用了异步方式调用另外一个系统的web服务,速度不对等,致使等待的socket链接愈来愈多,虚拟机崩溃

解决:将异步调用改成生产者/消费者的消息队列实现

相关文章
相关标签/搜索