笔记:深入理解JVM 第5章 调优案例分析与实战

1、每天15万 PV 的在线文档类型网站

环境:4 CPU,16GB 内存, 64位 CentOS 5.4

问题:网站失去响应

原先JVM配置:JDK1.5,  -Xmx12G  -Xms12G

解决过程:发现问题来自GC停顿(12G内存 的 Full GC 需要12秒),内存中暂存文件导致“朝生夕灭”大量大对象,采用默认吞吐量优先收集器。

最终JVM配置:使用5个32位JDK作为逻辑集群,每个进程2GB内存,Apache服务作为前端负载均衡,垃圾回收改为CMS回收


2、集群间同步导致的内存溢出

环境:两台服务器,每台2个CPU、8GB内存、启动3个WebLogic,构成6个节点的亲和式集群,JBossCache作为全局缓存

问题:内存溢出。

解决过程:配置-XX:+HeapDumpOnOutOfMemoryError ,检查heap文件,发现是JBossCache问题,缓存多次被写,。

最后结论:缓存可以频繁读,但是不能频繁写。


3、堆外内存导致的溢出

环境:1CPU,4GB内存,32位Window系统,小型B/S的电子考试系统,使用了CometD技术

问题:不定时抛出内存溢出异常

原先配置:

解决过程:加入-XX:HeapDumpOnOutOfMemoryError 无果,使用jstat 无果,查日志发现是Direct Memory 溢出:OutOfMemory:null, at  sun.misc.Unsafe.allocateMemory (Native Method)。

CometD技术 用到了NIO 技术。Direct Memory  不能像老生代、新生代那样,发现空间不足了就通知收集器进行垃圾回收,他只能等待老生代Full GC的时候,顺便帮他清理内存的废弃对象,否则只能等待抛出异常。

最后结论:除了Heap 和 Perm ,这些区域也会占用内存: Direct Memory(-MaxDirectMemorySize)、线程栈 (-Xss)、Socket 缓存、JNI代码、虚拟机本身和GC


4、外部命令导致系统缓慢

环境:4CPU,Solaris,Glassfish

问题:请求响应慢,CPU使用率高

解决过程:通过Rumtime.getRuntime().exec() 执行外部shell脚本, 启动大量新进程,消耗大量时间。JVM执行Rumtime.getRuntime().exec() 流程:先复制一个与当前JVM拥有一样环境变量的进程,再使用这个新的进程去执行外部命令,最后退出,这种调用方式即使命令很快能执行完成,频繁创建进程的开销也非常可观。

解决方法:不使用shell 脚本,使用Java API。


5、服务器JVM进程崩溃

环境:2台服务器,2个CPU,8GB内存,WebLogic

问题:JVM自动关闭

解决过程:看日志,"Java.net.SocketException:Connection reset" 。因为远端连接到另外一个系统,调用另一个系统 完成Task,另一个系统处理速度非常慢,于是本系统积累了越来越多的等待线程和Socket连接。

解决方法:将调用另外一个系统的方式改成生产者-消费者模式的消息队列。 


6、不恰当数据结构导致内存占用过大

环境:后台RPC服务器,64位虚拟机

原先JVM配置:-Xms4g -Xmx8g -Xmn1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 

问题:加载80M的数据文件时候,每次Minor GC 造成停顿500 毫秒。

解决过程:看日志,新生代有多次Minor GC还存在的大对象

解决方法:去掉Survivor,-XX:+SurviorRatio=65536  ; 加入参数 -XX: MaxTenuringThreshold=0  -XX:+AlwaysTenure,将Minor GC后的对象立即进入老生代。修改程序。


7、Windows 虚拟内存导致长时间停顿

环境:带心跳检查的GUI桌面程序,每15秒一次心跳

问题:心跳检测有误,偶尔1分钟停顿

原先配置: -Xmx256M

解决过程:加入 -XX:PrintGCApplicaitonStoppedTime -XX:+PrintGCDateStamps -Xlooger:gclogs. 看日志 .程序在最小化时候,其工作内存被自动交换到磁盘的页面文件中

加入:-Dsun.awt.keepWorkingSetOnMinimize=true





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值