在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存的话会占用多少内存呢?
计算机的存储单位
计算机的存储单位常用的有bit
、Byte
、KB
、MB
、GB
、TB
后面还有但是我们基本上用不上就不说了,我们经常将bit
称之为比特或者位、将Byte
简称为B
或者字节,将KB
简称为K
,将MB
称之为M或者兆,将GB
简称为G
。那么他们的换算单位是怎样的呢?
换算关系
首先我们得知道在计算机中所有数据都是由0 1
来组成的,那么存储0 1
这些二进制数据是由什么存放呢?就是由bit
存放的,一个bit
存放一位二进制数字。所以bit
是计算机最小的存储单位。
大部分计算机目前都是使用8位的块,就是我们上面称之为的字节Byte
,来作为计算机容量的基本单位。所以我们一般称一个字符或者一个数字都是称之为占用了多少字节。
了解了上面关于位和字节的关系后,我们可以看一下其他的单位换算关系
1B(Byte 字节) = 8bit(位)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
Java中对象占用多少内存
在了解了上面的换算关系后,我们来了解一下新建一个Java对象需要多少内存。
Java基本类型
我们知道Java类型分为基本类型和引用类型,八大基本类型有int、short、long、byte、float、double、boolean、char
数据类型 | 占用内存(单位为Byte) |
---|---|
boolean | 1 |
byte | 1 |
short | 2 |
char | 2 |
int | 4 |
float | 4 |
long | 8 |
double | 8 |
至于为什么Java中的char无论是中英文数字都占用两个字节,是因为Java中使用Unicode字符,所有的字符均以两个字节存储。
Java引用类型
在一个对象中除了有基本数据类型以外,我们也会有一些引用类型,引用类型的对象比较特殊,因为这些对象真正存储在虚拟机中的堆内存中,对象中只是存储了一个引用而已,如果是引用类型那么就会存储一个指向该引用的指针。指针默认情况下是占用4字节,是因为开启了指针压缩,如果没有开的话,那么一个引用就占用8个字节。</