首页 > 其他分享 >JVM:对象一定在堆中分配吗?

JVM:对象一定在堆中分配吗?

时间:2023-08-06 10:04:46浏览次数:40  
标签:对象 逃逸 JVM 标量 优化 分配

Java 中的对象实例在大多数情况下都是在堆内存中分配的。堆是 JVM 所管理的内存中最大的一块区域,主要用于存放对象实例和数组。然而,有一些优化技术,如逃逸分析和标量替换,使得并非所有对象都在堆上分配。

逃逸分析(Escape Analysis)是一种优化技术,用于分析对象动态作用域。如果一个对象在方法中被定义,且该对象的引用没有被外部方法或线程所引用(也就是没有“逃逸”出方法或线程),那么这个对象可能会被优化为在栈上分配。这样做可以减少垃圾收集的开销,并提高内存分配的效率。需要注意的是,逃逸分析是 HotSpot JVM 中的一项优化功能,并不是所有 JVM 或所有 Java 版本都支持。

标量替换是另一种优化技术,用于将一个聚合的对象(如一个 Java 对象,包含多个字段)替换为多个单独的标量(如整型、浮点型等)。如果一个对象没有逃逸出方法或线程,那么 JVM 可以选择不在堆上分配该对象,而是将其拆分为多个单独的标量,这些标量可以存放在寄存器或栈上。这样做可以减少内存分配和访问的开销。

以下是一个逃逸分析的示例,但请注意,是否真正进行逃逸分析并在栈上分配对象,取决于 JVM 的实现和当前的 JVM 参数配置:

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        main.createLocalObject();
    }

    void createLocalObject() {
        // 该对象没有逃逸出 createLocalObject() 方法
        // JVM 可能会优化为在栈上分配该对象
        LocalObject localObject = new LocalObject();
        System.out.println(localObject.getValue());
    }

    class LocalObject {
        private int value = 0;

        int getValue() {
            return value;
        }
    }
}

在这个例子中,LocalObject 对象只在 createLocalObject() 方法中使用,且其引用没有逃逸出该方法,因此 JVM 可能会优化为在栈上分配该对象。

需要注意的是,开发者一般无法直接控制对象是在堆上分配还是在栈上分配。这是由 JVM 根据具体情况进行的优化决策。开发者应当主要关注编写清晰、简洁、有效的代码,而不是试图手动优化内存分配。


标签:对象,逃逸,JVM,标量,优化,分配
From: https://blog.51cto.com/u_12749768/6981655

相关文章

  • 1-1 对象特性
    1new和deletenew的返回值是对应数据类型的地址,数组时返回首地址delete之后再让指针指向NULL是一个很好的习惯int*p=newint(10);deletep;int*arr=newint[10];//开一个10个元素的数组,访问数组时与正常数组一样使用,例如元素arr[3]delete[]arr;//释放数组时加一个......
  • JAVA SE基础《八》 ---- 面对对象编程
    目录一、面向对象编程快速入门二、深刻认识面向对象三、对象在计算机中的执行原理四、类和对象的一些注意事项五、其他语法:this六、其他语法:构造器七、其他语法:封装八、其他语法:实体JavaBean九、面向对象编程综合案例十、补充知识:成员变量、局部变量的区别小结 前言......
  • python的类方法--实例对象方法
    https://blog.csdn.net/weixin_60535956/article/details/127432990  方法区别若要修改实例的属性值,直接使用实例方法。若要修改类的属性值,直接使用类方法若是辅助功能(如打印菜单等),考虑使用静态方法,即可在不创建对象的前提下使用。注意:使用类名不能访问实例属性或实例......
  • 判断对象是否为空,包括里面的属性,如果里面的属性是空,也是空
    publicstaticbooleanisNoEmptyBean(Objectbean){if(null==bean){returnfalse;}for(Fieldfield:ReflectUtil.getFields(bean.getClass())){if(ModifierUtil.isStatic(field)){con......
  • JVM常见参数
    一、JVM参数大致可以分为三类1、标准指令:-开头,这些所有的HotSpot都支持的参数,可以用java-help打印出来.-verbose:gc:用于输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断-verbose:class:输出每次GC的相关情况-verbose:jni:输出native方法调用的相关情......
  • JS中BOM事件,JS样式特效,表格对象和表单操作
    DOM事件1.DOM中的事件可以分为两类1.浏览器行为如:文档加载完成,图片加载完成2.用户行为如:输入框输入数据,点击按钮(2).常见的DOM事件onload浏览器已完成页面的加载支持事件的对象windowimageonchangeHTML元素改变onclick用户点击HTML元素o......
  • 数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践
    数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践原创酷哥[openGauss](javascript:void(0);)2022-11-0718:03发表于广东9月30日新发布的openGauss3.1.0版本,工具的全量迁移和增量迁移的性能不但有了全面提升,而且支持数据库对象视图、触发器、自定义函数、存储过程的......
  • 参考示例之“复制对象|拷贝对象|BeanUtils工具类学习”
    //设置需要拷贝的字段Set<String>targetSet=newHashSet<>();targetSet.addAll(Arrays.asList("totalRefund","actualAdvertisingCost","expensesOfTaxation"));//调用拷贝方法copyProperties(com......
  • 第十六节 面向对象进阶(多态&包&final&权限修饰符&代码块)
    今日内容多态包final权限修饰符代码块教学目标能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型能够知道多态的使用场景包的作用public和private权限修饰符的作用描述final修饰的类的特点描述final修饰的方法的特点......
  • 《深入理解Java虚拟机》读书笔记:HotSpot虚拟机对象探秘
    基于实用优先的原则,以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。以下是本节内容的脑图。 HotSpot虚拟机对象探秘脑图 一、对象的创建创建对象大致分为5步:1.检查类是否加载,没有加载先加载类2.分配内......