返回顶部
首页 > 资讯 > 后端开发 > Python >java各种类型对象占用内存情况分析
  • 859
分享到

java各种类型对象占用内存情况分析

2024-04-02 19:04:59 859人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言基本数据类型占用包装类型占用基本类型数组占用封装类型数组占用String占用内存前言 其实一般的程序猿根本不用了解这么深,只有当你到了一定层次,需要了解JVM内部运行机制,或

前言

其实一般的程序猿根本不用了解这么深,只有当你到了一定层次,需要了解JVM内部运行机制,或者高并发多线程下,你写的代码对内存有影响,你想做性能优化。等等等等,一句话,当你想深入了解java对象在内存中,如何存储,或者每个对象占用多大空间时,你会感谢这篇文章

本文主要分析jvm中的情况,实验环境为64位window10系统、jdk1.8,使用JProfiler进行结论验证

很多描述以及 概念是基于你懂基本java知识的,如果你看起来有点吃力,要加油咯

本片更偏重验证,更多理论,请参考:https://segmentfault.com/a/1190000006933272

内存公式:Java对象的内存布 = 对象头(Header) + 实例数据(Instance Data) + 补齐填充(Padding)。

补齐填充:Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数

Shallow Size

对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。

Retained Size

Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

基本数据类型占用

类型 占用空间
boolean、byte 1byte
short、char 2byte
int、float 4byte
long、double 8byte

接下来用JProfiler验证:

1.新建一个空对象,观察空对象内存占用


public class TestObject {
}

对象占用内存 16b,如图

结论:一般自建空对象占用内存 16b,16 = 12(Header) + 4(Padding)

2.在TestObj中新增一个 int 属性,观察对象内存占用


public class TestObj {
    private int i;

}

对象占用内存 16b,如图

结论:int 占用 4b, 16 = 12(Header) + 4(int)

3.在TestObj中新增一个 long 属性,观察对象内存占用


public class TestObj {
    private long i;

}

对象占用内存 24b,如图

结论:long 占用 8b, 24 = 12(Header) + 8(long) + 4(Padding)

其余基本类型可以参照以上自行验证,原理一样

包装类型占用

包装类(Boolean/Byte/Short/Character/Integer/Long/Double/Float)占用内存的大小 = 对象头大小 + 底层基础数据类型的大小

包装类和其他引用类一样,会产生一个引用(reference)

类型 占用空间
Boolean、Byte 16byte
Short、Char 16byte
Integer、Float 16byte
Long、Double 24byte

1.在TestObj中新增一个 Integer 属性,观察对象内存占用


public class TestObj {
   private Integer  i =128;

}

对象占用内存 32b,如图

结论:Integer 占用 16b, 32 = 12 (Header) + 16(Integer) + 4(reference)

特别的:-128~127 在常量池,只占用 4b,且不产生引用(reference)

2.在TestObj中新增一个 Long 属性,观察对象内存占用


public class TestObj {
   private Long  l = new Long(1);

}

对象占用内存 40b,如图

结论:Long 占用 24b, 40 = 12 (Header) + 24(Long) + 4(reference)

其余包装类型可以参照以上自行验证,原理一样

基本类型数组占用

64位机器上,数组对象的对象头占用24 bytes,启用压缩后占用16字节。比普通对象占用内存多是因为需要额外的空间存储数组的长度(普通16b-12b)。

对象数组本身的大小=数组对象头 + length * 存放单个元素大小

在TestObj中新增一个 char[] 属性,观察对象内存占用


public class TestObj {
   private char[] c = {'a','b','c'};

}

char[] c占用内存 40b,如图

结论:char[3] 占用 24b, 24 = 40 - 16,24 = 16(Header) + 3 * 2(char) + 2(Padding)

封装类型数组占用

封装类型数组比基本类型的数组,需要多管理元素的引用

对象数组本身的大小=数组对象头+length * 引用指针大小 + length * 存放单个元素大小

在TestObj中新增一个 Integer[] 属性,观察对象内存占用


public class TestObj {
    private Integer[] i = {128,129,130};

}

Integer[] i占用内存 80b,如图

结论:Integer[3] 占用 80b, 80 = 96 - 16, 80 = 16(Header) + 3 * 4 (reference)+ 3 * 16(Integer) +4(padding)

String占用内存

在TestObj中新增一个空 String 属性,观察对象内存占用


public class TestObj {
    private String s = new String("");

}

对象占用内存 40b,如图

结论:String 本身占用 24b, 24 = 40 -16也就是说空""也需要16b

注意:这里为什么要写String s = new String("")?请自己思考,不写会怎么样?

答:如果写成String s = “”,是不会再堆中开辟内存的,也就看不到String占用的空间,你看到的将会是下面的,至于为什么,都是因为final

以上就是java各种类型对象占用内存情况分析的详细内容,更多关于java对象占用内存分析的资料请关注编程网其它相关文章!

--结束END--

本文标题: java各种类型对象占用内存情况分析

本文链接: https://lsjlt.com/news/124290.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java各种类型对象占用内存情况分析
    目录前言基本数据类型占用包装类型占用基本类型数组占用封装类型数组占用String占用内存前言 其实一般的程序猿根本不用了解这么深,只有当你到了一定层次,需要了解jvm内部运行机制,或...
    99+
    2024-04-02
  • java中对象占用内存情况
    本篇文章为大家展示了java中对象占用内存情况,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:...
    99+
    2023-06-14
  • 阿里云服务器内存占用情况分析
    简介:随着云计算技术的快速发展,越来越多的企业选择使用阿里云服务器来托管他们的业务。然而,由于服务器资源的限制,内存占用问题一直是用户关注的焦点。本文将从阿里云服务器内存占用情况的角度出发,对服务器内存占用情况进行分析,并给出一些解决方案。...
    99+
    2023-12-30
    阿里 内存 情况
  • java对象分配内存的两种类型是什么
    这篇文章主要介绍java对象分配内存的两种类型是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。1...
    99+
    2023-06-14
  • linux怎么查看各个进程内存占用情况
    在Linux系统中,可以使用以下命令来查看各个进程的内存占用情况:1. top命令:在终端中输入top命令,然后按下shift+m键...
    99+
    2023-10-09
    linux
  • linux怎么查看各个进程的内存占用情况
    在Linux系统中,可以使用以下命令来查看各个进程的内存占用情况:1. `top`命令:在终端中输入`top`命令可以实时查看系统的...
    99+
    2023-09-13
    Linux
  • java对象分配内存的类型有哪些
    这篇文章主要介绍了java对象分配内存的类型有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java对象分配内存的类型有哪些文章都会有所收获,下面我们一起来看看吧。1、两种类型(1)指针碰撞的分配方式用于在...
    99+
    2023-06-30
  • python如何检查对象的内存使用情况
    这篇文章主要介绍了python如何检查对象的内存使用情况,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 检查对象的内存使用情况。在 Python 2.7 中,32 ...
    99+
    2023-06-27
  • python怎么检查对象的内存使用情况
    小编给大家分享一下python怎么检查对象的内存使用情况,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!检查对象的内存使用情况使用sys.getsizeof()可以检查对象的内存使用情况:import sys&nb...
    99+
    2023-06-27
  • java面向对象编程类的内聚性分析
    目录类划分时关于内聚性的问题静态类的设计高内聚类的设计附:面向过程编程中模块的内聚性偶然内聚或巧合内聚(Coincidental)逻辑内聚(Logical):时间内聚(Tempora...
    99+
    2024-04-02
  • Java面向对象和内存分析图文详解
    一、Java类 类是面向对象编程中最基本的单位。 Java中的类包含三个内容,分别是: 属性 属性又叫成员变量。 属性用于定义类或类对象的数据(静态特征)。 ...
    99+
    2024-04-02
  • vue3.0找不到模块“./App.vue”或其相应的类型声明(多种情况分析)
    目录情况一、vue3.0+js情况二、vue3.0+ts// vue3 报错提示 找不到模块“./XXX.vue”或其相应的类型声明 // 报错原因:type...
    99+
    2023-01-29
    vue3.0找不到模块 vue找不到模块./App.vue
  • Java即将引入新对象类型来解决内存使用问题
    目录一、Valhalla二、Java类型系统的不足三、对象头四、Value Class前言: 2022年Java将有什么新的特性和改进,我相信很多Java开发者都想知道。结合Java...
    99+
    2024-04-02
  • Java面向对象之匿名内部类的示例分析
    小编给大家分享一下Java面向对象之匿名内部类的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!public class TestMot...
    99+
    2023-06-02
  • Java面向对象中匿名内部类额示例分析
    这篇文章主要介绍Java面向对象中匿名内部类额示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!public class TestMoto {public static&n...
    99+
    2023-06-02
  • Java面向对象之方法中内部类的示例分析
    这篇文章主要为大家展示了“Java面向对象之方法中内部类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java面向对象之方法中内部类的示例分析”这篇文章吧。public cl...
    99+
    2023-06-02
  • Linux系统下分析内存使用情况的管理工具有哪些
    这篇文章将为大家详细讲解有关Linux系统下分析内存使用情况的管理工具有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。有许多办法可以获得Linux系统上所安装内存的信息,并查看其中有多少...
    99+
    2023-06-05
  • redis部署及各种数据类型使用命令的示例分析
    这篇文章给大家分享的是有关redis部署及各种数据类型使用命令的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。编译安装redis开始部署[root@mcw01 ~]$ lsanacon...
    99+
    2023-06-29
  • JS中时间对象与引用类型的示例分析
    这篇文章将为大家详细讲解有关JS中时间对象与引用类型的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基础类型有哪些?复杂类型有哪些?有什么特征?基础类型:Stri...
    99+
    2024-04-02
  • 如何解析Java对象引用与JVM自动内存管理
    今天就跟大家聊聊有关如何解析Java对象引用与JVM自动内存管理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。解析Java对象引用与JVM自动内存管理(转)[@more@]对象引用应...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作