5.2.1高性能硬件上的程序部署策略
监控服务器运行状况发现网站没有响应是由GC停顿导致的,虚拟机运行在Server模式,默认使用吞吐量优先收集器,回收12GB的堆,一次Full GC的停顿时间高达14秒。访问文档把其从磁盘提取到内存中,导致内存中出现很多由文档序列化产生的大对象。这些大对象很多进入了老年代,没有在Minor GC中被清理掉。

因此内存很快被消耗殆尽。

在高性能硬件上部署程序,目前主要有两种方式:

  1. 通过64位JDK使用大内存。
  2. 使用若干个32位虚拟机建立逻辑集群利用硬件资源:
    在一台物理机器上启动多个应用服务器进程,给每个服务器进程分配不同的端口,然后在前端搭建一个负载均衡器,以反向代理方式分配访问请求。
    仍受到32位内存限制:

  3. 32位WINDOWS每个进程限制2GB内存,堆一般最多开到1.5G内存。

  4. 避免节点竞争全局的资源,IO异常。
  5. 大量用本地缓存,在逻辑集群中会造成较大的内存浪费。考虑改为集中式缓存。

    控制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堆和永久代外,还有

  6. Direct Memory

  7. 线程堆栈
  8. Socket缓存区
  9. JNI
  10. 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章 调优案例分析与实战相关推荐

  1. 第5章 调优案例分析与实战

    目录 案例分析 大内存硬件上的程序部署策略 堆外内存导致的溢出错误 外部命令导致系统缓慢 由Windows虚拟内存导致的长时间停顿 由安全点导致长时间停顿 编译时间和类加载时间优化 类加载时间优化 编 ...

  2. Java之JVM调优案例分析与实战(1) - 高性能硬件上的程序部署策略

    本JVM系列均来源于<深入理解Java虚拟机>一书中,版权归该书作者所有. 环境:一个15万PV/天左右的在线文档类型网站最近更换了硬件系统,新系统硬件为4个CPU.16GB物理内存.OS ...

  3. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...

    本套课程从虚拟机的发展历史,虚拟机的内存结构,对象的分配与回收以及字节码,类加载等多个方面深入地对Java虚拟机进行了剖析.内容详实,语言通俗易懂.理论结合实践,让学习本套视频的朋友可以更快的理解虚拟 ...

  4. 深入理解Java虚拟机:Jvm性能调优

    本篇内容包括:Jvm 性能调优简介:根据需求目标进行 Jvm 调优规划(即 调优的目标.调优的步骤):Jvm 调优参数.命令.工具:以及 Java 中的内存泄露问题的详解- 一.Jvm 性能调优简介 ...

  5. 《深入理解JVM.2nd》笔记(五):调优案例分析与实战

    文章目录 概念 案例分析 高性能硬件上的程序部署策略 情景再现1 问题分析1 关于Full GC 使用64位JDK来管理大内存可能遇到问题 建立逻辑集群 使用逻辑集群可能遇到的问题 最后解决方案 集群 ...

  6. Java之JVM调优案例分析与实战(5) - 服务器JVM进程奔溃

    环境:一个基于B/S的MIS系统,硬件为2个CPU.8GB内存的HP系统,服务器是WebLogic9.2(就是第二个案例中的那个系统).正常运行一段时间后,最近发现在运行期间频繁出现集群节点的虚拟机进 ...

  7. 深入理解java虚拟机gc_jvm GC收集器与内存分配(深入理解java虚拟机第三章)

    jvm GC收集器与内存分配(深入理解java虚拟机第三章) 本篇是<深入理解java虚拟机第三章>的笔记记录. 一 为什么要关注GC和内存分配? 需要排查各种内存溢出.内存泄漏问题时,或 ...

  8. 深入理解Java虚拟机-第六章 类文件结构

    第六章 类文件结构 6.1 概述 略 6.2 无关性的基石 因为想要实现 "Write Once,Run Anywhere"的伟大理想,Java 虚拟机被发明了出来.这些虚拟机都可 ...

  9. Java虚拟机这一块 —— JVM 调优和深入了解性能优化

    JVM 调优和深入了解性能优化 JVM 调优的本质 GC 调优原则 调优的原则 目的 GC 调优 调优步骤 日志分析 阅读 GC 日志 -XX:+UseSerialGC -XX:+UseParNewG ...

最新文章

  1. Nature综述:菌根共生的独特性和共性
  2. 软件:推荐5款职场人必备的效率神器APP
  3. 返回地址【数据结构】
  4. 终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
  5. 《前沿视点》——2013年最值得关注的网页设计流行趋势
  6. 2.1.1 理论模型
  7. 【图像超分辨率】Maintaining Natural Image Statistics with the Contextual Loss
  8. 柳传志退休,联想的贸工技路线对错由后人评说
  9. RAML规范1.0(译文)
  10. Tkinter——②entry(文本框)和text(多行文本)
  11. 高职单招计算机基础知识题,高职单招计算机基础练习题
  12. OpenGL-雾Fog-实例
  13. Java从电脑一个txt文档中读入一篇英语文章,然后统计并输出文章中的单词和其对应的数目。
  14. 微信公众号客服功能如何开通?
  15. 颈椎圣手!上班族必学的PDF旋转技巧
  16. python概率游戏_Python计算斗牛游戏的概率
  17. “时刻准备下岗”的互联网从业者:有何本事留下?
  18. 【Cocos Creator】 使用 TTF 以及文本配置动态生成位图字体的解决方案
  19. Python批量命名某目录下的所有图片名字
  20. 如何制作360全景图?校园全景图怎么做?

热门文章

  1. es6去除重复项_ES6 常用知识总结
  2. 502 proxy error解决方法_老大说,网上这种获取真实IP地址的方法不对,我不信......
  3. java加载配置文件_Java 读取配置文件的五种方式
  4. 清华大学python视频_涨见识了,清华大学全套Python579集视频教程泄露,拿走学去吧...
  5. b站怎么删自己的专栏_麦当劳B站直播翻车,品牌B站营销到底应该怎么做?
  6. error C2360: 参数初始化操作由“case”标签跳过
  7. 机器视觉软包装行业质量检测解决方案
  8. 一周第一次课(10月16日)安装linux
  9. 集中云数据加密能否填补安全漏洞?
  10. nohup rabbitmq python