本文是我在工作中调整 Solaris 8 上的 WebLogic 6.0SP2 中遇到诸多问题后,查阅相关资料而产生的一些概念,罗列出来,或许对您有所帮助。这并不代表,笔者推荐您使用 WebLogic 和 Solaris 的组合,相反,笔者欢迎相关 Tomcat 性能调整方面的心得。笔者在 Sun Tech Day 上和 Bea 公司的相关人员讨论后,认为 Bea 对 Open Source 和 Free Software 缺乏必要的远见。

另外,其中一些术语的翻译,是我自己的”创作“,我不知道别人是怎样翻译的。如果有不当的地方,希望指正。

堆( Heap)是 Java 程序的对象生活的地方,包含活的对象,死的对象以及剩余内存。

当对象不能被运行中的程序的指针所到达时,这些对象成为”垃圾“。

JVM 的堆大小决定了 VM 花费在收集垃圾上的时间和频度。

收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。

如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。

如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。

调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。

在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

堆划分为两个区域:新生代和旧生代。

新生代又分为:Eden 和两片生存空间(survivor spaces)。其中保证有一片空间在任何时间是空的,当垃圾收集发生时, Eden 中的活的对象复制到下一片生存空间,对象就在生存空间之间复制,直到到达最大门限值(老化),然后复制到旧生代。

Eden 是新的对象分配的地方。

很多对象分配以后很快成为垃圾,这些对象称为具有 "infant mortality."

对象生存的时间越长,需要的收集时间也越长,因此,收集变慢。

你的应用建立和释放对象的速度决定了垃圾收集的频度。因此,在编程时,应注意使用对象的缓冲,而不是新建立对象。

大多数对象在新生代就已经死去,因此你能有效的调整垃圾收集。如果你能安排大多数对象的生存期小于一个收集时间,那么,垃圾收集是十分高效的。

错误的”代“配置会导致频繁的垃圾收集,影响系统性能。

如果系统花费很多的时间收集垃圾,请减小堆大小。

一次完全的垃圾收集应该不超过 3-5 秒。

一般说来,你应该使用物理内存的 80% 作为堆大小。

在最大工作负荷的时候,监视 WebLogic 的性能。
使用 -verbosegc 选项测量有多少时间和资源用于垃圾收集。

打开垃圾收集的详细信息输出以及重定向:

% java -ms64m -mx64m -verbosegc -classpath $CLASSPATH
-Dweblogic.domain=mydomain -Dweblogic.Name=clusterServer1
-Djava.security.policy==/bea/weblogic6x/lib/weblogic.policy
-Dweblogic.management.server=192.168.0.101:7001 -Dweblogic.management.username=system
-Dweblogic.management.password=systemPassword weblogic.Server >> logfile.txt

在 Solaris 系统上,采用下面的命令:

weblogic.Server > server.out 2>&1

Java HotSpot VM 选项

标准的选项在各种平台都已经有介绍:
http://java.sun.com/j2se/1.3/docs/tooldocs/win32/java.html
http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html
http://java.sun.com/j2se/1.3/docs/tooldocs/linux/java.html

以 -X 开头的选项都为非标准选项(并不能在所有的 VM 上实现),在后续的版本中可能会不通知而变更。

由于 -XX 选项需要特别的系统权限,因此不建议随便使用。

在 1.3.0 之前的版本, J2SDK 的 Solaris 版本带有一个虚拟机的实现叫做 Exact VM(EVM),从 1.3.0 开始这个虚拟机被 Java HotSpot VM 所取代。

Java HotSpot VM 目前认识下面的 -X 选项:

-Xincgc 使用训练 GC
-Xnoincgc 不是用训练 GC(缺省)
-XX:MaxHeapFreeRatio=<Maximum> 最大堆剩余百分比(缺省 70)
-X:MinHeapFreeRation=<Minimum> 堆最小剩余百分比(缺省 40)
-Xint 只作解析 (不作 JIT 编译)
-XX:+UseBoundThreads 绑定用户级别的线程 (只针对 Solaris)
-Xmn<Size> 设置年轻一代的大小( young generation )(只对 1.4)

对象分配在 Eden,并且在这里死亡,当 Eden 满时,引起一个小的收集(minor collection),一些生存的对象被移动到旧生代,如果旧生代需要收集,则引起大收集(major collection ),这会比较缓慢。

如果 GC 成为瓶颈,那么需要指定代的大小,检查 GC 的详细输出,研究 GC 参数对性能的影响。

旧生代的收集采用 mark-compact 的方式,其中的一部分叫做”永久代“(permanent generation)很特别,他包括了 JVM 自身的所有反映数据(reflective data),例如类以及方法。

暂停时间的含义是应用因为垃圾收集而显示出来的短暂停顿。

吞吐量的含义是在一段比较长的时间内,没有用在垃圾收集的时间和总时间的百分比。

减少暂停时间的办法可以采用小的年轻代和增量收集,但是这以牺牲吞吐率为代价。

Footprint 是一批工作进程的集合,以页和缓冲行数计量,在物理内存有限或者有很多处理器的系统里,footprint 可代表伸缩性。

Promptness 是对象死去的时间和内存变为可用时的时间差,在分布系统中(包括 RMI)需要考虑。

很大的新生代能提高吞吐率,但是牺牲了 footprint 和 promptness。

Solaris 的 footprint 可以采用 pmap 命令来查看。

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]
上面的三行是 GC 的详细输出,我们可以看到两次小收集和一次大收集。箭头前后的两个数字代表 GC 后活的对象的组合长度。括号内的数字代表合计的空间,等于堆大小减去一片生存空间。

除非你遇到暂停的问题,否则,可以分配足够的内存给 JVM,缺省的 64MB 总是太小。

设置 -Xms 和 -Xmx 为同样的值能提高 JVM 的预测,但是如果你的选择不对的话, JVM 不会补偿。

当增加处理器时,记得增加内存,因为分配可以并行进行,而 GC 不是并行的。

NewSize 和 MaxNewSize 绑定新生代的长度的低端和高端,设置为一样大小时和 -Xms 和 -Xmx 一样解决新生代的预测时间。

如果生存空间太小,拷贝直接进入旧生代,如果太大的话,会空闲在那里。

除非你碰到过渡的大收集或者暂停时间,否则分配足够的内存给新生代,缺省的 MaxNewSize (32MB) 往往太小。

如果需要的话,最大的永久代大小可以使用 MaxPermSize 增加。

直接的 GC 调用可以采用 -XX:+DisableExplicitGC 来关闭。

对于大服务器而言,1.4 的 JVM 能提供 64 bit 寻址能力,提供更大的新生代大小,并发收集来减少大收集引起的暂停的影响。

Java HotSpot Client VM 主要用于减少应用启动时间以及内存的 footprint 。

Java HotSpot Server VM 和 Java HotSpot Client VM 类似,但是在最大性能上作了调整。用于长期运行的服务应用。

Solaris 和 Linux 的 J2SE 1.3 随带 Java HotSpot Server VM 预安装。

JVM 性能调整的一些基本概念相关推荐

  1. JVM性能优化, Part 5:Java的伸缩性

    感谢朋友[吴杰]投递本文. JVM性能优化系列文章由Eva Andearsson在javaworld上发表共计5篇文章,ImportNew上有前4篇译文.本文(第5篇)由吴杰翻译自:javaworld ...

  2. JVM性能调优实践:G1 垃圾收集器介绍篇

    前言 前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇.这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结 ...

  3. tomcat 参数最佳实践_一线架构师开发总结:剖析并发编程+JVM性能,深入Tomcat与MySQL...

    每一个程序员都有自己清晰的职业规划和终极目标,无论之后是继续钻研技术,还是转管理岗.产品岗,都是需要自己具备有一定的实力,换句话说技术要牛逼.架构师,是很多程序员的终极目标,而成为一名Java架构师, ...

  4. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

  5. JVM性能监控及调优篇

    一,概述 1,背景说明 1)生产环境中的问题 生产环境发生了内存溢出该如何处理 生产环境应该给服务器分配多少内存合适? 如何对垃圾回收器的性能进行调优? 生产环境CPU负载飙高该如何处理? 生产环境应 ...

  6. 第七篇:双管齐下,JVM内部优化与JVM性能调优

    文章目录 一.前言 二.编译时优化 2.1 Javac编译器 2.2 Java语法糖 2.2.1 泛型和泛型擦除 2.2.2 自动装箱.自动拆箱.遍历循环 2.2.3 条件编译 三.运行时优化(核心: ...

  7. Mr. Cappuccino的第19杯咖啡——金三银四面试题之JVM性能调优篇

    金三银四面试题之JVM性能调优篇 1. 什么是Java类加载器? 2. 读取class文件的来源有哪些? 3. 谈谈类加载器加载的流程? 4. 类加载器有哪几种? 5. 哪些操作会初始化类加载器? 6 ...

  8. 一步步带你详解JVM性能调优

    性能调优 性能调优包含多个层次,比如:架构调优.代码调优.JVM调优.数据库调优.操作系统调优等. 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的. 性能调优基本上按照以下步骤进 ...

  9. 如何合理的规划一次jvm性能调优

    这是jvm优化系列第三篇: jvm优化--垃圾回收 jvm优化--监控工具 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论 ...

  10. JVM性能优化, Part 2 ―― 编译器

    2019独角兽企业重金招聘Python工程师标准>>> ImportNew注:本文是JVM性能优化 – 第2篇 <JVM性能优化, Part 2 ―― 编译器>第一篇 & ...

最新文章

  1. python公共键_Python利用公共键如何对字典列表进行排序详解
  2. 【安全漏洞】gomarkdown/markdown 项目的 XSS 漏洞产生与分析
  3. 限制ul显示高度_led显示屏钢结构吊装方案原则及适用条件
  4. debian apt-get php,Debian系统apt-get命令整理
  5. Nginx+Keepalived实现站点高可用
  6. 电脑显示屏字体发虚、重影、部分清晰部分不清晰解决办法
  7. 计算机按键 shift的作用,Shift键的作用大全 Shift是什么意思
  8. WinCC7.0如何通过授权管理器用U盘进行导入和导出授权?
  9. iPad、iPhone 关闭WiFi私有地址 | 设置手动DNS |以iPhone为例
  10. np.partition介绍
  11. 【学习笔记】面向对象和封装
  12. cassandra(scylladb)数据备份和还原
  13. kubernetes的基础概念和安装
  14. vsan虚拟化和共享存储服务器,恰逢其时:当VSAN遇到浪潮云海桌面一体机
  15. mockjs 常用语法 以及 MockServer
  16. 基于51单片的智能饮水机设计(实物图+源码+原理图+参考论文)
  17. 服务器ip会被微信屏蔽吗,别再乱填自己的微信地址,否则分分钟会很麻烦!
  18. python 编程题 有n个整数、使其前面各数_有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。...
  19. 6S大气传输模型修改源码添加、自定义CASI传感器光谱响应
  20. 个人亲历64位win7硬盘安装ubuntu实录

热门文章

  1. PYQT5 系列(一)——参考自《弗兰克万岁》
  2. Javascript 格式化json字符串
  3. 针对商品标题冗长问题,阿里工程师怎么解决?
  4. Average (区间最大均值,二分)
  5. 波士顿房价预测(一)
  6. 第十届蓝桥杯大赛个人赛省赛(软件类本科B组)做题笔记Partial
  7. 正面管教读书笔记 04 重新看待不良行为
  8. 小小的天地 大大的梦想
  9. 这是一个刚入行程序员的成长
  10. VMware下ubuntu与windows主机共享文件夹