java内存模型把java分为:java栈,堆内存,方法区。
java栈:
java栈中会执行两种操作:压栈和出栈。
各种原始数据类型都是在栈上创建的,当程序退出该变量的作用范围时,这个变量的内存会被自动释放掉。
栈式存储分配按照先进后出的原则进行分配。
存在栈中的数据可以共享,节省了很大的内存。
实际上Java栈就是一片内存片段。
栈的优点:存取速度比堆要快,数据可以共享。
栈的缺点:存在栈中的数据大小与生存期必须时确定的,缺乏灵活性。
堆区:
一个java虚拟机制只存在一个堆空间,所有线程都共享这个堆。
程序并不会去主动释放它,堆空间的管理都是由垃圾收集器来处理的。
堆内存用来保存java中创建出来的对象。
堆的优点:编译器不必知道要从堆里分配多少储存空间,也不必知道存储的数据要在堆里停留多长时间,用堆的灵活性更强。
堆的缺点:由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间。
方法区:
方法区中保存了:类信息,类变量,字段信息,方法信息,一个到class类的引用,一个到classloader类的引用。
所有现成都共享方法区中的数据。在创建一个对象的时候,也是根据方法区中的类信息来大致缺点一个对象所需要的内存大小的。
方法区的大小是不固定的,可以更具应用的需要动态调整,由于分配问题,方法区的储存空间可以不固定。