当前位置:   article > 正文

jvm参数配置

jvm参数配置

参考:https://blog.csdn.net/weixin_43122090/article/details/105093777

jvm参数配置:
首先要了解可以配置些什么参数!!!
1、垃圾收集器
什么是垃圾收集器?
垃圾收集器是垃圾回收算法(引用计数法、标记清楚法、标记整理法、复制算法)的具体实现,不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能会有很在差别。

以JDK8为准:
在这里插入图片描述
图中展示了7种不同分代的收集器:
Serial、ParNew、Parallel Scavenge、CMS、Serial Old、Parallel Old、G1

而它们所处区域,则表明其是属于新生代还是老年代的收集器:

新生代收集器:Serial、ParNew、Parallel Scavenge

老年代收集器:CMS、Serial Old、Parallel Old

整堆收集器:G1

两个收集器间有连线,表明它们可以搭配使用:

Serial / Serial Old
Serial / CMS
ParNew / Serial Old
ParNew / CMS
Parallel Scavenge / Serial Old
Parallel Scavenge / Parallel Old
G1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

Serial
Serial 收集器:新生代。发展历史最悠久的收集器。它是一个单线程收集器,它只会使用一个 CPU 或者线程去完成垃圾收集工作,而且在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
特点:

1、新生代收集器,使用复制算法收集新生代垃圾。
2、单线程的收集器,GC工作时,其它所有线程都将停止工作。
3、简单高效,适合单 CPU 环境。单线程没有线程交互的开销,因此拥有最高的单线程收集效率。

使用方式:

//如何设置JVM参数底下会讲解:这里只是列举一部分参数:

设置垃圾收集器:"-XX:+UseSerialGC"  --添加该参数来显式的使用改垃圾收集器;
  • 1
  • 2
  • 3

ParNew
ParNew 收集器:新生代。Serial 的多线程版本,即同时启动多个线程去进行垃圾收集。
特点:

1、新生代收集器。ParNew垃圾收集器是Serial收集器的多线程版本,采用复制算法。
2、除了多线程外,其余的行为、特点和Serial收集器一样。
3、只有它能与 CMS 收集器配合使用。
4、但在单个CPU环境中,不比Serail收集器好,多线程使用它比较好。
使用方式:

//如何设置JVM参数底下会讲解:这里只是列举一部分参数:

设置垃圾收集器:"-XX:+UseParNewGC"  --强制指定使用ParNew;    
设置垃圾收集器: "-XX:+UseConcMarkSweepGC"  --指定使用CMS后,会默认使用ParNew作为新生代收集器;
设置垃圾收集器参数:"-XX:ParallelGCThreads"  --指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;
  • 1
  • 2
  • 3
  • 4
  • 5

Parallel Scavenge
Parallel Scavenge 收集器:新生代。和 ParNew 的关注点不一样,该收集器更关注吞吐量,尽快地完成计算任务。
特点:

1、新生代收集器。
2、采用复制算法。
3、多线程收集。
与ParNew 不同的是:高吞吐量为目标,(减少垃圾收集时间,让用户代码获得更长的运行时间)
使用方式:

//如何设置JVM参数底下会讲解:这里只是列举一部分参数:

设置垃圾收集器:"-XX:+UseParallelGC"  --添加该参数来显式的使用改垃圾收集器;
设置垃圾收集器参数:"-XX:MaxGCPauseMillis"  --控制垃圾回收时最大的停顿时间(单位ms)
设置垃圾收集器参数:"-XX:GCTimeRatio"  --控制程序运行的吞吐量大小吞吐量大小=代码执行时间/(代码执行时间+gc回收的时间)
设置垃圾收集器参数:"-XX:UseAdaptiveSizePolicy"  --内存调优交给虚拟机管理
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Serial Old
Serial Old 收集器:Serial 的老年代版本,使用标记 - 整理算法。
特点:

1、老年代收集器, 采用"标记-整理"算法。
2、单线程收集。
使用方式:

//如何设置JVM参数底下会讲解:这里只是列举一部分参数:

在JDK1.5及之前,与Parallel Scavenge收集器搭配使用,
在JDK1.6后有Parallel Old收集器可搭配。
现在的作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用
  • 1
  • 2
  • 3
  • 4
  • 5

Parallnel old
Parallnel old 收集器,多线程:Parallel 的老年代版本,使用标记 - 整理算法。
特点:

1、针对老年代。
2、采用"标记-整理"算法。
3、多线程收集。
4、但在单个CPU环境中,不比Serial Old收集器好,多线程使用它比较好。
使用方式:

//如何设置JVM参数底下会讲解:这里只是列举一部分参数:

 设置垃圾收集器:"-XX:+UseParallelOldGC":指定使用Parallel Old收集器;
  • 1
  • 2
  • 3

CMS
CMS 收集器:老年代。是一种以获取最短回收停顿时间为目标的收集器,适用于互联网站或者 B/S 系统的服务端上。
特点:

1、针对老年代,采用标记-清楚法清除垃圾;
2、基于"标记-清除"算法(不进行压缩操作,产生内存碎片);
3、以获取最短回收停顿时间为目标;
4、并发收集、低停顿;
5、CMS收集器有3个明显的缺点:1.对CPU资源非常敏感、2.无法处理浮动垃圾,可能出现"Concurrent Mode Failure"失败、3.产生大量内存碎片
垃圾收集线程与用户线程(基本上)可以同时工作
使用方式:

//如何设置JVM参数底下会讲解:这里只是列举一部分参数:

设置垃圾收集器:"-XX:+UseConcMarkSweepGC":指定使用CMS收集器;
  • 1
  • 2
  • 3

G1
G1 收集器:分代收集器。当今收集器技术发展最前沿成果之一,是一款面向服务端应用的垃圾收集器。G1可以说是CMS的终极改进版,解决了CMS内存碎片、更多的内存空间登问题。虽然流程与CMS比较相似,但底层的原理已是完全不同。
特点:

1、能充分利用多CPU、多核环境下的硬件优势;
2、可以并行来缩短(Stop The World)停顿时间;
3、也可以并发让垃圾收集与用户程序同时进行;
4、分代收集,收集范围包括新生代和老年代
5、能独立管理整个GC堆(新生代和老年代),而不需要与其他收集器搭配;
6、能够采用不同方式处理不同时期的对象;
7、应用场景可以面向服务端应用,针对具有大内存、多处理器的机器;
8、采用标记-整理 + 复制算法来回收垃圾
使用方式:

//如何设置JVM参数底下会讲解:这里只是列举一部分参数:

设置垃圾收集器:"-XX:+UseG1GC":指定使用G1收集器;
设置垃圾收集器参数:"-XX:InitiatingHeapOccupancyPercent":当整个Java堆的占用率达到参数值时,开始并发标记阶段;默认为45;
设置垃圾收集器参数:"-XX:MaxGCPauseMillis":为G1设置暂停时间目标,默认值为200毫秒;
设置垃圾收集器参数:"-XX:G1HeapRegionSize":设置每个Region大小,范围1MB到32MB;目标是在最小Java堆时可以拥有约2048个Region
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

JVM参数配置

JVM内存参数简述

#常用的设置
-Xms:初始堆大小,JVM 启动的时候,给定堆空间大小。 

-Xmx:最大堆大小,JVM 运行过程中,如果初始堆空间不足的时候,最大可以扩展到多少。 

-Xmn:设置堆中年轻代大小。整个堆大小=年轻代大小+年老代大小+持久代大小。 

-XX:NewSize=n 设置年轻代初始化大小大小 

-XX:MaxNewSize=n 设置年轻代最大值

-XX:NewRatio=n 设置年轻代和年老代的比值。如: -XX:NewRatio=3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代+年老代和的 1/4 

-XX:SurvivorRatio=n 年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor 区有两个。8表示两个Survivor :eden=2:8 ,即一个Survivor占年轻代的1/10,默认就为8

-Xss:设置每个线程的堆栈大小。JDK5后每个线程 Java 栈大小为 1M,以前每个线程堆栈大小为 256K。

-XX:ThreadStackSize=n 线程堆栈大小

-XX:PermSize=n 设置持久代初始值	

-XX:MaxPermSize=n 设置持久代大小
 
-XX:MaxTenuringThreshold=n 设置年轻带垃圾对象最大年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。

#下面是一些不常用的

-XX:LargePageSizeInBytes=n 设置堆内存的内存页大小

-XX:+UseFastAccessorMethods 优化原始类型的getter方法性能

-XX:+DisableExplicitGC 禁止在运行期显式地调用System.gc(),默认启用	

-XX:+AggressiveOpts 是否启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等,jdk6纸之后默认启动

-XX:+UseBiasedLocking 是否启用偏向锁,JDK6默认启用	

-Xnoclassgc 是否禁用垃圾回收

-XX:+UseThreadPriorities 使用本地线程的优先级,默认启用	

等等等......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

JVM的GC收集器设置

-XX:+UseSerialGC:设置串行收集器,年轻带收集器 

 -XX:+UseParNewGC:设置年轻代为并行收集。可与 CMS 收集同时使用。JDK5.0 以上,JVM 会根据系统配置自行设置,所以无需再设置此值。

-XX:+UseParallelGC:设置并行收集器,目标是目标是达到可控制的吞吐量

-XX:+UseParallelOldGC:设置并行年老代收集器,JDK6.0 支持对年老代并行收集。 

-XX:+UseConcMarkSweepGC:设置年老代并发收集器

-XX:+UseG1GC:设置 G1 收集器,JDK1.9默认垃圾收集器
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

JVM参数在哪设置
6.3.1 IDEA在哪里设置JVM参数
1、单个项目的应用

在这里插入图片描述
在这里插入图片描述
全局的配置

找到IDEA安装目录中的bin目录
找到idea.exe.vmoptions文件
打开该文件编辑并保存。

在这里插入图片描述
Eclipse在哪里设置JVM参数
1、配置单个项目

点击绿色图标右边的小箭头

在这里插入图片描述
2、配置全局JVM参数
修改Eclipse的配置文件,在eclipse安装目录下的:eclipse.ini文件

在这里插入图片描述
war(Tomcat)包在哪里设置JVM参数
war肯定是部署在Tomcat上的,那就是修改Tomcat的JVM参数

1、在Windows下就是在文件/bin/catalina.bat,
增加如下设置:JAVA_OPTS(JAVA_OPTS,就是用来设置 JVM 相关运行参数的变量)

set "JAVA_OPTS=-Xms512M -Xmx1024M ...等等等 JVM参数"
  • 1

在这里插入图片描述
2、Linux要在tomcat 的bin 下的catalina.sh 文件里添加

注意:位置要在cygwin=false前
JAVA_OPTS="-Xms512M -Xmx1024M ...等等等 JVM参数"
  • 1
  • 2

在这里插入图片描述

Jar包在哪里设置JVM参数

Jar包简单,一般都是SpringBoot项目打成Jar包来运行

#运行时java -jar是直接插入JVM命令就好了
java -Xms1024m -Xmx1024m ...等等等 JVM参数 -jar springboot_app.jar & 
  • 1
  • 2

调优总结
在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,
这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。
初始堆值和最大堆内存内存越大,吞吐量就越高,
但是也要根据自己电脑(服务器)的实际内存来比较。
最好使用并行收集器,因为并行收集器速度比串行吞吐量高,速度快。
当然,服务器一定要是多线程的
设置堆内存新生代的比例和老年代的比例最好为1:2或者1:3。
默认的就是1:2
减少GC对老年代的回收。设置生代带垃圾对象最大年龄,进量不要有大量连续内存空间的java对象,因为会直接到老年代,内存不够就会执行GC
注释:其实最主要的还是服务器要好,你硬件都跟不上,软件再好都没用
注释:老年代GC很慢,新生代没啥事
注释:默认的JVM堆大小好像是电脑实际内存的四分之一左右,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/355650
推荐阅读
相关标签
  

闽ICP备14008679号