《深入理解Java虚拟机》第5章 调优案例分析与实战
5.2.1高性能硬件上的程序部署策略
监控服务器运行状况发现网站没有响应是由GC停顿导致的,虚拟机运行在Server模式,默认使用吞吐量优先收集器,回收12GB的堆,一次Full GC的停顿时间高达14秒。访问文档把其从磁盘提取到内存中,导致内存中出现很多由文档序列化产生的大对象。这些大对象很多进入了老年代,没有在Minor GC中被清理掉。
因此内存很快被消耗殆尽。
在高性能硬件上部署程序,目前主要有两种方式:
- 通过64位JDK使用大内存。
使用若干个32位虚拟机建立逻辑集群利用硬件资源:
在一台物理机器上启动多个应用服务器进程,给每个服务器进程分配不同的端口,然后在前端搭建一个负载均衡器,以反向代理方式分配访问请求。
仍受到32位内存限制:32位WINDOWS每个进程限制2GB内存,堆一般最多开到1.5G内存。
- 避免节点竞争全局的资源,IO异常。
大量用本地缓存,在逻辑集群中会造成较大的内存浪费。考虑改为集中式缓存。
控制Full GC频率:大多数对象的生存时间不能太长,保障老年代空间的稳定。
系统的CPU资源敏感度较低时,改为CMS收集器进行垃圾回收。5.2.2 集群同步导致的内存溢出
JBossCache和MIS(管理信息系统)实现的缺陷。能多读不能多写。服务过程中,一个页面会产生数次乃至数十次的请求,因此这个过滤器导致集群各个节点间的网络交互非常频繁。网络情况不能满足传输要求时,重发数据在内存中不断堆积,内存溢出。
5.2.3 堆外内存导致的溢出错误
为了实现客户端能实时地从服务端接受数据,使用了AJAX技术,服务器是Jetty。
溢出关键:GC时,VM虽然会对直接内存进行回收,但直接内存不像新生代和老年代那样,发现空间不足了就通知收集器进行垃圾回收。它只能等待抛出内存溢出异常时,在cathch字段里请求System.gc()。如果VM不听,我们只能眼睁睁堆还有内存,却抛出溢出。
本案例用到的CometD框架,正好有大量NIO操作用到Direct Memory。除了Java堆和永久代外,还有
Direct Memory
- 线程堆栈
- Socket缓存区
- JNI
- VM和GC
占用了较多内存
5.2.4 外部命令导致系统缓慢
CPU占用很高,占用多的不是应用本身。是”fork“系统调用(Linux用来产生新进程的)。
应该去掉这个shell脚本执行的语句,改为Java的API去获取这些信息。
5.2.5 服务器JVM进程崩溃
OA(办公自动化门户)
频繁集群节点的VM进程自动关闭的现象。
利用SoapUI两边服务不对等,等待的线程和Socket连接越来越多。超过VM的承受能力。
异步调用改成生产者/消费者模式的消息队列实现
5.3 实战:eclipse运行速度调优
VM的运行数据通过VisualVM及其扩展插件VisualGC进行采集。
得出是永久代的容量问题。
JDK1.5有4个参数,多出XXMaxPernSize这个参数。
JDK1.6的程序提供商由Sun变为Oracle。把默认值64MB改为最大256MB即可。
JDK1.6的类加载速度比1.5慢,但总体仍有优势。
关于虚拟机运行模式
client模式使用的是代号C1的轻量级编辑器,server模式使用C2编译器。
5.3.4 调整内存设置控制垃圾收集频率
每当发生一次GC,所有的用户线程都必须跑到最近的一个安全点,然后挂起线程等待垃圾回收。过于频繁的GC会导致很多没有必要的安全点检测、线程挂起以及恢复操作。
新生代的Minor GC频繁发生,因为VM分配给新生代的空间太小。
Full GC次数少,但占了绝大部分的GC时间。大多数由老年代容量扩展导致的。为了避免,可以把-Xms和-XX:PermSize参数值分别设置为-Xmx和-XX:PermSizeMax参数值。强制VM把老年代和永久代的容量固定下来。避免运行时自动扩展。
5.3.5 选择收集器降低延迟
新生代用ParNew,老年代用CMS(默认老年代使用68%就收集)。避免总体吞吐量下降厉害,用-XX:CMSInitiatingOccupancyFraction=85将GC临界值提升到85%
服务端的调优还有数据库,资源池,磁盘I/O等。
下面是书中的Eclipse配置:
希望这篇能对读者有所启发。
《深入理解Java虚拟机》第5章 调优案例分析与实战相关推荐
- 第5章 调优案例分析与实战
目录 案例分析 大内存硬件上的程序部署策略 堆外内存导致的溢出错误 外部命令导致系统缓慢 由Windows虚拟内存导致的长时间停顿 由安全点导致长时间停顿 编译时间和类加载时间优化 类加载时间优化 编 ...
- Java之JVM调优案例分析与实战(1) - 高性能硬件上的程序部署策略
本JVM系列均来源于<深入理解Java虚拟机>一书中,版权归该书作者所有. 环境:一个15万PV/天左右的在线文档类型网站最近更换了硬件系统,新系统硬件为4个CPU.16GB物理内存.OS ...
- vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...
本套课程从虚拟机的发展历史,虚拟机的内存结构,对象的分配与回收以及字节码,类加载等多个方面深入地对Java虚拟机进行了剖析.内容详实,语言通俗易懂.理论结合实践,让学习本套视频的朋友可以更快的理解虚拟 ...
- 深入理解Java虚拟机:Jvm性能调优
本篇内容包括:Jvm 性能调优简介:根据需求目标进行 Jvm 调优规划(即 调优的目标.调优的步骤):Jvm 调优参数.命令.工具:以及 Java 中的内存泄露问题的详解- 一.Jvm 性能调优简介 ...
- 《深入理解JVM.2nd》笔记(五):调优案例分析与实战
文章目录 概念 案例分析 高性能硬件上的程序部署策略 情景再现1 问题分析1 关于Full GC 使用64位JDK来管理大内存可能遇到问题 建立逻辑集群 使用逻辑集群可能遇到的问题 最后解决方案 集群 ...
- Java之JVM调优案例分析与实战(5) - 服务器JVM进程奔溃
环境:一个基于B/S的MIS系统,硬件为2个CPU.8GB内存的HP系统,服务器是WebLogic9.2(就是第二个案例中的那个系统).正常运行一段时间后,最近发现在运行期间频繁出现集群节点的虚拟机进 ...
- 深入理解java虚拟机gc_jvm GC收集器与内存分配(深入理解java虚拟机第三章)
jvm GC收集器与内存分配(深入理解java虚拟机第三章) 本篇是<深入理解java虚拟机第三章>的笔记记录. 一 为什么要关注GC和内存分配? 需要排查各种内存溢出.内存泄漏问题时,或 ...
- 深入理解Java虚拟机-第六章 类文件结构
第六章 类文件结构 6.1 概述 略 6.2 无关性的基石 因为想要实现 "Write Once,Run Anywhere"的伟大理想,Java 虚拟机被发明了出来.这些虚拟机都可 ...
- Java虚拟机这一块 —— JVM 调优和深入了解性能优化
JVM 调优和深入了解性能优化 JVM 调优的本质 GC 调优原则 调优的原则 目的 GC 调优 调优步骤 日志分析 阅读 GC 日志 -XX:+UseSerialGC -XX:+UseParNewG ...
最新文章
- Nature综述:菌根共生的独特性和共性
- 软件:推荐5款职场人必备的效率神器APP
- 返回地址【数据结构】
- 终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
- 《前沿视点》——2013年最值得关注的网页设计流行趋势
- 2.1.1 理论模型
- 【图像超分辨率】Maintaining Natural Image Statistics with the Contextual Loss
- 柳传志退休,联想的贸工技路线对错由后人评说
- RAML规范1.0(译文)
- Tkinter——②entry(文本框)和text(多行文本)
- 高职单招计算机基础知识题,高职单招计算机基础练习题
- OpenGL-雾Fog-实例
- Java从电脑一个txt文档中读入一篇英语文章,然后统计并输出文章中的单词和其对应的数目。
- 微信公众号客服功能如何开通?
- 颈椎圣手!上班族必学的PDF旋转技巧
- python概率游戏_Python计算斗牛游戏的概率
- “时刻准备下岗”的互联网从业者:有何本事留下?
- 【Cocos Creator】 使用 TTF 以及文本配置动态生成位图字体的解决方案
- Python批量命名某目录下的所有图片名字
- 如何制作360全景图?校园全景图怎么做?
热门文章
- es6去除重复项_ES6 常用知识总结
- 502 proxy error解决方法_老大说,网上这种获取真实IP地址的方法不对,我不信......
- java加载配置文件_Java 读取配置文件的五种方式
- 清华大学python视频_涨见识了,清华大学全套Python579集视频教程泄露,拿走学去吧...
- b站怎么删自己的专栏_麦当劳B站直播翻车,品牌B站营销到底应该怎么做?
- error C2360: 参数初始化操作由“case”标签跳过
- 机器视觉软包装行业质量检测解决方案
- 一周第一次课(10月16日)安装linux
- 集中云数据加密能否填补安全漏洞?
- nohup rabbitmq python