​JVM-调优参数归纳​

本文详细介绍了Java虚拟机(JVM)的内存管理,包括本地线程分配缓冲(TLAB)、指针压缩、逃逸分析及标量替换等机制。讲解了大对象直接进入老年代的策略,并探讨了不同垃圾收集器如Serial、Parallel和CMS的配置选项,如-XX:UseSerialGC、-XX:ParallelGCThreads等,以及它们对性能的影响。此外,还对比了堆和栈的特点,强调了对象分配和内存效率的重要性。
摘要由CSDN通过智能技术生成

本地线程分配缓冲(-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)
寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值