本文主要是基于sun jdk 1.6 garbage collector(作者:毕玄)的整理与总结,原文请读者在网上搜索。
1、java虚拟机运行时的数据区
2、常用的内存区域调节参数
-xms:初始堆大小,默认为物理内存的1/64(<1gb);默认(minheapfreeratio参数可以调整)空余堆内存小于40%%u65f6,jvm就会增大堆直到-xmx的最大限制
-xmx:最大堆大小,默认(maxheapfreeratio参数可以调整)空余堆内存大于70%%u65f6,jvm会减少堆直到 -xms的最小限制
-xmn:新生代的内存空间大小,注意:此处的大小是(eden 2 survivor space)。与jmap -heap中显示的new gen是不同的。整个堆大小=新生代大小 老生代大小 永久代大小。
在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,sun官方推荐配置为整个堆的3/8。
-xx:survivorratio:新生代中eden区域与survivor区域的容量比值,默认值为8。两个survivor区与一个eden区的比值为2:8,一个survivor区占整个年轻代的1/10。
-xss: 每个线程的堆栈大小。jdk5.0以后每个线程堆栈大小为1m,以前每个线程堆栈大小为256k。应根据应用的线程所需内存大小进行适当调整。在相同物理 内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文 档似乎没有解释,在论坛中有这样一句话:"-xss is translated in a vm flag named threadstacksize”一般设置这个值就可以了。
-xx:permsize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-xx:maxpermsize:设置持久代最大值。物理内存的1/4。
3、内存分配方法
1)堆上分配 2)栈上分配 3)堆外分配(directbytebuffer或直接使用unsafe.allocatememory,但不推荐这种方式)
4、监控方法
1)系统程序运行时可通过jstat –gcutil来查看堆中各个内存区域的变化以及gc的工作状态;
2)启动时可添加-xx: printgcdetails –xloggc:<file>输出到日志文件来查看gc的状况;
3)jmap –heap可用于查看各个内存空间的大小;
5)断代法可用gc汇总
一、新生代可用gc
1)串行gc(serial copying):client模式下默认gc方式,也可通过-xx: useserialgc来强制指定;默认情况下 eden、s0、s1的大小通过-xx:survivorratio来控制,默认为8,含义
为eden:s0的比例,启动后可通过jmap –heap [pid]来查看。
默认情况下,仅在tlab或eden上分配,只有两种情况下会在老生代分配:
1、需要分配的内存大小超过eden space大小;
2、在配置了pretenuresizethreshold的情况下,对象大小大于此值。
默认情况下,触发minor gc时:
之前minor gc晋级到old的平均大小 < 老生代的剩余空间 < eden from survivor的使用空间。当handlepromotionfailure为true,则仅触发minor gc;如为false,则触发full gc。
默认情况下,新生代对象晋升到老生代的规则:
1、经历多次minor gc仍存活的对象,可通过以下参数来控制:以maxtenuringthreshold值为准,默认为15。
2、to space放不下的,直接放入老生代;
2)并行gc(parnew):cms gc时默认采用,也可采用-xx: useparnewgc强制指定;垃圾回收的时候采用多线程的方式。
3)并行回收gc(parallel scavenge):server模式下默认的gc方式,也可采用-xx: useparallelgc强制指定;eden、s0、s1的大小可通过-xx:survivorratio来控制,但默认情况下
以-xx:initialsurivivorratio为准,此值默认为8,代表的为新生代大小 : s0,这点要特别注意。
默认情况下,当tlab、eden上分配都失败时,判断需要分配的内存大小是否 >= eden space的一半大小,如是就直接在老生代上分配;
默认情况下的垃圾回收规则:
1、在回收前ps gc会先检测之前每次ps gc时,晋升到老生代的平均大小是否大于老生代的剩余空间,如大于则直接触发full gc;
2、在回收后,也会按照上面的规则进行检测。
默认情况下的新生代对象晋升到老生代的规则:
1、经历多次minor gc仍存活的对象,可通过以下参数来控制:alwaystenure,默认false,表示只要minor gc时存活,就晋升到老生代;nevertenure,默认false,表示永不晋升到老生代;上面两个都没设置的情冴下,如 useadaptivesizepolicy,启动时以initialtenuringthreshold值作为存活次数的阈值,在每次ps gc后会动态调整,如不使用useadaptivesizepolicy,则以maxtenuringthreshold为准。
2、to space放不下的,直接放入老生代。
在回收后,如useadaptivesizepolicy,ps gc会根据运行状态动态调整eden、to以及tenuringthreshold的大小。如果不希望动态调整可设置 -xx:-useadaptivesizepolicy。如希望跟踪每次的变化情况,可在启劢参数上增加: printadaptivesizepolicy。
二、老生代可用gc
1、串行gc(serial copying):client方式下默认gc方式,可通过-xx: useserialgc强制指定。
触发机制汇总:
1)old gen空间不足;
2)perm gen空间不足;
3)minor gc时的悲观策略;
4)minor gc后在eden上分配内存仍然失败;
5)执行heap dump时;
6)外部调用system.gc,可通过-xx: disableexplicitgc来禁止。
2、 并行回收gc(parallel scavenge): server模式下默认gc方式,可通过-xx: useparallelgc强制指定; 并行的线程数为当cpu core<=8 ? cpu core : 3 (cpu core*5)/8或通过-xx:parallelgcthreads=x来强制指定。如scavengebeforefullgc为true(默认 值),则先执行minor gc。
3、并行compacting:可通过-xx: useparalleloldgc强制指定。
4、并发cms:可通过-xx: useconcmarksweepgc来强制指定。并发的线程数默认为:( 并行gc线程数 3)/4,也可通过parallelcmsthreads指定。
触发机制:
1、当老生代空间的使用到达一定比率时触发;
hotspot v 1.6中默认为65%%uff0c可通过printcmsinitiationstatistics(此参数在v 1.5中不能用)来查看这个值到底是多少;可通过cmsinitiatingoccupancyfraction来强制指定,默认值并不是赋值在了这个值 上,是根据如下公式计算出来的: ((100 – minheapfreeratio) (double)(cmstriggerratio * minheapfreeratio) / 100.0)/ 100.0; 其中,minheapfreeratio默认值: 40 cmstriggerratio默认值: 80。
2、当perm gen采用cms收集且空间使用到一定比率时触发;
perm gen采用cms收集需设置:-xx: cmsclassunloadingenabled hotspot v 1.6中默认为65%%uff1b可通过cmsinitiatingpermoccupancyfraction来强制指定,同样,它是根据如下公式计算出来的: ((100 – minheapfreeratio) (double)(cmstriggerpermratio* minheapfreeratio) / 100.0)/ 100.0; 其中,minheapfreeratio默认值: 40 cmstriggerpermratio默认值
nginx实现一个域名配置多个laravel项目的方法示例山东枣庄高防云服务器哪些网站可以买云服务器配置王凯在省大数据中心郑商所河南证监局河南银保监局调研时强调 打造一流营商环境 构建良好金融生态阿里云个人买多少钱的服务器合适这个域名已经注册过了怎么退回来说没有注册那网站优化?中,转化率从哪些方面调整链路负载均衡其实可以这么做