我是靠谱客的博主 活力黄蜂,这篇文章主要介绍​JVM-调优参数归纳​,现在分享给大家,希望可以做个参考。

本地线程分配缓冲(-XX:+UseTLAB)

        把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存。

复制代码
1
2
通过-XX:+/-UseTLAB参数来设定虚拟机是否使用TLAB(JVM会默认开启-XX:+UseTLAB), -XX:TLABSize 指定TLAB大小。

启用指针压缩(-XX:+UseCompressedOops()

-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOops

开启逃逸分析参数(-XX:+DoEscapeAnalysis)

        用来优化对象内存分配位置,使其通过标量替换优先分配在栈上(栈上分配),
JDK7之后默认开启逃逸分析,如果要关闭使用参数(-XX:-DoEscapeAnalysis)
 

标量替换 (XX:+EliminateAllocations)


 

大对象直接进入老年代

复制代码
1
2
-XX:+UseSerialGC 大对象直接进了老年代 ,这个参数在 Serial 和ParNew两个收集器下有效。

垃圾收集器设置配置

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前) -XX:ThreadStackSize=1024  jvm 堆配置 -XX:+PrintGCDetails  查看内存区域的分配信息 -XX:+UseSerialGC -XX:+UseSerialOldGC 设置串行收集器 #设置并行收集器 -XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代) -XX:+UseParNewGC (能与CMS收集器配合工作) #CMS的相关核心参数 -XX:+UseConcMarkSweepGC:启用cms  -XX:ConcGCThreads:并发的GC线程数 -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片) -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一次 -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比) -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整 -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,降低CMS GC标记阶段(也会对年轻代一起做标记,如果在minor gc就干掉了很多对垃圾对象,标记阶段就会减少一些标记时间)时的开销,一般CMS的GC耗时 80%都在标记阶段 -XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW -XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW; 并行收集器设置 -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。 -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) 并发收集器设置 -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。 -XX:ParallelGCThreads=n:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。

      堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
      栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
         栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失

堆栈知识

      堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
      栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
         栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失

复制代码
1
2
3
4
5
6
JVM对于凡是new()创建的对象都一概存放在堆中:运行时动态分配内存 所有的基本数据类型全部是存储在栈里面,速度快。 一个对象,他的实体是存储在堆里面的,而他的引用是存储在栈里面。 如:String s=new String(“123”);这个s就在栈里面,而他的"123"这个对象在堆里面。 s 指向"123"; 就对象本身而言,他的所有属性的值如果不是单例或者静态的,就是存储在堆里面的。 一个类的所有对象的属性值都在堆里面并且占用不同的内存空间,而一个类的方法只在方法区里占一个地方,所有的对象指向同一个方法区。堆通过传递一个this给方法区用来区分每个对象的方法
复制代码
1
2
3
4
栈中主要存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。) 常量池:存放字符串常量和基本类型常量(public static final) 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享

最后

以上就是活力黄蜂最近收集整理的关于​JVM-调优参数归纳​的全部内容,更多相关​JVM-调优参数归纳​内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部