JVM对象内存分配

1 栈上分配
  • 空间随着方法执行完毕回收
  • 通过栈上分配对象内存空间方式减少对堆空间使用从而减少gc压力提升程序性能

  • 逃逸分析分析对象作用判断对象所需内存是否可以栈上分配
  • 对象没有外部方法或者对象引用对象可以栈上分配内存空间
  • 开启栈上分配jvm参数-XX:+DoEscapeAnalysis1.7默认开启

  • 标量替换通过将对象这样聚合量拆解一个基础数据这样标量达到栈上分配内存空间
  • 开启标量替换jvm参数-XX:+EliminateAllocations1.7默认开启
  • 通过逃逸分析可以栈上分配内存然后使用标量替换方式分配内存
  • 关闭逃逸分析或者标量替换任何一个jvm参数导致jvm跳过栈上分配直接堆中分配内存

  • 分配代码示例
public class App {
    private Integer a;
    private  int b;
    private Byte d;
    private byte e;
    public  static  void test(){
        App app = new App();
        app.a=1;
        test(app);
    }
   public static int test(App app) {
        int d = app.a;
        d++;
        return d;
    }
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            test();
        }
        System.out.println(System.currentTimeMillis()-start);
    }
}

设置jvm参数运行

-Xms15m -Xmx15M -XX:+PrintGCDetails -XX:+DoEscapeAnalysis -XX:+EliminateAllocations

观察基本不会发生GC执行耗时很短

调整jvm参数运行:

-Xms15m -Xmx15M -XX:+PrintGCDetails -XX:-DoEscapeAnalysis -XX:+EliminateAllocations

观察程序运行期间产生大量young gc执行耗时增高100多倍

2 大对象
  • 对象大小超过一定限制直接老年代分配内存
  • 设置大对象大小jvm参数-XX:PretenureSizeThreshold=1000000单位字节
  • 垃圾回收使用SerialParNew此参数才会生效

  • 代码示例
public static void main(String[] args) {
   byte[] bytes = new byte[10*1024*1024];
}

  • 设置jvm参数运行
-XX:+PrintCommandLineFlags -XX:PretenureSizeThreshold=1000 -XX:+PrintGCDetails -XX:+UseParNewGC

运行结果可知bytes对象老年代

3 动态年龄判断
  • 发生young gc之后,当幸存区域内某一批(gc年龄1~n之内的)对象大小占比幸存区超过50%之后,将gc年龄>=n的对象提早挪入老年代
  • 通过jvm参数-XX:TargetSurvivorRatio设置比例

4 老年代空间担保机制

  • 每次young gc之前jvm都会计算老年代剩余空间
  • 如果老年代剩余空间小于现在年轻代所有对象大小
  • 那么进一步判断之前每次young gc之后进入老年代对象平均大小是否大于老年代剩余空间
  • 如果大于剩余空间那么直接触发一次full gc
  • 进行young gc
  • 开启空间担保机制jvm参数-XX:+HandlePromotionFailure
  • jdk8实验报错已经不支持参数

5 长期存活的对象
  • 每发生一次young gc新生代内对象gc年龄就需要1
  • 对象gc年龄超过指定就需要搬运老年代
  • gc年龄阈值jvm参数-XX:MaxTenuringThreshold设置默认15

6 伊甸区
  • 一般情况下产生对象伊甸区分配内存
  • 空间不够触发一次young gc伊甸区正在使用幸存区存活对象搬运另外一块幸存
  • 临时对象尽可能让其young gc过程小汪
  • 默认情况下年轻代伊甸区幸存区比例8:1:1并且动态调整比例
  • 关闭动态调整jvm参数-XX:-UseAdaptiveSizePolicy默认开启
  • 调整伊甸区占用年轻代比例jvm参数-XX:SurvivorRatio=8

  • 证明年轻代空间不够但是老年代空间足够对象直接进入老年代
public static void main(String[] args) {
   {
      byte[] bytes1 = new byte[2*1024*1024];
   }
   byte[] bytes2 = new byte[4*1024*1024];
}

  • 增加jvm参数运行
-Xms15m -Xmx15M -XX:+PrintGCDetails

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

性能测试04|JMeter:连接数据库、逻辑控制器、定时器

目录 一、连接数据库 1、使用场景 2、直连数据库的关键配置 3、案例 ​编辑 二、逻辑控制器 1、if控制器 2、循环控制器 3、ForEach控制器 三、定时器 1、同步定时器 2、常数吞吐量定时器&#xff08;用的少&#xff0c;了解即可&#xff09; 3、固定定时器 一、连…

国内Ubuntu环境Docker部署 SenseVoice

国内Ubuntu环境Docker部署 SenseVoice 趁热搞定了 docker 部署 SenseVoice。在这里记录一下相关的文件。 SenseVoice是一个大模型语音识别库, 支持多种语言识别&#xff0c;速度快&#xff0c;准确率高&#xff0c;详细介绍请参考GitHub官网&#xff1a; https://github.com/Fu…

1.2.1-2部分数据结构的说明02_链表

&#xff08;1&#xff09;链表数据结构&#xff1a; 概念&#xff1a; 将列表中相互连接的节点不连续的存储在内存中。与数据不同&#xff0c;我们无法再恒定时间内访问任何元组&#xff0c;如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…

什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系

我不知道有多少人和我一样&#xff0c;没学习过.netCore&#xff0c;想要学习&#xff0c;但是版本号太多就蒙了&#xff0c;不知道学什么了&#xff0c;这里解释下各个版本的关系 我们一般开始学习微软的时候&#xff0c;都是开始学习的.netframework&#xff0c;常用的就是4…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…

S32K144 UDSdoCAN 升级刷写实现笔记

文章目录 1. 摘要2. 开发环境搭建2.1 开发板2.2 IDE 安装2.3 更新扩展包2.4 烧录仿真测试2.4.1 新建工程2.4.2 导入已有工程2.4.3 编译工程2.4.4 硬件连接2.4.5 Debug2.4.6 添加 .c .h 文件2.5 串口配置2.5.1 时钟2.5.2 GPIO2.5.3 定时器2.5.4 uart 工程2.5.5 烧录验证3. 升级原…

《信息收集是这样吗?》

信息收集 前置&#xff1a;渗透思路&#xff1a; 1&#xff0c; 信息收集 2&#xff0c; 漏洞扫描 3&#xff0c; 漏洞挖掘 4&#xff0c; 开始攻击 5&#xff0c; 权限维持&#xff08;持久化&#xff09; 6&#xff0c; 权限提升 7&#xff0c; 免杀隐藏 8&#xff…

[深度学习] 大模型学习1-大语言模型基础知识

大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一类基于Transformer架构的深度学习模型&#xff0c;主要用于处理与自然语言相关的各种任务。简单来说&#xff0c;当用户输入文本时&#xff0c;模型会生成相应的回复或结果。它能够完成许多任务&…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送&#xff0c;需要注意的是发送的16进制数前面要加入0x标志。只有这样&#xff0c;realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入&#xff0c;第一个参数为字符串&#xff0c;第二个参数为发送形式&…

【C++】B2099 矩阵交换行

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 &#x1f4af;题目分析&#x1f4af;不同解法分析我的做法实现步骤&#xff1a;优点&#xff1a;不足&#…

HTML5实现好看的博客网站、通用大作业网页模板源码

HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码&#xff0c;博客网站源码&#xff0c;HTML模板源码&#xff0…

动态规划六——两个数组的dp问题

目录 题目一——1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目二——1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 题目三——115. 不同的子序列 - 力扣&#xff08;LeetCode&#xff09; 题目四—— 44. 通配符匹配 - 力扣&#xff08;…

大模型与EDA工具

EDA工具&#xff0c;目标是硬件设计&#xff0c;而硬件设计&#xff0c;您也可以看成是一个编程过程。 大模型可以辅助软件编程&#xff0c;相信很多人都体验过了。但大都是针对高级语言的软件编程&#xff0c;比如&#xff1a;C&#xff0c;Java&#xff0c;Python&#xff0c…

单片机-串转并-74HC595芯片

1、74HC595芯片介绍 74HC595 是一个 8 位串行输入、并行输出的位移缓存器&#xff0c;其中并行输出为三态输出&#xff08;即高电平、低电平和高阻抗&#xff09;。 15 和 1 到 7 脚 QA--QH&#xff1a;并行数据输出 9 脚 QH 非&#xff1a;串行数据输出 10 脚 SCLK 非&#x…

融乐 1.1.6 | 拥有海量音乐资源的第三方音乐软件,支持无损音质下载

融乐Music是一款界面优美的第三方音乐软件&#xff0c;提供海量音乐资源。用户可以通过分类和搜索轻松找到想要的歌曲&#xff0c;并享受在线畅听和下载无损音质的功能。首页设有推荐歌单、精选和排行榜&#xff0c;帮助用户发现更多好音乐。此外&#xff0c;还支持设置歌词大小…

面试场景题系列:设计搜索自动补全系统

当我们在谷歌上搜索或者在亚马逊上购物时,只要在搜索框中打字,网页上就会展示一个或者更多的与搜索词匹配的结果。这个功能叫作自动补全(Autocomplete)、提前输入(Typeahead)、边输边搜(Search-as-you-type)或者增量搜索(Incremental Search)。图-1展示了一个谷歌搜索的示例,…

Leetcode打卡:设计一个ATM机器

执行结果&#xff1a;通过 题目 2241 设计一个ATM机器 一个 ATM 机器&#xff0c;存有 5 种面值的钞票&#xff1a;20 &#xff0c;50 &#xff0c;100 &#xff0c;200 和 500 美元。初始时&#xff0c;ATM 机是空的。用户可以用它存或者取任意数目的钱。 取款时&#xff0c…

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…

在 IPhone 上检查 Safari 浏览历史记录的 5 种方法

与其他网络浏览器一样&#xff0c;Safari 会保留您的浏览历史记录&#xff0c;以便您可以输入之前访问过的网页。这是一个方便的功能。 但是如何在iPhone上查看已删除的浏览历史记录呢&#xff1f; 不用担心&#xff01;在本文中&#xff0c;我们将列出 5 个经过验证的选项&a…

使用Apache Mahout制作 推荐引擎

目录 创建工程 基本概念 关键概念 基于用户与基于项目的分析 计算相似度的方法 协同过滤 基于内容的过滤 混合方法 创建一个推荐引擎 图书评分数据集 加载数据 从文件加载数据 从数据库加载数据 内存数据库 协同过滤 基于用户的过滤 基于项目的过滤 添加自定…