做项目用到了静态变量,唤起对内存的一些记忆,并且java的内存机制值得好好学习,在此进行总结。
通过查询及学习首先了解下java的内存管理原理:
在java中,有java程序,虚拟机和操作系统三个层次,java程序与虚拟机交互,虚拟机与操作系统交互,三者的运行原理如下:
1.程序运行前:向操作系统请求一定的内存空间,成为初始内存空间,程序执行过程中所需的内存都是java虚拟机从这片内存空间中划分出的
2.程序运行中:java程序一直向java虚拟机申请内存,当程序所需要的内存空间超出初始内存空间时,java虚拟机会再次向操作系统申请更多的内存供程序使用。
如果程序接着运行,当java虚拟机已申请的内存达到了规定的最大内存空间,但程序还需要跟多的内存,这时会出现内存溢出的错误!因此, 我们知道java程序所用的内存是有java虚拟机进行管理、分配的。java虚拟机规定了java程序的初始内存空间和最大内存空间。
内存各块区域的划分及使用
在java中,内存分为栈(Stack),堆(Heap),数据段(DataSegment),代码段(Code Segment)
栈(Stack):默认最大容量是1M,在程序运行时,每当遇到方法调用时,java虚拟机就会在栈中划分一块内存称为栈帧(Stack frame),栈帧中的内存供局部变量(包括基本类型与引用类型)使用,局部变量是在具体的方法内声明的变量,包括方法的参数也是局部变量。当方法调用结束后,java虚拟机会收回此栈帧占用的内存。
堆(Heap):默认最大容量为64M,存放对象的实例,在代码中new出来的东西全部放在此处。放的是引用类型的数据,包括类、接口或者数组。
数据段(DataSegment):存放静态常量和字符串常量。其中静态成员变量是程序在初始化的时候就分配的,程序的初始化就是在程序运行前将程序运行必须的资源加载到内存中。
代码段(Code Segment):存放程序的代码