028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

jvm调优小结-创新互联

不区分tomcat,resion等应用,主要是针对jvm调优

成都创新互联是一家集网站建设,南涧企业网站建设,南涧品牌网站建设,网站定制,南涧网站建设报价,网络营销,网络优化,南涧网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

tomcat家目录下catalina.sh  catalina.bat

从http://unixboy.iteye.com/blog/174173

这个是jvm内存体系结构

http://blog.csdn.net/java2000_wl/article/details/8009362

http://www.360doc.com/content/15/0429/15/7853380_466822446.shtml详细讲解-XX:ParallelGCThreads

学到了很多东西,又加一点点自己的补充和理解。

  1. 堆大小设置
    JVM 中大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,大可设置为1478m。
    典型设置:

回收器选择JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。

  1. 吞吐量优先的并行收集器
    如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
    典型配置

  2. 响应时间优先的并发收集器
    如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。
    典型配置

辅助信息JVM提供了大量命令行参数,打印信息,供调试使用。主要有以下一些:

常见配置汇总

-XX:CMSInitiatingOccupancyFraction

当堆满之后,并行收集器便开始进行垃圾收集,例如,当没有足够的空间来容纳新分配或提升的对象。对于CMS收集器,长时间等待是不可取的,因为在并发垃圾收集期间应用持续在运行(并且分配对象)。因此,为了在应用程序使用完内存之前完成垃圾收集周期,CMS收集器要比并行收集器更先启动。

因为不同的应用会有不同对象分配模式,JVM会收集实际的对象分配(和释放)的运行时数据,并且分析这些数据,来决定什么时候启动一次CMS垃圾收集周期。为了引导这一过程, JVM会在一开始执行CMS周期前作一些线索查找。该线索由 -XX:CMSInitiatingOccupancyFraction=来设置,该值代表老年代堆空间的使用率。比如,value=75意味着第一次CMS垃圾收集会在老年代被占用75%时被触发。通常CMSInitiatingOccupancyFraction的默认值为68(之前很长时间的经历来决定的)。

  1. 堆设置

  2. 收集器设置

  3. 垃圾回收统计信息

  4. 并行收集器设置

  5. 并发收集器设置

四、调优总结

  1. 年轻代大小选择

年老代大小选择

较小堆引起的碎片问题因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:

以下是关于ParallelGCThreads的详解

1.含义

   ParallelGCThreads,表示JVM在进行并行GC的时候,用于GC的线程数,-XX:ParallelGCThreads=43,表示配置GC线程数为43。

2.JVM相关接口

   JVM中,关于ParallelGCThreads的计算代码如下:

unsigned int VM_Version::calc_parallel_worker_threads() {

  unsigned int result;

  if (is_M_series()) {

    // for now, use same gc thread calculation for M-series as for niagara-plus

    // in future, we may want to tweak parameters for nof_parallel_worker_thread

    result = nof_parallel_worker_threads(5, 16, 8);

  } else if (is_niagara_plus()) {

    result = nof_parallel_worker_threads(5, 16, 8);

  } else {

    result = nof_parallel_worker_threads(5, 8, 8);

  }

  return result;

}

unsigned int Abstract_VM_Version::parallel_worker_threads() {

  if (!_parallel_worker_threads_initialized) {

    if (FLAG_IS_DEFAULT(ParallelGCThreads)) {

      _parallel_worker_threads = VM_Version::calc_parallel_worker_threads();

    } else {

      _parallel_worker_threads = ParallelGCThreads;

    }

    _parallel_worker_threads_initialized = true;

  }

  return _parallel_worker_threads;

}

unsigned int Abstract_VM_Version::calc_parallel_worker_threads() {

  return nof_parallel_worker_threads(5, 8, 8);

}

unsigned int Abstract_VM_Version::nof_parallel_worker_threads(

                                                      unsigned int num,

                                                      unsigned int den,

                                                      unsigned int switch_pt) {

  if (FLAG_IS_DEFAULT(ParallelGCThreads)) {

    assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");

    // For very large machines, there are diminishing returns

    // for large numbers of worker threads.  Instead of

    // hogging the whole system, use a fraction of the workers for every

    // processor after the first 8.  For example, on a 72 cpu machine

    // and a chosen fraction of 5/8

    // use 8 + (72 - 8) * (5/8) == 48 worker threads.

    unsigned int ncpus = (unsigned int) os::active_processor_count();

    return (ncpus <= switch_pt) ?

           ncpus :

          (switch_pt + ((ncpus - switch_pt) * num) / den);

  } else {

    return ParallelGCThreads;

  }

}

3.计算方法

  上面列出了与ParallelGCThreads计算相关的几个核心接口,其中,最主要关注nof_parallel_worker_threads接口,该接口中给出了计算ParallelGCThreads值的具体算法,具体如下:

   ①如果用户显示指定了ParallelGCThreads,则使用用户指定的值。

   ②否则,需要根据实际的CPU所能够支持的线程数来计算ParallelGCThreads的值,计算方法见步骤③和步骤④。

  ③如果物理CPU所能够支持线程数小于8,则ParallelGCThreads的值为CPU所支持的线程数。这里的阀值为8,是因为JVM中调用nof_parallel_worker_threads接口所传入的switch_pt的值均为8。

  ④如果物理CPU所能够支持线程数大于8,则ParallelGCThreads的值为8加上一个调整值,调整值的计算方式为:物理CPU所支持的线程数减去8所得值的5/8或者5/16,JVM会根据实际的情况来选择具体是乘以5/8还是5/16。

  比如,在64线程的x86 CPU上,如果用户未指定ParallelGCThreads的值,则默认的计算方式为:ParallelGCThreads = 8 + (64 - 8) * (5/8) = 8 + 35 = 43。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页名称:jvm调优小结-创新互联
分享网址:http://www.tsicrk.com/article/dcgjdj.html

其他资讯

让你的专属顾问为你服务

2.0897s