概述
本地线程分配缓冲(-XX:+UseTLAB)
把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存。
通过-XX:+/-UseTLAB参数来设定虚拟机是否使用TLAB(JVM会默认开启-XX:+UseTLAB),
-XX:TLABSize 指定TLAB大小。
启用指针压缩(-XX:+UseCompressedOops()
-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOops
开启逃逸分析参数(-XX:+DoEscapeAnalysis)
用来优化对象内存分配位置,使其通过标量替换优先分配在栈上(栈上分配),
JDK7之后默认开启逃逸分析,如果要关闭使用参数(-XX:-DoEscapeAnalysis)
标量替换 (XX:+EliminateAllocations)
大对象直接进入老年代
-XX:+UseSerialGC 大对象直接进了老年代 ,这个参数在 Serial 和ParNew两个收集器下有效。
垃圾收集器设置配置
-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)和对象句柄。
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失
JVM对于凡是new()创建的对象都一概存放在堆中:运行时动态分配内存
所有的基本数据类型全部是存储在栈里面,速度快。
一个对象,他的实体是存储在堆里面的,而他的引用是存储在栈里面。
如:String s=new String(“123”);这个s就在栈里面,而他的"123"这个对象在堆里面。 s 指向"123";
就对象本身而言,他的所有属性的值如果不是单例或者静态的,就是存储在堆里面的。
一个类的所有对象的属性值都在堆里面并且占用不同的内存空间,而一个类的方法只在方法区里占一个地方,所有的对象指向同一个方法区。堆通过传递一个this给方法区用来区分每个对象的方法
栈中主要存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
常量池:存放字符串常量和基本类型常量(public static final)
寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享
最后
以上就是活力黄蜂为你收集整理的JVM-调优参数归纳的全部内容,希望文章能够帮你解决JVM-调优参数归纳所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复