java内存分配

Java作为C/C++发展出来的语言,最大的区别就是对程序员管理屏蔽了内存管理的部分,java中没有了指针的概念,所有动态内存的分配和释放都在Java底层里自动完成。

Java的程序会把其占用的内存大概分成4个部分:

1.stack栈区:跟C一样,存放局部变量、函数参数等。。

2.Heap堆区:存放动态分配的内存变量,只不过动态分配内存的方式跟C不同。

3.数据区:相当于C的static区,存放静态变量和字符串常量。

4.代码区:跟C一样,存放代码的二进制代码

public class A{
int j;

int f(){
  int i = 0;
  return i;
}
}

java里是不存在全局变量的,因为一旦变量不是在函数里定义,那么他就是在类里面定义,变量j也就是一个类的成员了。

class A 里面的变量j其实就是A的一个成员,在java中一个类里面的所有非static修饰的成员都是动态分配内存的,也就是变量j是动态分配内存的,内存被分配在heap区。

面向对象的一些特性和动态分配内存的优点:

  1.对象的指针存放在栈区,而无论一个结构体的内存占用多么庞大,栈区的对象指针只会保存结构体内存的头部指针,所以栈区的单个对象指针只占用4byte,相对与静态分配

     的结构体,大大节省了栈区的空间。

   2.多个不同的对象会利用不同的堆区内存存放各种成员,但各自的函数指针指向相同的代码区函数,也就是说,每一个结构体对象的内部函数实际上都是一样的,只不过参数不同。

静态函数不允许使用非静态成员:

     静态函数是可以在实例化之前使用的,但是如果该静态函数应用了非静态成员i,那么当没有实例化对象而调用该静态函数时,就会找不到成员i的地址,因为成员i必须在实例化之后才会被分配内存,这就是java不允许静态函数调用非静态成员的原因。

你可能感兴趣的:(java内存分配)