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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

vue 项目集成 electron 和 electron 打包及环境配置

vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D&#xff0c;electron 需添加到devDependencies&#xff0c;如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹&#xff0c;在electron文件夹创建main.js&#xff08;或者backgrou…

VMware镜像站加速下载,省去下载等待时间

CDS Repository - /var/www/public/stage/session-02/cds/vmw-desktop/ws 这个还挺快&#xff0c;选择想要的版本&#xff0c;下载tar包就完事了&#xff0c;省去了下某云盘客户端又要被限流的麻烦

Go 语言:Jank 简客博客系统

Jank 简客博客系统 什么&#xff1f;最近我开源了一个项目&#xff1f; Jank 是一个轻量级的博客系统&#xff0c;基于 Go 语言和 Echo 框架开发&#xff0c;设计理念强调极简、高效和高扩展性&#xff0c;旨在为用户提供功能丰富、界面简洁、操作简单且安全可靠的博客体验。…

leecode1143.最长公共子序列

这道题目和最长重复子数组是一个类型的不同之处在于text1[i]!text2[j]时dp[i][j]时他的值是继承上一行或上一列的最大值&#xff0c;二者dp数组的含义也不一样&#xff0c;这里的dp[i][j]表示的是以text[i]和text2[j]为结尾的子序列最大长度&#xff0c;这也是导致两种问题当判…

通过 4 种方式快速将音乐从 iPod 传输到 Android

概括 在 iPod 上听音乐很酷&#xff0c;但是当您拥有最新的 Android 手机时&#xff0c;也许您想在新手机上欣赏 iPod 音乐。那么&#xff0c;你的计划是什么&#xff1f;如何将音乐从 iPod 传输到 Android&#xff1f; 如果您担心这个问题&#xff0c;请看看下面的方法。他们…

flutter在windows平台中运行报错

PS D:\F\luichun> flutter run当运行flutter项目时&#xff0c;【解决如下报错】 /C:/flutter/packages/flutter/lib/src/painting/star_border.dart:530:27: Error: The getter Matrix4 isnt defined for the class _StarGenerator.- _StarGenerator is from package:flut…

[python3]Excel解析库-xlrd

xlrd 是一个用于从 Excel 文件中读取数据的 Python 库&#xff0c;主要用于处理 .xls 文件&#xff08;即 Excel 97-2003 格式&#xff09;。它允许你用 Python 编写程序来解析和提取 Excel 文件中的信息&#xff0c;而无需实际运行 Microsoft Excel 应用程序。需要注意的是&am…

Docker Compose编排

什么是 Docker Compose? Docker Compose 是 Docker 官方推出的开源项目&#xff0c;用于快速编排和管理多个 Docker 容器的应用程序。它允许用户通过一个 YAML 格式的配置文件 docker-compose.yml 来定义和运行多个相关联的应用容器&#xff0c;从而实现对容器的统一管理和编…

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗&#xff1f; 一. JVM、JDK与JRE的关系二. JVM、JDK与JRE的作用2.1 什么是JVM&#xff1f;2.2 什么是JDK&#xff1f;2.3 什么是JRE&#xff1f; 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有…

上下游服务间解耦的技术与管理

一、解耦为何至关重要 在当今软件研发的复杂生态中&#xff0c;耦合问题如影随形&#xff0c;困扰着众多开发者与企业。当多个模块、系统或团队紧密交织&#xff0c;相互依赖程度不断攀升&#xff0c;仿佛一张错综复杂的网&#xff0c;牵一发而动全身。就拿电商系统来说&#…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同&#xff0c;我们收集了2000多种不同零售产品的35万张图像&#xff0c;这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究&#xff0c;该研究具…

【踩坑指南:2025年最新】如何在Linux(Ubuntu)启动第一个Scala Hello World程序(Scala3)

如何正确地写出Scala的第一个程序&#xff0c;并且利用Scala3的简洁特性&#xff1f; 在解释器中直接输出Hello world非常简单&#xff0c;只需要直接执行即可&#xff1a; scala> println("Hello World") Hello World 但如果我们希望编写一个脚本文件&#xf…

Spark大数据处理引擎详解

一、概念 Spark是一种快速、通用、可扩展的大数据分析引擎&#xff0c;它基于内存计算的大数据并行计算框架&#xff0c;能够显著提高大数据环境下数据处理的实时性&#xff0c;同时保证高容错性和高可伸缩性。Spark于2009年诞生于加州大学伯克利分校AMPLab&#xff0c;2010年…

服务器数据恢复—离线盘数超过热备盘数导致raidz阵列崩溃的数据恢复

服务器数据恢复环境&故障&#xff1a; 一台配有32块硬盘的服务器在运行过程中突然崩溃不可用。经过初步检测&#xff0c;基本上确定服务器硬件不存在物理故障。管理员重启服务器后问题依旧。需要恢复该服务器中的数据。 服务器数据恢复环境&#xff1a; 1、将服务器中硬盘…

JVM之Java内存模型

Java内存模型&#xff08;Java Memory Model&#xff0c;简称JMM&#xff09;是Java虚拟机&#xff08;JVM&#xff09;规范中定义的一套规则&#xff0c;用于描述多线程环境下变量如何被访问和同步。在多线程编程中&#xff0c;内存模型的重要性不言而喻&#xff0c;它直接关系…

用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效

一、引言 跨年夜,五彩斑斓、绚丽绽放的烟花是最令人期待的视觉盛宴之一。在网页端,我们能否通过技术手段复现这一梦幻场景呢?答案是肯定的。本文将深入剖析一段使用 HTML5 Canvas 和 JavaScript 实现的跨年烟花特效源码,带你领略前端技术创造的惊艳画面。 用 HTML5 Canvas…

安装教程:慧集通集成平台(DataLinkX)智能体客户端安装操作(Linux/windows/mac)

1.下载客户端 使用提供的账号登录集成平台后台(https://www.datalinkx.cn/),点击左侧菜单栏【智能体】→【智能体】进入到智能体列表界面&#xff0c;在该界面我们找到功能栏中的下载按钮点击则会弹出下载界面&#xff0c;在该界面我们可以选择不同的系统操作系统来下载对应版…

067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】

课程培训包含&#xff1a;发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习&#xff0c;学员可以掌握Biomod2模型最新版本的使用方法&#xff0c;最新版包含12个模型&#xff08;ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…

【Spring】Spring DI(依赖注入)详解—集合类型的注入——List、Set、Map的配置与注入

一、引言 Spring依赖注入不仅能简化对象的创建和管理&#xff0c;还能使得代码更加灵活和可维护。尤其是在处理集合类型的依赖时&#xff0c;Spring的DI机制提供了更为灵活的方式来管理和注入多个依赖。 1.1 依赖注入的重要性 在大型应用中&#xff0c;类与类之间的关系往往…