当前位置:首页 > CN2资讯 > 正文内容

正版我的世界Java分配内存

3天前CN2资讯

1、一些废话

一些废话还是要说,我们必须在一些概念上达成一致,首先这篇文章会特别的基础,其次这里说的内存,大部分情况下都是物理内存,不是虚拟内存(新手不知道虚拟内存的可以略过),这里讲的不少内容都是概念和理论性质的,少部分有实际的代码,主要是操作系统课程会讲到的内容。
如果你希望学到JVM内存管理的内容,那么你会失望。
如果你希望学习到程序开发的一些入门的内存知识,你会满意。

2、前菜:计算机存储设备

广义上讲的计算机的存储设备,一共有以下几种:

  • CPU的寄存器
  • 内存
  • 各种磁盘(例如机械硬盘、固态硬盘、U盘、光盘)
    这里我们主要讲内存,内存的容量单条都在4G 8G 16G了(2020年),寄存器和磁盘我们都不讲。

3、内存里的最小存储单元是字节

都知道计算机只能存储和计算2进制数据,都是0和1,毫无疑问,计算机内存中存储的都是0和1,那么这里有1个基本的概念,就是一个0或者一个1,叫做位,8位是1个字节。
那么这里我想说第一个知识点,内存里的最小存储单元是字节。
假设我们写了一行代码:

boolean a = false;

那么申请了几个字节呢?很显然用1个位就可以表示,但是实际是1个字节。

如果考虑到字节对齐,可能不仅仅是1个字节。如果你需要用1个位,实际上分配了1个字节的内存,这个就叫内存碎片,更精确的讲叫内部碎片。结论就是你不能申请少于1个字节的内存。

4、字节是有顺序的

继续刚才的话题,假设你写了如下一行代码:

long a = 0x12345678; // 转16进制之后是: 0x12345678

这个数字,转换为2进制,就是:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7YID7oud-1609726062205)(…/img/image-20210102150223271.png)]
那么实际这个数字,在内存里是怎么存储的呢?由于Java不能查看实际的内存内容,这里我们借用C语言的GDB工具来实现,具体的过程就不写了,感兴趣的话,需要自己研究下。

(gdb) x/32xb 0x7ffeefbffb08 0x7ffeefbffb08: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7ffeefbffb10: 0x78 0x56 0x34 0x12 0x00 0x00 0x00 0x00 0x7ffeefbffb18: 0x25 0x10 0x01 0x00 0x00 0x00 0x00 0x00 0x7ffeefbffb20: 0x30 0xfb 0xbf 0xef 0xfe 0x7f 0x00 0x00 (gdb) x/32tb 0x7ffeefbffb08 0x7ffeefbffb08: 01111000 01010110 00110100 00010010 00000000 00000000 00000000 00000000 0x7ffeefbffb10: 01111000 01010110 00110100 00010010 00000000 00000000 00000000 00000000 0x7ffeefbffb18: 00100101 00010000 00000001 00000000 00000000 00000000 00000000 00000000 0x7ffeefbffb20: 00110000 11111011 10111111 11101111 11111110 01111111 00000000 00000000

我使用GDB查看了变量a的地址,然后查看了该地址的内存,可以看到低位的0x78,在内存的低地址,小端法。

1个int类型有4个字节,但是4个字节在内存中是有顺序的,如果低位的字节,在内存的低地址,这种存储方式就是小端,如果反过来,就是大端。


对于Java程序员来说,可以不用关心这个问题,基本上用不到这个知识的。

5、字节对齐

我们知道了内存中的最小单位是字节,那么很明显我们不能申请0.5字节或者1.5字节的内存长度,那么对于32位系统来说,还有1个要注意的地方是,大概率是4字节对齐的,什么意思呢?就是假设 一个类占3个字节,那么最终Java也会给你申请4个字节,这个就是字节对齐,为什么需要对齐呢?是因为32位系统的最大可以寻址2^32次方个字节,地址使用4字节的int表示的,所以访问的内存地址的物理地址,必须是4字节的整倍数,这样好寻址嘛,也很好理解。

我猜测,64系统大概率是8字节对齐的。
不过不用担心,Java虚拟机规范规定了int就是4字节,无论你是32位系统还是64位系统,所以还不需要关心这个事情,知道就可以了。所以有时候,我更倾向于把ArrayList的初始容量设置为16。

6、局部性原理

CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。这个原理对于内存来说,更是如此。紧凑的内存数据更有利于计算机一次性把所有的数据都取出。

7、程序需要加载进内存才能执行

这简直就是脱了裤子放屁了,大家都知道。
所以有时候需要尽量把代码写的短一点,可能有一点点的好处,也完全可以忽略,毕竟不知道编译之后的目标代码到底怎么样。

8、虚拟内存

大部分情况下,程序员可以访问到的内存,都是虚拟内存,如果你的程序代码比你的内存还要大,直观的感受是这程序肯定不能运行,得益于虚拟内存,可以只加载一部分内存,然后按需加载。

全文完。

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/22029.html

    分享给朋友:

    “正版我的世界Java分配内存” 的相关文章

    如何在VPS上轻松安装Chrome浏览器:详细步骤与优化技巧

    1.1 下载Chrome安装包 在VPS上安装Chrome浏览器的第一步是获取安装包。通常,我会选择从网盘下载地址获取Chrome安装包。打开下载链接后,输入提取码即可开始下载。这种方式不仅方便,还能确保安装包的来源可靠。下载完成后,我会将安装包保存到一个易于找到的目录,以便后续操作。 1.2 解压...

    Hostloc论坛:主机爱好者的交流与协作平台

    在这个快速发展的互联网时代,信息交流变得尤为重要,Hostloc论坛正是这样一个致力于主机相关话题交流的平台。论坛的创办源于一群热衷于主机技术的人士,他们希望通过建立一个开放的讨论空间,分享自己的经验和见解。随着时间的推移,Hostloc逐渐发展成为一个全球知名的主机论坛,吸引了来自各个国家的用户共...

    详解VPS中转教程:提升网络连接的速度与稳定性

    我想给大家介绍一下VPS中转技术。这是一种通过一台或多台服务器进行流量转发的技术,能有效提升网络连接的效率和稳定性。说白了,它就像是在你的网络旅途中增加了一些中转站,让你的数据在传输时更加顺畅和可靠。 在我使用VPS中转技术的过程中,我发现它的应用场景相当广泛。比如,在网络受限的环境中,VPS中转能...

    探索美国ISP VPS:提升网络性能与安全性的最佳选择

    在当今互联网时代,虚拟专用服务器(VPS)变得越来越受欢迎,尤其是当我们提到美国ISP VPS时。这种由美国互联网服务提供商提供的VPS,不仅性能强大,还具有许多独特的优势。简而言之,美国ISP VPS就是在美国数据中心托管的一种虚拟服务器,它能满足各类业务需求,如解锁流媒体服务、支持跨境电商等。...

    如何利用闲置VPS赚钱 - 探索多种盈利方式

    在互联网蓬勃发展的背景下,很多人手中会有闲置的VPS(虚拟私人服务器)。这些资源如果不加利用,往往就是一笔浪费。因此,了解闲置VPS赚钱的方法十分必要。这不仅可以让我们的小投资产生回报,也能为我们探索更广阔的网络世界提供平台。 闲置VPS的定义相对简单,指的是那些未被充分利用的服务器资源。它们通常具...

    搬瓦工补货通知及高性价比套餐推荐

    搬瓦工的补货通知对许多用户来说非常重要,尤其是在需求不断增加的背景下。补货通知不仅帮助用户了解最新的套餐信息,还能在价格优惠时把握购买机会。对于我而言,时常关注这些通知意味着能以最低的价格获得高配置的套餐,这无疑是提升我网络体验的重要一步。 为了随时获取补货信息,搬瓦工提供了多种渠道供用户选择。大家...