在IBM的虚拟机官方指导文档中明确指出,禁止将虚拟机的最大值和最小值设置为相等,否则会导致以下2个后果
<1>极大的增加垃圾回收时间,影响系统性能
<2>造成系统中存在内存碎片。

然而,BEA推荐将最小堆大小和最大堆大小设置为同一值,因为这样可以避免浪费用于时常调整堆大小所需的 VM 资源。

同样是堆大小,却有两种不同的说法,有必要来分析一下。
先看IBM的文章摘录:
IBM的虚拟机官方指导文档
Initial and maximum heap sizes
When you have established the maximum heap size that you need, you might want to set the minimum heap size to the same value; for example, -Xms 512M -Xmx 512M. Using the same values is not usually a good idea, because it delays the start of garbage collection until the heap is full. The first time that the Garbage Collector runs, therefore, becomes a very expensive operation. Also, the heap is most likely to be very fragmented when a need to do a heap compaction occurs. Again, this is a very expensive operation. The recommendation is to start your application with the minimum heap size that it needs. When it starts up, the Garbage Collector will run often and, because the heap is small, efficiently.
The Garbage Collector takes these steps:
If the Garbage Collector finds enough garbage, it exits.
If it cannot find enough garbage, it goes to the next step.
The Garbage Collector runs compaction.
  If it cannot find enough garbage, it goes to the next step.
The Garbage collector expands the heap.
Therefore, an application normally runs until the heap is full. Then, successive garbage collection cycles recover garbage. When the heap is full of reachable objects, the Garbage Collector compacts the heap. If and when the heap is full of reachable objects and cannot be compacted, the Garbage Collector expands the heap size.
From the above description, you can see that the Garbage Collector compacts the heap as the needs of the application rise, so that as the heap expands, it expands with a set of compacted objects in the bottom of the original heap. This is an efficient way to manage the heap, because compaction runs on the smallest-possible heap size at the time that compaction is found to be necessary.
Compaction is performed with the minimum heap sizes as the heap grows. Some evidence exists that an application’s initial set of objects tends to be the key or root set, so that compacting them early frees the remainder of the heap for more short-lived objects.
Eventually, the JVM has the heap at maximum size with all long-lived objects compacted at the bottom of the heap. The compaction occurred when compaction was in its least expensive phase. The overheads of expanding the heap are almost trivial compared to the cost of collecting and compacting a very large fragmented heap.

文档里写到,设置-Xms和-Xmx一样大会耽误垃圾回收的开始直到堆满,这样第一次垃圾回收就会变成非常昂贵的操作。推荐把-Xms设置为应用所需的最小值,这样会产生高效的垃圾回收。
关于垃圾收集器:
1 如果找到足够的垃圾, 这些垃圾释放后的空间够用 那么就不进行压缩。
2 如果找到的垃圾在释放后空间仍然不够用,那就进行压缩。
3 如果找到的垃圾不够多, 即使压缩后的空间也不够用 那么进行堆扩展。

之所以两种虚拟机的设置的方法存在冲突,主要是因为垃圾回收机制的不同。
Sun: GC策略默认是复制、分代算法。也就是说,它会将heap分成不同的几个区,譬如Solaris JVM中最上面有两个大小相等的区。GC时刻,将一个区的存活对象复制到另外一个对等区,垃圾对象就算遗弃了。这样在heap里面,就不存在碎片问题。

IBM: 默认GC策略并没有采取复制、分代方式,而是采用了标记-清除-压缩的方式。并且,它不像Sun的JVM那样,有个单独的方法区,它的方法区就放在Java堆空间里面。
前面提到过:IBM禁止将虚拟机的最大值和最小值设置为相等是因为会极大的增加垃圾回收时间。那难道Sun的虚拟机就不会造成垃圾时间过长吗?
是因为Sun的虚拟机的垃圾回收方式是分代收集,分代收集本身是并发的,是多线程同时进行,而且一般minor gc的时间很短,只有major gc的时间可能比较长 但是major gc 发生在tunured空间 这个空间大小一般也就是堆的一半。所以呢,Sun虚拟机可以将-Xms和-Xmx设置为一样大小以节约堆延伸和收缩所需的资源。
IBM虚拟机之所以不设置为一样大小,除了怕影响垃圾回收的效率(要在当前堆耗尽,也就是遇到AF才会GC,如果初始值和最大值一样,那么很久才会进行, 而且第一次GC就是大范围的)。除了这个原因,如果堆是从很小慢慢进行扩展的话,那么后来扩展的堆在进行压缩的时候 ,是不需要对前面已经压缩的堆进行过多操作的,换句话说,如果是初始堆很大的话 那么以后每次压缩的时间都会很长。

欢迎批评指导~~~~

转载于:https://www.cnblogs.com/totti19841106/archive/2008/12/10/1352152.html

【totti】sun和IBM虚拟机堆大小设置分析相关推荐

  1. 深入理解Java虚拟机——虚拟机堆转储快照分析工具(jhat)

    目录 一.虚拟机堆转储快照分析工具(jhat)的概述 二.实际工作中一般不直接使用jhat命令分析dump文件原因 三.使用jhat分析dump文件示例 一.虚拟机堆转储快照分析工具(jhat)的概述 ...

  2. java设置jvm内存_JVM(java 虚拟机)内存设置

    一.设置JVM内存设置 1. 设置JVM内存的参数有四个: -Xmx    Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定: -Xmx 此设置 ...

  3. linux脚本制定java堆大小_Java使用比堆大小更多的内存(或正确的Docker内存限制大小)...

    Java使用比堆大小更多的内存(或正确的Docker内存限制大小) 对于我的应用程序,Java进程使用的内存远远超过堆大小. 容器正在运行的系统开始出现内存问题,因为容器占用的内存比堆大小多得多. 堆 ...

  4. java xms xmx 设置_JVM 堆内存设置 -Xmx -Xms

    在Tomcat的启动参数里可以设置,如下 参数说明: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定: -Xmx 此设置控制 Jav ...

  5. 日本java69_Java应用监控(10)-NMT堆外内存分析2

    1.概述 是否曾经想过为什么Java应用程序通过众所周知的 -Xms和-Xmx 调整标志消耗的内存比指定的数量大得多 ?由于各种原因和可能的优化,JVM可能会分配额外的本机内存.这些额外的分配最终可能 ...

  6. bat java 指定堆大小_jvm 堆内存 栈内存 大小设置 查看堆大小

    1.在eclipse设置JVM参数 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效,也就是在eclipse中运行的java程序)编辑当前使用的J ...

  7. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  8. Java --- 堆空间大小设置与OutOfMemoryError(OOM)

    目录 一.堆空间大小设置 二.OutOfMemoryError异常 一.堆空间大小设置 1.Java堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,大家可以通过选项" ...

  9. mysql栈空间大小_jvm 堆内存 栈内存 大小设置

    Tomcat 的JVM 内存溢出问题的解决keyword: tomcat 的jvm 内存溢出问题的解决 近期在熟悉一个开发了有几年的项目,须要把数据库从mysql移植到oracle.首先把jdbc的连 ...

最新文章

  1. 实验0 了解和熟悉操作系统
  2. leetcode-21-合并两个有序链表
  3. sql_1-2_get基于盲注
  4. java打包拆包_[Java] Java 打包成jar包 和 解压jar包
  5. 为Envoy构建控制平面的指南-特定于域的配置API
  6. 8266获取网络时间
  7. MySQL Fabric集群功能整理---择录官网
  8. python爬虫代码-Python爬虫大小项目集合
  9. 删除mysql数据库_安装/删除MySQL数据库
  10. php7对redis的扩展及redis主从搭建
  11. 【ASO优化】产品ASO优化的流程分解
  12. 百度招聘的一个小彩蛋
  13. 什么是大数据,大数据工具有那些,大数据流程是什么样的 一
  14. TTE时间触发以太网
  15. 为什么大数据使用相关关系而不是因果分析?
  16. Français littérature
  17. 如何安装OCSNG及GLPI
  18. C++中的泛型编程有函数模板与类模板
  19. PyTorch实现PPO代码
  20. 4418. 选元素(动态规划)

热门文章

  1. 笔记本外接显示器 显示不清晰
  2. 电商平台开发你需要注意下面的几点!
  3. 冷库设计安装前有哪些检查工作
  4. JAVA设计模式第三讲:结构型设计模式
  5. 基于新浪微博API生成短链接的几款在线工具
  6. AutoCAD 快捷键
  7. python程序设计,猜数游戏编程实践课程实验
  8. [c#]使用Fleck实现简单的WebSocket含兼容低版本IE
  9. 洛夏墨迹测验(Rorschach Inkblot Test)
  10. iOS直角矩形图片绘制