Java内存划分到底是4个部分还是5个部分?

Python07

Java内存划分到底是4个部分还是5个部分?,第1张

Java把内存划分成两种:一种是栈内存,一种是堆内存。在函数中定义的一些基本类型的变量对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。具体的说:栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int,short,long,byte,float,double,boolean,char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:inta=3intb=3;编译器先处理inta=3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理intb=3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b,它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

java基本数据类型就8种,记住就好了。除了这些都是引用型的了。

java四类八种基本数据类型

第一类:整型 byte short int long

第二类:浮点型 float double

第三类:逻辑型 boolean(它只有两个值可取true false)

第四类:字符型 char

在栈中可以直接分配内存的数据是基本数据类型。

引用数据类型:是数据的引用在栈中,但是他的对象在堆中。

要想学好Java必须知道各种数据的在内存中存储位置。 对内存有了很好的了解,可以有助你分析程序。

字节:

boolean 布尔型 1/8

byte 字节类型 1

char 字符型 2 一个字符能存储一个中文汉字

short 短整型2

int 整数类型4

float 浮点类型(单精度)4

long 长整形 8

double 双精度类型(双精度) 8

java中默认的整数类型是int类型,如果要定义为float型,则要在数值后加上l或L;

默认的浮点型也是双精度浮点,如果要定义为float型,则要在数值后加上f或F。

一个字节等于8位,一个字节等于256个数,就是-128到127一共256。

kB就是kBytes Bytes就是“字节”的意思!

K就是千的意思,因为计算机是通过二进制来计算,10个1正好是1024

1111111111(二进制)=1024(十进制)

1Bytes(字节)=8bit(比特)

一个英文字母或一个阿拉伯数字就是一个字符,占用一个字节

一个汉字就是两个字符,占用两个字节。

一般讲大小是用Bytes,大写的“B”,讲网络速率是用bit,注意是小写的“b”。

例:一个文件有8MBytes

例:我下载文件的速率是256KB/s,即2Mbit,这通常就是我们宽带上网的速率。

基本数据类型自动转换

byte->short,char ->int ->long

float ->double

int ->float

long ->double

记住:小可转大,大转小会失去精度!!!