java对象在内存中的存储分析

Posted by Epoch Blog on July 22, 2020

基础介绍

本文主要分析Java对象在内存中的分析占用情况,将从对象,Map,数组,字符串等全方面来阐述相关内容。 Java是面向对象语言,有着一切皆为对象之称,但是存储基础数据的类型,在设计之初并非对象,比如存储数字,字符,小数等,因此有了基本类型,融合到了Java,使得开发更为方便。

初学Java的时候,我们知道基础类型有以下几种

类型 描述 字节数
short 无符号整数,最大值2^15-1(32767),最小值-2^15(-32768) 2字节
byte 无符号整数,最大值2^7-1(127)最小值是-2^7(-128) 1字节
int 无符号整数,最大值2^31-1(2147483647)最小值是-2^31(-2147483648)Java声明整数默认为int 4字节
long 无符号整数,最大值2^63-1(9,223,372,036,854,775,807)最小值是-2^63(-9,223,372,036,854,775,808)声明必须加L(l) 8字节
float 单精度,在存储大浮点数组的时候节省空间,声明必须加F(f) 4字节
double 双精度,Java小数默认为double类型,声明可加D(d)或者 不加 8字节
boolean 记录是否,只有true或者flase俩种情况。默认值为false。 1字节
char 单一的Unicode字符,最小值为\u0000(0),最大值为\uffff(65535),可以存储任何字符 2字节

除了以上常用的基础类型以外,Java针对字符串,超级大整数也做了相关处理,提供了类来进行调用。

类型 描述 字节
String String用于存储字符串,不限制大小,但是因为String是不可变的,因此改变String的字符串其实为改变地址。 与字符串数目有关系
StringBuilder 可变字符串,可以操作同一个字符串增加或者移除等操作,线程安全使用StringBuffer 与字符串数目有关系
BigDecimal 通过BigDecimal num1 = new BigDecimal(“1221”);赋值,计算加减乘除,加法add,减法substract,乘法multiply,除法divide,绝对值abs,计算时注意保留小数  

对象存储

在Java中我们调用一个方法的时候,会有俩种途径,通过对象调用其所属方法,或者通过类调用其静态方法。其实,无论是对象,或者类都属于对象,也就是我们调用的时候,都需要找到对象,才能够调用对象所属方法。 那么,当我们创建一个对象的时候,Java做了哪些操作呢?存储了哪些内容呢? 我们知道,使用一个类的时候,该类是一定要先必加载字节码的,否则无法使用,这是第一步。 第二部,当我们在调用方法的时候,需要拿到调用方对象,也就是我们必须是创建