Java对象内存分配流程

news2024/11/19 6:21:25

文章目录

  • 一、前言
  • 二、Java对象内存分配流程
    • 2.1、分配流程
    • 2.2、什么是逃逸分析?
      • 2.2.1逃逸分析主要关注两个方面的信息:
      • 2.2.2逃逸分析的好处包括:
      • 2.2.3、为什么要分配到栈上?
    • 2.3、什么是大对象?
    • 2.4、什么是TLAB?
  • 三、总结

一、前言

Java对象内存分配流程是Java虚拟机(JVM)中的重要过程,它负责在堆内存和栈内存中分配对象的空间,并管理对象的生命周期。本文将详细介绍Java对象内存分配流程,帮助大家更好地理解JVM的工作原理。

二、Java对象内存分配流程

2.1、分配流程

在这里插入图片描述
在Java中,当创建一个新的对象实例时,JVM会执行new指令。这个指令会触发Java对象内存分配流程。

首先,JVM会进行逃逸分析,以确定该对象是否有可能被外部访问或共享。如果逃逸分析表明该对象只在其方法内部被引用,那么该对象可以在堆栈上分配内存。这样可以减少堆内存的分配,并且不需要进行垃圾回收。

如果逃逸分析表明该对象可能在多个线程中被共享,那么该对象将在堆内存中分配内存。这样可以避免对该对象的线程安全访问,从而提高程序的性能。

如果对象没有逃逸,且栈空间足够,则JVM会首选打散后栈上分配。打散是指将对象分配到多个栈帧中,以避免栈溢出。

如果栈上分配失败,则JVM会尝试堆中线程专属内存块分配。每个线程都有一块专属内存,避免多线程同步申请空间。

如果堆中线程专属内存块分配失败,则JVM会判断是否触发条件直接进入老年代。一般尽量避免这种情况出现。

如果未触发直接进入老年代条件,则JVM会进行新生代分配。首先尝试分配到TLAB(Thread Local Allocation Buffer),如果TLAB足够,则分配成功。

如果TLAB不够,则JVM会进行YGC(Young Generation Collection),回收新生代中的大多数对象,回收后如果还有空间,则对象继续分配到新生代中。

随着对象不断创建,新生代空间会逐渐减少,当达到一定条件时,进行FGC(Full GC),回收整个堆中的对象。

在垃圾回收过程中,年龄足够大的对象会被移动到老年代。老年代满了之后进行FGC,回收整个堆中的对象。

2.2、什么是逃逸分析?

逃逸分析是一种有效的减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。它通过分析对象的动态作用域,判断对象是否有可能被外部访问或共享,从而决定是否需要将对象分配到堆上。

2.2.1逃逸分析主要关注两个方面的信息:

  1. 局部性逃逸:一个对象是否只在其方法内部被引用,而不会被方法外部引用。如果一个对象只在其方法内部被引用,那么该对象可以被存储在该方法的堆栈上,而不是在堆中。这样可以减少堆内存的分配,并且不需要进行垃圾回收。
  2. 线程逃逸:一个对象是否可能在多个线程中被共享。如果一个对象只在单个线程中引用,那么该对象可以被存储在堆栈上,而不是在堆中。这样可以避免对该对象的线程安全访问,从而提高程序的性能。

2.2.2逃逸分析的好处包括:

  1. 栈上分配,可以降低垃圾收集器运行的频率。
  2. 同步消除,如果发现某个对象只能从一个线程可访问,那么在这个对象上的操作可以不需要同步。

逃逸分析是一种静态分析技术,它通过对代码的静态分析来推断对象的作用域和生命周期。虽然逃逸分析可以提供一些有用的优化信息,但它也存在一些限制和挑战,需要谨慎使用。例如,逃逸分析可能无法处理一些动态的引用关系,或者在某些情况下可能会产生错误的优化结果。

2.2.3、为什么要分配到栈上?

  • 分配和释放速度快:在栈上分配内存比在堆上分配内存要快得多,因为栈是连续的内存空间,不需要进行内存分配和释放的操作。
  • 减少内存碎片:在堆上分配内存时,由于不同对象的生命周期可能不同,会导致内存碎片化。而栈上的对象由于生命周期相同,因此不会产生内存碎片。
  • 便于调试:栈上的对象生命周期较短,因此便于调试和管理。

2.3、什么是大对象?

大对象是指需要大量连续内存空间的对象,比如过长的字符串、数组等。在Java对象内存分配流程中,大对象会直接分配到老年代,而不会经过新生代。这是因为避免为大对象分配内存时的复制操作而降低效率。

具体来说,当JVM在堆内存中分配内存时,会根据对象的年龄和大小选择不同的区域。对于大对象,JVM会直接将其分配到老年代,而不是新生代。这是因为大对象需要连续的内存空间,而新生代中的Eden区和Survivor区都是非连续的内存空间,因此无法满足大对象的内存分配需求。

为了避免程序中出现过多的大对象,影响内存分配效率,JVM会设置一个阈值,通过-XX:PretenureSizeThreshold参数来设置。当对象大小超过该阈值时,就会触发大对象直接分配到老年代的机制。

需要注意的是,只有Serial和ParNew两个垃圾收集器会使用这个参数来控制大对象的内存分配。其他垃圾收集器会使用不同的参数来控制大对象的内存分配。

2.4、什么是TLAB?

TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域。由于对象一般会分配在堆上,而堆是全局共享的,因此在同一时间,可能会有多个线程在堆上申请空间。因此,每次对象分配都必须要进行同步(虚拟机采用CAS配上失败重试的方式保证更新操作的原子性),而在竞争激烈的场合分配的效率又会进一步下降。JVM使用TLAB来避免多线程冲突,在给对象分配内存时,每个线程使用自己的TLAB,这样可以避免线程同步,提高了对象分配的效率。
简单说,TLAB是为了避免多线程争抢内存,在每个线程初始化的时候,就在堆空间中为线程分配一块专属的内存。自己线程的对象就往自己专属的那块内存存放就可以了。这样多个线程之间就不会去哄抢同一块内存了。这是一块每个线程私有的内存分配区域,它存在于Eden区,TLAB空间的内存非常小,仅占有整个Eden空间的1%。jdk8默认使用的就是TLAB的方式分配内存。

三、总结

Java对象内存分配流程的目的是为了管理Java对象的生命周期,避免内存泄漏和不必要的内存占用,同时提高程序性能。了解Java对象内存分配流程可以帮助我们更好地理解JVM的工作原理,从而优化程序性能和减少内存消耗。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

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

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

相关文章

微服务-kubernetes安装

文章目录 一、前言二、kubernetes2.1、Kubernetes (K8S) 是什么2.1.1、主要特性:2.2.2、传统部署方式:2.2.3、虚拟机部署2.2.4容器部署2.2.5什么时候需要 Kubernetes2.2.6、Kubernetes 集群架构 三、kubernetes安装3.1、主节点需要组件3.1.1、设置对应主…

SpingMvc入门

SpingMvc入门 1.MVC Spring的工作流程:2.sping mvc入门3.静态资源处理 前言 Spring MVC是一种基于Java的web应用开发框架,它采用了MVC(Model-View-Controller)设计模式来帮助开发者组织和管理应用程序的各个组件。 1.MVC Spring的…

Spring Security安全登录的调用过程以及获取权限的调用过程

1.第一次登录时候调用/user/login整个流程分析 (0)权限授理 首先调用SecurityConfig.java中的config函数将jwtAuthenticationTokenFilter过滤器放在UsernamePasswordAuthenticationFilter之前 Override protected void configure(HttpSecurity http) throws Exception{......…

2023-9-4 欧拉函数

题目链接&#xff1a;欧拉函数 #include <iostream>using namespace std;int main() {int n;cin >> n;while(n --){int x;cin >> x;int res x;for(int i 2; i < x / i; i){if(x % i 0){res res / i * (i - 1); // 公式 N * (1 - 1 / p1) * (1 - 1/ p2…

R语言应用interactionR包进行亚组相加交互作用分析

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化&#xff0c;两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的&#xff1a;乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于&#xff08;…

kubernetes常见面试问题详解

在面试的时候&#xff0c;面试官常常会问一些问题&#xff1a; k8s是什么&#xff1f;有什么用?k8s由哪些组件组成&#xff1f;pod的启动流程&#xff1f;k8s里有哪些控制器&#xff1f;k8s的调度器里有哪些调度算法&#xff1f;pod和pod之间的通信过程&#xff1f;外面用户访…

规避【虚拟专线技术】使用风险实现业务系统安全

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 一、技战法描述 VPN是利用Internet等公共网络基础设施&#xff0c;通过隧道加密通信技 术&#xff0c;为用…

Linux中的多线程剖析

目录 1、前言 2、多线程理解 2.1 线程 2.2 通俗了解进程和线程 2.2.1 进程是资源分配的基本单位 2.2.2 Linux中的线程是一种轻量化进程 2.3 进程和线程详解 2.3.1 创建一个线程 (pthread_create) 2.3.2 线程自己的一部分数据 2.3.3 线程组 2.3.4 关于进程的其他操作…

Android之RecyclerView仿ViewPage滑动

文章目录 前言一、效果图二、实现步骤1.xml主布局2.所有用到的drawable资源文件3.xml item布局4.adapter适配器5.javabean实体类6.activity使用 总结 前言 我们都知道ViewPageFragment滑动&#xff0c;但是的需求里面已经有了这玩意&#xff0c;但是在Fragment中还要有类似功能…

Springboot + Sqlite实战(离线部署成功)

最近有个需求&#xff0c;是手机软件离线使用&#xff0c; 用的springboot mybatis-plus mysql&#xff0c;无法实现&#xff0c;于是考虑使用内嵌式轻量级的数据库SQLlite 引入依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-…

手写Mybatis:第10章-使用策略模式,调用参数处理器

文章目录 一、目标&#xff1a;参数处理器二、设计&#xff1a;参数处理器三、实现&#xff1a;参数处理器3.1 工程结构3.2 参数处理器关系图3.3 入参数校准3.4 参数策略处理器3.4.1 JDBC枚举类型修改3.4.2 类型处理器接口3.4.3 模板模式&#xff1a;类型处理器抽象基类3.4.4 类…

drone的简单使用

&#xff08;一&#xff09;简介 Drone 是一个基于Docker容器技术的可扩展的持续集成引擎&#xff0c;用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行&#xff0c;使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件&…

Java“牵手”唯品会商品列表数据,关键词搜索唯品会商品数据接口,唯品会API申请指南

唯品会商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取唯品会商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问唯品会商城的网页来获取商品详情信息。以下是两种常用方法的介…

《智能网联汽车自动驾驶功能测试规程》

一、 编制背景 2018 年4 月12 日&#xff0c;工业和信息化部、公安部、交通运输部联合发布《智能网联汽车道路测试管理规范(试行)》&#xff08;以下简称《管理规范》&#xff09;&#xff0c;对智能网联汽车道路测试申请、审核、管理以及测试主体、测试驾驶人和测试车辆要求等…

webpack5 (三)

webpack 高级配置 其实就是对 webpack 进行优化&#xff0c;让代码在编译/运行时性能更好 1. 提升开发体验 2. 提升打包构建速度 3. 减少代码体积 4. 优化代码运行性能 一、提升开发体验 sourcemap 在编译打包后所有的 css 和 js 都合并为了一个文件&#xff0c;并多了很多…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理

角度——⛲️ 一、考点讲解 分类计数原理&#xff08;加法原理&#xff09; (1&#xff09;定义 如果完成一件事有n类办法&#xff0c;只要选择其中一类办法中的任何一种方法&#xff0c;就可以完成这件事。若第一类办法中有 m 1 m_1 m1​种不同的方法&#xff0c;第二类办法中…

SpringCloud(35):Nacos 服务发现快速入门

本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud 应用程序与 Nacos 的无缝集成。 通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务。 1 Spring…

uniapp集成windicss的流程

一、背景介绍 Windicss是一个基于Tailwind CSS 灵感的库,它更快、更兼容,使用 TypeScript 构建。Windicss的目标是为了解决与Tailwind CSS 类似的问题,提供一个可以快速上手开发的组件库,让开发者不再需要繁琐地编写 CSS 样式。Windicss包含了几乎所有的 CSS 样式,因此开发…

MongoDB常用的比较符号和一些功能符号

比较符号 results collection.find({age: {$gt: 20}})功能符号 results collection.find({name: {$regex: ^M.*}})

联合教育部高等学校科学研究发展中心,阿依瓦科技创新教育专项正式发布!

7 月 24 日&#xff0c;教育部科技发展中心官网发布了《中国高校产学研创新基金&#xff0d;阿依瓦科技创新教育专项申请指南》。 针对高校在人工智能、智能制造、智慧校园、大数据等领域科研和教研的创新研究&#xff0c;教育部高等学校科学研究发展中心与阿依瓦(北京)技术有…