​JVM-调优参数归纳​

2023-11-03

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

​JVM-调优参数归纳​ 的相关文章

  • JVM 退出代码 1073807364 的原因是什么?

    我构建了一个基于 RCP 的应用程序 我的一位用户在 Windows XP Sun JVM 1 6 0 12 上运行时 应用程序完全崩溃了 应用程序运行两天后 这不是新版本或其他任何东西 他得到了漂亮的灰色 JVM 强制退出框 退出代码 1
  • JVM跳转指令的偏移量怎么会是32768呢?

    在写一个回答有关 JVM 字节码偏移量的问题 https stackoverflow com a 30240357 3182664 我注意到 javac 的行为和生成的类文件中有一些我无法解释的内容 当编译这样的类时 class FarJu
  • invokedynamic 什么时候真正有用(除了惰性常量之外)?

    TL DR 请提供一段用一些众所周知的动态语言 例如 JavaScript 编写的代码 以及该代码在使用 invokedynamic 的 Java 字节码中的样子 并解释为什么使用 invokedynamic 是一个进步 背景 我在 goo
  • IntelliJ 调试:暂停整个虚拟机,然后进入单线程

    我正在调试一个具有大量线程的应用程序 我的断点设置为暂停整个虚拟机 当线程遇到其中一个断点时 我想使用 Step Over 但这似乎会恢复整个虚拟机 直到该步骤完成 如果我可以只单步执行到达断点的单个线程 那确实会有帮助 在 Intelli
  • Java VM 突然退出且没有明显原因

    我的 Java 程序突然退出 没有抛出任何异常 也没有正常完成 这是一个问题 我正在写一个程序来解决欧拉计划 http projecteuler net s 这就是我得到的 private static final int INITIAL
  • 增加堆大小后无法启动 Glassfish

    我想增加 Glassfish 的堆大小 为此 我知道我可以达到 4GB java Xmx4000M version java version 1 6 0 26 Java TM SE Runtime Environment build 1 6
  • Scala 泛型 - 为什么我无法在泛型类中创建参数化对象?

    我目前正在学习scala 为什么此代码不起作用 class GenClass T var d T var elems List T Nil def dosom x T var y new T y 我得到 错误 需要类类型 但找到了 T 代替
  • 哪种语言(在 JVM 上运行)最适合创建 DSL?

    我们需要创建复杂的固定长度和可变长度字符串 这些字符串可能代表客户资料 订单等 你们建议使用哪种基于 JVM 的编程语言 想法是让最终用户使用此 DSL 创建字符串 所以我正在寻找验证 代码完成等 Groovy http docs code
  • 我的代码中出现内存不足异常

    作为 Oracle 数据库压力测试的一部分 我正在长时间运行代码并使用 java 版本 1 4 2 简而言之 我正在做的是 while true Allocating some memory as a blob byte data new
  • 如何查看JVM中JIT编译的代码?

    有什么方法可以查看 JVM 中 JIT 生成的本机代码吗 一般用法 正如其他答案所解释的 您可以使用以下 JVM 选项运行 XX UnlockDiagnosticVMOptions XX PrintAssembly 根据特定方法进行过滤 您
  • Scala 对大数的阶乘有时会崩溃,有时不会

    以下程序经过编译和测试 有时返回结果 有时充满屏幕 java lang StackOverflowError at scala BigInt apply BigInt scala 47 at scala BigInt equals BigI
  • Java GuardedString - 用于加密的随机密钥是否存储在 Java 堆内存中?如果不是,那么密钥保存在哪里?

    Oracle 的 org identityconnectors common security GuardedString 要转换为 GuardedString 的原始数据需要由 EncryptorImpl class 随机生成的加密密钥
  • 可以混合使用 JVM 语言吗?即:Groovy 和 Clojure

    我知道你可以轻松地混合groovy java clojure java 无论什么JvmLang java 这是否也意味着我也可以让 clojure 和 groovy 代码进行交互 如果我使用 Grails 或 jRoR 我也可以在该环境中使
  • OQL 包中的所有实例

    是否有可能在OQL检索属于一个包的所有对象 或者我可以查询wildcards 正如 haridsv 建议我尝试过的 SELECT from com example and SELECT a from com example but in V
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 为什么同样的算法在 Scala 中运行比在 C# 中慢得多?以及如何让它更快?

    该算法根据序列中每个成员的变体创建序列的所有可能变体 C 代码 static void Main string args var arg new List
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht

随机推荐

  • C/C++混合编程编译问题

    以下为本实验使用的编译器版本 系统环境为 目的 搞清以下几个问题 1 g 能否编译c文件 2 g 编出的s文件和gcc编出来的有何异同 3 cplusplus宏在何时被定义 4 c调用c 的注意事项 5 c 调用c的注意事项 6 针对上述问
  • js检测是否为数组的方法-JavaScript学习笔记

    1 方法一 instanceof 运算符 它可以用来检测是否为数组 代码 var arr var obj console log arr instanceof Array true console log obj instanceof Ar
  • Spring Boot 学习研究笔记(九) - Spring Data JPA常用注解

    Spring Data JPA 常用注解详细说明 1 Entity Entity 说明这个class 是实体类 并且使用默认的orm 规则 即 class 名对应数据库表中的表明 class 字段名即表中的字段名 如果想要改变这种默认的or
  • shell之多分支if语句

    1 语法格式 if 条件测试1 then 命令序列1 elif 条件测试2 then 命令序列2 elif 条件测试3 then 命令序列3 else 命令序列n fi 2 吃鸡段位排行 bin bash Author hejing Dat
  • 蓝牙硬件设备没有链接到计算机,电脑未发现蓝牙硬件设备怎么办

    有时我们想连接蓝牙硬件设备 却发现找不到了 没发现 怎么办 下面是学习啦小编为大家介绍电脑未发现蓝牙硬件设备的解决方法 欢迎大家阅读 电脑未发现蓝牙硬件设备的解决方法 首先我们在桌面找到 我的电脑 当然如果是WIN7 WIN8等系统以上的电
  • Postman 中文汉化界面

    参考 大佬的Gitee地址 gitee地址
  • GateWay 中StripPrefix的作用

    StripPrefix网关过滤器工厂采用一个参数StripPrefix StripPrefix参数表示在将请求发送到下游之前从请求中剥离的路径个数 spring cloud gateway routes id crm uri http cr
  • [1068]启动hdfs时,报错 Canary 测试无法在目录 /tmp/.cloudera_health_monitoring_canary_files 中创建文件

    启动hdfs时 报错 Canary 测试无法在目录 tmp cloudera health monitoring canary files 中创建文件 经过查看日志 发现 Name node is in safe mode 解决方法 sud
  • python练习10

    活动 10 while 循环的应用实例 一 程序示例 问 题 编程实现 猜数游戏 在给定某数后 让用户进行猜测并输入数 计算机给出相应提示 如偏大 偏小或正 确 若所猜测的数正确 则输出猜测次数 否则继续猜数 设计算法 初始 给定数 num
  • logback最详细配置讲解,及命名规范

    介绍 logback是一款日志框架 这个就不详细赘述了 命名规范 一般来说logback的配置文件可以命名为logback xml 项目启动时就可以读取到里面的配置 但是在spring boot项目中 这样会有一点问题 因为logback
  • 通过Docker方式安装海思Hi3516EV200交叉编译工具arm-himix100-linux

    前言 安装交叉编译环境 繁琐 耗时间 还得解决ubuntu版本不同 导致的各种错误 docker很好的解决了 不同版本 不同系统之间的差异性的问题 DOPI制作了docker方式的交叉编译环境 工作环境 vmare安装的ubuntu18 0
  • 实现前端项目自动化部署(webpack+nodejs)

    前言 一般来说 我们前端是不需要关心部署的事情的 只需要把打包后的文件直接丢给后台去部署就可以了 但是呢 如果频繁修改一点东西就要叫后台进行部署 这样后台会很烦 毕竟人家还有其他工作嘛 我们也会很不好意思 或许有些公司会给前端配置可视化操作
  • 静态时序分析——基础概念

    一 简述 静态时序分析是检查系统时序是否满足要求的主要手段 以往时序的验证依赖于仿真 采用仿真的方法 覆盖率跟所施加的激励有关 有些时序违例会被忽略 此外 仿真方法效率非常的低 会大大延长产品的开发周期 静态时序分析工具很好地解决了这两个问
  • Java的冒泡排序方法

    废话不多说 直接上代码 看不懂的话可以看注释 在这里插入代码片 public static void bubbleSort int arr 标志位 标志是否进行交换 boolean flag false for int i 0 i lt a
  • java 双列集合Map 万字详解

    目录 一 前言 二 概述 三 特点 四 常用方法 1 V put K key V value 代码演示 2 V get Object key 代码演示 3 V remove Object key 代码演示 4 int size 代码演示 5
  • excel两个指标相关性分析_指数相关性如何计算?

    且慢上长赢指数计划中有个指标叫相关性 这是统计学概念 主要看两个数列之间的相关程度 用在指数投资上 用作分散参照 如果两只指数的相关性越高 说明指数走势高度相似 涨的时候都涨 跌的时候都跌 起不到平衡或者分散风险的目的 因而 在投资时 尽量
  • 力扣 - 106、从中序与后序遍历序列构造二叉树

    题目 根据一棵树的中序遍历与后序遍历构造二叉树 注意 你可以假设树中没有重复的元素 例如 给出 中序遍历 inorder 9 3 15 20 7 后序遍历 postorder 9 15 7 20 3 返回如下的二叉树 3 9 20 15 7
  • 活锁和饥饿

    活锁 活锁本质上不是锁 是互相干扰导致线程无法跳出循环 比如 public class TestLiveLock static volatile int count 10 static final Object lock new Objec
  • SpringBoot 自定义注解(一)参数校验

    SpringBoot 2 3 0版本之后就没有引入validation对应的包 需要手动引用 依赖如下
  • ​JVM-调优参数归纳​

    本地线程分配缓冲 XX UseTLAB 把内存分配的动作按照线程划分在不同的空间之中进行 即每个线程在Java堆中预先分配一小块内存 通过 XX UseTLAB参数来设定虚拟机是否使用TLAB JVM会默认开启 XX UseTLAB XX