sqlserver2008未将对象引用设置到对象的实例_天天都是面对对象编程,你真的了解你的对象吗?...

本文深入探讨Java对象的理解,包括逃逸分析、标量替换、锁消除和指针压缩等优化技术,以及对象在内存中的分配、初始化和大小计算。通过实例展示了开启和关闭逃逸分析及指针压缩对对象内存占用的影响。
摘要由CSDN通过智能技术生成

Java是一种面向对象的编程语言,详细自己对对象的理解是否只有一句话来描述:一切皆对象,new出来的对象都在堆上!等等,这不是2句话?不,后面这句只是我写这篇文章的原由。初学Java大家都说new出来的对象都在堆上,对此深信不疑!但是后续越发对这句话产生怀疑,想想每个类的toString方法都会new一个StringBuffer,这样做堆内存岂不是增大一倍?For循环中创建对象为什么没有堆溢出?创建的对象到底在堆中占用多少内存?怀着以上疑问往下看,本篇文章作为Java对象的综合整理来描述何谓对象。

Java中一切皆对象,对象的创建主要如下:

People people = new People();

现在面试都是各种文字坑,例如:问这个对象是否在堆上分配内存?怎么回答,是?不是?

这个问题,要根据上下文来回答,就是要根据这行代码所处的环境来回答,何谓环境:运行环境JRE、书写位置,不同环境结果不一样。想知道结果,先Get到以下知识点:

逃逸分析是JDK6+版本后默认开启的技术(现在都JDK15了,都是旧技术了==!),主要分析方法内部的局部变量的引用作用域,用于做后续优化。逃逸分析之后一个方法内的局部变量被分为3类逃逸对象

  • 全局逃逸对象: 对外部而言,该对象可以在类级别上直接访问到(调用类获取对象实例)
  • 参数逃逸对象:对外部而言,该对象可以在方法级别上直接访问到(调用方法获取对象实例)
  • 未逃逸对象:对外部而言,该对象仿佛不存在一样,不可嗅探

后续优化指的是对未逃逸的优化,主要分为标量替换和锁消除

标量替换:在Java中8种基本数据类型已经是可以直接分配空间的,不可再被细化,称为标准变量,简称标量。对象的引用是内存地址也不可再被细化,也可以称为标量。而Java对象则是由多个标量聚合而来,称为聚合量。按照这种标准将Java对象的成员变量拆分替换为标量的过程,称为标量替换。这个过程会导致对象的分配不一定在堆中,而是在栈上或者寄存器中。

锁消除:Java锁是针对多线程而使用的,当在单线程环境下使用锁后被JIT编译器优化后就会移除掉锁相关代码,这个过程就是锁消除(属于优化,不影响对象)。

指针压缩:32位机器对象的引用指针使用32位表示,在64位使用64位表示,同样的配置而内存占用增多,这样真的好吗?JDK给出指针优化技术,将64位(8字节)指针引用(Refrence类型)压缩为32位(4字节)来节省内存空间。

对象的逃逸

一个标准大小=32byte的Java对象(后面会写如何计算)

class People {    int i1;    int i2;    int i3;    byte b1;    byte b2;    String str;}

未逃逸对象

public class EscapeAnalysis {    public static void main(String[] args) throws IOException {        // 预估:在不发生GC情况下32M内存        for (int j = 0; j < 1024 * 1024; j++) {            unMethodEscapeAnalysis();        }        // 阻塞线程,便于内存分析        System.in.read();    }    /**     * people对象引用作用域未超出方法作用域范围     */    private static void unMethodEscapeAnalysis() {        People people = new People();        // do  something    }}

未开启逃逸分析

启动JVM参数

-server -Xss108k -Xmx1G -Xms1G -XX:+PrintGC -XX:-UseTLAB -XX:-DoEscapeAnalysis -XX:-EliminateAllocations
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值