一个性能较好的jvm參数配置以及jvm的简单介绍

一个性能较好的webserverjvm參数配置:

-server	//服务器模式
-Xmx2g //JVM最大同意分配的堆内存,按需分配
-Xms2g //JVM初始分配的堆内存。一般和Xmx配置成一样以避免每次gc后JVM又一次分配内存。
-Xmn256m //年轻代内存大小。整个JVM内存=年轻代 + 年老代 + 持久代
-XX:PermSize=128m //持久代内存大小
-Xss256k //设置每一个线程的堆栈大小
-XX:+DisableExplicitGC //忽略手动调用GC, System.gc()的调用就会变成一个空调用,全然不触发GC
-XX:+UseConcMarkSweepGC //并发标记清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled //减少标记停顿
-XX:+UseCMSCompactAtFullCollection //在FULL GC的时候对年老代的压缩
-XX:LargePageSizeInBytes=128m //内存页的大小
-XX:+UseFastAccessorMethods //原始类型的高速优化
-XX:+UseCMSInitiatingOccupancyOnly //使用手动定义初始化定义開始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 //使用cms作为垃圾回收使用70%后開始CMS收集

说明:

-Xmn和-Xmx之比大概是1:9,假设把新生代内存设置得太大会导致young gc时间较长

一个好的Web系统应该是每次http请求申请内存都能在young gc回收掉,full gc永不发生。当然这是最理想的情况

xmn的值应该是保证够用(够http并发请求之用)的前提下设置得尽量小

webserver和游戏server的配置思路不太一样。最重要的差别是对游戏server的xmn即年轻代设置比較大。和Xmx大概1:3的关系,由于游戏server通常是长连接,在保持一定的并发量后须要较大的年轻代堆内存。假设设置得大小了会常常引发young gc

  • 对JVM的简单介绍

由上图能够看出jvm堆内存的分类情况,JVM内存被分成多个独立的部分。

广泛地说。JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generation)。

  • 年轻代

年轻代是全部新对象产生的地方。

当年轻代内存空间被用完时,就会触发垃圾回收。

这个垃圾回收叫做Minor GC。年轻代被分为3个部分——Enden区和两个Survivor区。

年轻代空间的要点:

大多数新建的对象都位于Eden区。

当Eden区被对象填满时,就会运行Minor GC。并把全部存活下来的对象转移到当中一个survivor区。

Minor GC相同会检查存活下来的对象。并把它们转移到还有一个survivor区。

这样在一段时间内,总会有一个空的survivor区。

经过多次GC周期后,仍然存活下来的对象会被转移到年老代内存空间。

通常这是在年轻代有资格提升到年老代前通过设定年龄阈值来完毕的。

  • 年老代

年老代内存里包括了长期存活的对象和经过多次Minor GC后依旧存活下来的对象。一般会在老年代内存被占满时进行垃圾回收。老年代的垃圾收集叫做Major GC。Major GC会花费很多其它的时间。

Stop the World事件

全部的垃圾收集都是“Stop the World”事件,由于全部的应用线程都会停下来直到操作完毕(所以叫“Stop the World”)。

由于年轻代里的对象都是一些暂时(short-lived )对象,运行Minor GC很快,所以应用不会受到(“Stop the World”)影响。

由于Major GC会检查全部存活的对象。因此会花费更长的时间。

应该尽量降低Major GC。由于Major GC会在垃圾回收期间让你的应用反应迟钝,所以假设你有一个须要高速响应的应用发生多次Major GC,你会看到超时错误。

垃圾回收时间取决于垃圾回收策略。这就是为什么有必要去监控垃圾收集和对垃圾收集进行调优。

从而避免要求高速响应的应用出现超时错误。

  • 永久代

永久代或者“Perm Gen”包括了JVM须要的应用元数据,这些元数据描写叙述了在应用里使用的类和方法。注意,永久代不是Java堆内存的一部分。

永久代存放JVM执行时使用的类。永久代相同包括了Java SE库的类和方法。永久代的对象在full GC时进行垃圾收集。

方法区

方法区是永久代空间的一部分,并用来存储类型信息(执行时常量和静态变量)和方法代码和构造函数代码。

内存池

假设JVM实现支持,JVM内存管理会为创建内存池。用来为不变对象创建对象池。字符串池就是内存池类型的一个非常好的样例。

内存池能够属于堆或者永久代,这取决于JVM内存管理的实现。

执行时常量池

执行时常量池是每一个类常量池的执行时代表。

它包括了类的执行时常量和静态方法。执行时常量池是方法区的一部分。

Java栈内存

Java栈内存用于执行线程。

它们包括了方法里的暂时数据、堆里其他对象引用的特定数据。

Java垃圾回收

Java垃圾回收会找出无用的对象,把它从内存中移除并释放出内存给以后创建的对象使用。

Java程序语言中的一个最大长处是自己主动垃圾回收。不像其它的程序语言那样须要手动分配和释放内存,比方C语言。

垃圾收集器是一个后台执行程序。它管理着内存中的全部对象并找出没被引用的对象。

全部的这些未引用的对象都会被删除。回收它们的空间并分配给其它对象。

一个主要的垃圾回收过程涉及三个步骤:

标记:这是第一步。

在这一步。垃圾收集器会找出哪些对象正在使用和哪些对象不在使用。

正常清除:垃圾收集器清会除不在使用的对象。回收它们的空间分配给其它对象。

压缩清除:为了提升性能,压缩清除会在删除无用的对象后,把全部存活的对象移到一起。这样能够提高分配新对象的效率。

简单标记和清除方法存在两个问题:

效率非常低。由于大多数新建对象都会成为“没用对象”。

经过多次垃圾回收周期的对象非常有可能在以后的周期也会存活下来。

上面简单清除方法的问题在于Java垃圾收集的分代回收的,并且在堆内存里有年轻代和年老代两个区域。

  • Java垃圾回收类型

这里有五种能够在应用里使用的垃圾回收类型。

仅须要使用JVM开关就能够在我们的应用里启用垃圾回收策略。

Serial GC(-XX:+UseSerialGC):Serial GC使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收。即Minor GC和Major GC。Serial GC在client模式(客户端模式)非常实用。比方在简单的独立应用和CPU配置较低的机器。

这个模式对占有内存较少的应用非常管用。

Parallel GC(-XX:+UseParallelGC):除了会产生N个线程来进行年轻代的垃圾收集外。Parallel GC和Serial GC差点儿一样。这里的N是系统CPU的核数。

我们能够使用 -XX:ParallelGCThreads=n 这个JVM选项来控制线程数量。并行垃圾收集器也叫throughput收集器。由于它使用了多CPU加快垃圾回收性能。Parallel GC在进行年老代垃圾收集时使用单线程。

Parallel Old GC(-XX:+UseParallelOldGC):和Parallel GC一样。不同之处,Parallel Old GC在年轻代垃圾收集和年老代垃圾回收时都使用多线程收集。

并发标记清除(CMS)收集器(-XX:+UseConcMarkSweepGC):CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器通过多线程并发进行垃圾回收。尽量降低垃圾收集造成的停顿。

CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器一样。这个垃圾收集器适用于不能忍受长时间停顿要求高速响应的应用。可使用 -XX:ParallelCMSThreads=n JVM选项来限制CMS收集器的线程数量。

G1垃圾收集器(-XX:+UseG1GC) G1(Garbage First):垃圾收集器是在Java 7后才干够使用的特性,它的长远目标时取代CMS收集器。G1收集器是一个并行的、并发的和增量式压缩短暂停顿的垃圾收集器。

G1收集器和其它的收集器执行方式不一样,不区分年轻代和年老代空间。它把堆空间划分为多个大小相等的区域。当进行垃圾收集时,它会优先收集存活对象较少的区域,因此叫“Garbage First”。

时间: 2024-10-10 15:32:10

一个性能较好的jvm參数配置以及jvm的简单介绍的相关文章

Spark 性能相关參数配置具体解释-任务调度篇

作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 随着Spark的逐渐成熟完好, 越来越多的可配置參数被加入到Spark中来, 本文试图通过阐述这当中部分參数的工作原理和配置思路, 和大家一起探讨一下怎样依据实际场合对Spark进行配置优化. 因为篇幅较长.所以在这里分篇组织,假设要看最新完整的网页版内容.能够戳这里:http://spark-config.readthedoc

Spark 性能相关參数配置具体解释-shuffle篇

作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 随着Spark的逐渐成熟完好, 越来越多的可配置參数被加入到Spark中来, 在Spark的官方文档http://spark.apache.org/docs/latest/configuration.html 中提供了这些可配置參数中相当大一部分的说明. 可是文档的更新总是落后于代码的开发的, 另一些配置參数没有来得及被加入到这

Hadoop作业性能指标及參数调优实例 (二)Hadoop作业性能调优7个建议

作者:Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Hadoop作业性能调优7个建议 (二)其他參数调优方法 二.Hadoop集群报告异常,发现个别作业导致集群事故. 一.用户观察到作业性能差,主动寻求帮助. (一)eBay Eagle作业性能分析器 对一般作业性能调优.eBay Eagle[i]的作业性能分析器已经能满足用户大部分需求. eBayEagle

django 带參数的 url

url就像筋络一样把django这个大框架的各个部分紧紧的连接成一个总体,所以要了解django从url開始是一个不错的方向. 一般的view template url的关系这里就不讲了,以下会具体介绍下在url中參数的传递的样例. 1.  简单的參数调用 url(r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), 对于上面的url,假设用   /articles/2005/03/  来解析.最后就会解析到view到 news

ionic新手教程第七课-简要说明几种界面之间的參数传递及优缺点

截至2016年4月13日19点32分,我公布的ionic新手教程,已经公布6课了, 总訪问量将近6000,平均每节课能有1000的訪问量.当中訪客最多的是第三课有2700的訪客. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 事实上我開始的时候计划的挺好的,就依照我这阶段的安排,慢慢的带大家做一个

Java參数传递方式

原文:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html,我作了些改动并添加了一个实例,添加对照 本文通过内存模型的方式来讨论一下Java中的參数传递. 1.基本类型參数的传递方式 这里的内存模型涉及到两种类型的内存:栈内存(stack)和堆内存(heap).基本类型作为參数传递时,传递的是这个值的拷贝. 不管你怎么改变这个拷贝,原值是不会改变的. 看下边的一段代码,然后结合内存模型来说明问题: public class ParameterT

python可变參数调用函数问题

一直使用python实现一些想法,近期在使用python的过程中出现这样一个需求,定义了一个函数.第一个是普通參数.第二个是默认參数,后面还有可变參数,在最初学习python的时候,都知道非keyword可变參数和keyword可变參数两种,调用的方式或许多种多样,这里主要提出一个比較隐含的问题.并将各种可能出现的情况进行了探讨. 函数声明格式 python尽管不支持函数重载,可是通过对函数參数的众多特性的支持基本弥补了. 函数声明的通式例如以下: def func(argv1,argv2...

Python学习笔记7:函数对象及函数对象作參数

一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给func. func的调用与正常函数无异. 上面的代码等价于: def fun2(x, y): return x + y 二.函数作为參数 函数能够作为一个对象.进行參数传递. 比如: fun = lambda x ,y : x+y def runFun(fun, a, b): print fun(

我的Spring之旅(二):为请求加入參数

1.前言 在上一篇我的Spring之旅(一)中,我们仅仅是利用不带參数的请求返回一个网页或一段json,在实际的B/S.C/S网络交互中,请求中须要自己定义的參数.本篇将简单地为之前的请求加入參数. 2.參数说明 ①method:API名称,用于区分服务端调用方法 ②name:请求參数名称,将作为method方法的实參 3.改写HelloController.java package com.nextgame.web; import java.io.IOException; import net