您当前的位置: 首页 >  jvm

cuiyaonan2000

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Jvm参数

cuiyaonan2000 发布时间:2022-07-19 10:36:54 ,浏览量:0

序言

如标题,这里主要考虑根据不同的环境,如何来设置Jvm的参数信息cuiyaonan2000@163.com

参考资料:

JVM参数配置及详解-Xms-Xmx-Xmn-Xss调优总结 - 百度文库

JVM中的垃圾回收器_星辰与晨曦的博客-CSDN博客_jvm垃圾回收器

堆内存
-Xms: 初始堆的大小,默认是总物理内存的1/64 ,当堆内存可用空间小于40%就会自动增加
-Xmx: 堆最大空间,默认是总物理内存的1/4,当堆内存可用空间大于70% 就会缩小
-XX:MinHeapFreeRatio  : 设置百分比,即当堆内存空间小于该百分比的时候 就会增加
-XX:MaxHeapFreeRatio : 设置百分比,即当堆内存空间大于该白百分比的时候,堆内存空间就会自动缩小.

如上为了避免堆内存因为扩容和缩小而带来西能损耗,一般会把xms和xmx设置成一样大.

新生代

堆内存划分了新生代跟老年代,故此有针对新生代和老年代的相关设置

新生代总共的内存官方推荐是堆的3/8

-XX:newSize:表示新生代初始内存的大小,应该小于-Xms的值;
-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于-Xmx的值;
-Xmn:至于这个参数则是对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,即设置了xmn就是标识XX:newSize和XX:MaxnewSize的值相同

-XX:PreTenureSizeThreshold 大对象到底多大,才会被分到老年代

-XX:MaxTenuringThreshold 先生代到老年代,升代年龄,最大值15, 并行(吞吐量)收集器的默认值为15,
Old Generation

默认老年代是新生代的4倍即 1:4的比例瓜分堆内存

#堆内存中,老年代是新生代的内存的几倍.注意这里是几倍的意思,3就是3倍cuiyaonan2000@163.com
-XX:NewRatio=4
Young Generation

新生代 分为 Edge区,From区,To区

Edge
#Eden是survivor的空间的几倍,默认是8. 因为survivior是复制算法,所以还会对半分成from区和to区
-XX:survivorRatio = 8

栈内存

基础变量和线程都是放在栈内存中的.

这里主要是设置线程的内存空间

JDK5.0以后每个线程堆栈⼤⼩为1M,以前每个线程堆栈⼤⼩为256K.

控制线程的栈内存大小可以,影响线程的总数.但是线程数量不能⽆限⽣成,经验值在3000~5000左右(cuiyaonan2000@163.com)

-Xss:设置每个线程的堆栈⼤⼩

垃圾回收器

Jvm的垃圾回收器设置非常重要,直接使用默认的垃圾回收机制,不能满足我们的需求,需要根据我们系统的类型,选择不同的垃圾回收器

但是种类也就这么几种,只要你知道有哪种类型的垃圾回收器,到时候可以根据需要进行jvm设置就ok了cuiyaonan2000@163.com

分类 Stop-The-World型

按照GC回收的线程数有如下2种(这2中方式都是 stop-the-world方式进行垃圾回收,即当垃圾回收开始工作的时候,工作线程全都暂停cuiyaonan2000@163.com)

  • 串行垃圾回收: 指的是在同一个时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。
  • 并行垃圾回收: 是和串行垃圾回收相反的,并行运算可以拥有多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用“Stop The World”的机制。在回收的时候,需要暂停所有的线程。

非Stop-The-World型

如上2种都是Stop-The-World型,自然有非Stop-The-World型,即垃圾回收线程跟工作线程可以交替占用CUP,而不是GC独占CPU知道结束,才让工作线程占有CPU

堆中的不同区域

垃圾回收器有多种,另外根据作用的范围,可以选择不同的垃圾回收器.这样子灵活性就很大了.cuiyaonan2000@163.com

这样子就可以在新生代设置一种垃圾回器,在老年代设置一种垃圾回收器.

年轻代垃圾回收器: 效率高,采用复制算法,但对内存的占用控制不精确,容易造成内存溢出。

老年代垃圾回收器: 效率低,在执行的时候,会STW,但一般启动次数少。

事实也是这样的,首先我们根据堆的不同区域选择不同的垃圾回收器.

参考Jconsole中的监控可以看到

  1. Ps MarkSweep:老年代GC,使用标记整理算法~ 
  2. PS Scavenge: 是一种stop-the-world, 使用多个GC线程实现复制算法。

对应参数设置

JVM中,青年代和老年代特点迥异,青年代中对象“朝生夕死”的特点,回收频率较高,适合采用复制算法;而老年代则更适合“标记-整理”算法。鉴于此,JVM采用分代回收的策略:青年代采用复制算法的回收器,老年代采用“标记-整理”算法的回收器

常用收集器说明
  1. Serial 收集器:历史最悠久,单线程工作,回收垃圾时,必须暂停所有其它线程——stop the world,采用复制算法;
  2. ParNew收集器:本质为Serial收集器的多线程版本,采用复制算法;
  3. Parallel scavenge:具备自使用调节功能,以提供最合适的暂停时间和吞吐量,采用复制算法;
  4. Serial old 收集器:是Serial 收集器的老年代版本,同样为单线程,但采用的是“标记-整理”算法;
  5. Parallel old 收集器:Parallel scavenge 收集器的老年代版本,多线程,采用的是“标记-整理”算法;
  6. CMS 收集器:即Concurrent Mark Sweep收集器,以获取最短停顿时间为目标,采用“标记-清除”算法;-------------就是并发收集器
  7. G1 收集器:即Garbage-First收集器,是目前最新的收集器,采用与其它收集器完全不通的设计思想,历时十年才实现商用,采用了混合算法,兼有“复制”和“标记-整理”算法的特点;---同理并发收集器

JVM参数设置信息 参数说明-XX:+UseSerialGC串行收集器,虚拟机运行在Client模式下的默认值,Serial(新生代)+Serial Old(老年代)。-XX:+UseParNewGCParNew+Serial Old,在JDK1.8被废弃,在JDK1.7还可以使用。-XX:+UseParallelGC

虚拟机运行在Server模式下的默认值,Parallel Scavenge+Serial Old(PS Mark Sweep)。

同时默认开启-XX:+UseParallelOldGC

-XX:+UseParallelOldGCParallel Scavenge+Parallel Old。默认是禁用-XX:+UseG1GC启用G1收集器 G1+G1.G1是服务器类型的收集器,用于多核,大内存的机器,在保持高吞吐量的情况下,高概率满足GC暂停时间的目标-XX:+UseConcMarkSweepGC对于老年代,启用CMS垃圾收集器,启用该选项后-XX:+UseParNewGC 自动启用

如上是开启不同的收集器配置信息.同理针对不同的收集器,还有很多的参数可以进行优化.这里紧紧列出一些常用的cuiyaonan2000@163.com

参数 说明-XX:+ParallelGCThreads   年轻代和老年代执行GC的线程数,默认为JVM的内核数-XX:+PrintGC打印每次GC的信息-XX:+PrintGCApplicationConcurrentTime打印最后一次暂停之后所经过的时间,即响应并发执行的时间-XX:+PrintGCApplicationStoppedTime   打印GC时应用暂停时间-XX:+PrintGCDateStamps打印每次GC的日期戳-XX:+PrintGCDetails打印每次GC的详细信息-XX:+PrintGCTaskTimeStamps打印每个GC工作线程任务的时间戳-XX:+PrintGCTimeStamps打印每次GC的时间戳XX:+HeapDumpOnOutOfMemoryError让虚拟机出现OOM的时候自动生成dump文件。

关注
打赏
1638267374
查看更多评论
立即登录/注册

微信扫码登录

0.7128s