疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

jvm性能优化及内存分区


 

   Some of the default values for Sun JVMs are listed below.
   
    JDK 1.3.1_06 Initial Size Maximum Size
   
    Client JVM 1MB 32MB
   
    Server JVM 1MB 64MB
   
    JDK 1.4.1_01 Initial Size Maximum Size
   
    Client JVM 4MB 64MB
   
    Server JVM 4MB 64MB
   
    JDK 1.4.2 Initial Size Maximum Size
   
    Client JVM 4MB 64MB
   
    Server JVM 16MB 64MB
   
    JDK 1.5.0 Initial Size Maximum Size
   
    Client JVM 8MB 64MB
   
    Server JVM 16MB 64MB
   
    以下是sun公司的性能优化白皮书中提到的几个例子:
   
    1.对于吞吐量的调优。机器配置:4G的内存,32个线程并发能力。
   
    java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
   
    -Xmx3800m -Xms3800m 配置了最大Java Heap来充分利用系统内存。
   
    -Xmn2g 创建足够大的青年代(可以并行被回收)充分利用系统内存,防止将短期对象复制到老年代。
   
    -Xss128 减少默认最大的线程栈大小,提供更多的处理虚拟内存地址空间被进程使用。
   
    -XX:+UseParallelGC 采用并行垃圾收集器对年青代的内存进行收集,提高效率。
   
    -XX:ParallelGCThreads=20 减少垃圾收集线程,默认是和服务器可支持的线程最大并发数相同,往往不需要配置到最大值。
   
    2.尝试采用对老年代并行收集
   
    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
   
    -Xmx3550m -Xms3550m 内存分配被减小,因为ParallelOldGC会增加对于Native Heap的需求,因此需要减小Java Heap来满足需求。
   
    -XX:+UseParallelOldGC 采用对于老年代并发收集的策略,可以提高收集效率。
   
    3.提高吞吐量,减少应用停顿时间
   
    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31
   
    -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 选择了并发标记交换收集器,它可以并发执行收集操作,降低应用停止时间,同时它也是并行处理模式,可以有效地利用多处理器的系统的多进程处理。
   
    -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=31 表示在青年代中Eden和Survivor比例,设置增加了Survivor的大小,越大的survivor空间可以允许短期对象尽量在年青代消亡。
   
    -XX:TargetSurvivorRatio=90 允许90%的空间被占用,超过默认的50%,提高对于survivor的使用率。
   
    JAVA的JVM的内存可分为3个区(常用的,一共有6个):堆(heap)、栈(stack)和方法区(method)
   
    堆区:
   
    1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
   
    2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放数据
   
    栈区:
   
    1.每个线程包含一个栈区,栈中只保存原始类型数据和对象和对象引用(不是对象),对象都存放在堆区中
   
    2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
   
    3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
   
    方法区:
   
    1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
   
    2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。