要想知道如何预防内存泄漏,那么就要知道内存为什么会泄漏。
想要知道内存为什么会泄漏,那么先得知道Java的内存是哪里。
Java的内存的组成
程序计数器(Program Counter Regist
要想知道如何预防内存泄漏,那么就要知道内存为什么会泄漏。
想要知道内存为什么会泄漏,那么先得知道Java的内存是哪里。
Java的内存的组成
程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
程序计数器
保存指令地址,也就是存的是下一条执行所在的存储地址。
不会发生内存溢出异常。
虚拟机栈
就是Stack,存放的是一个个的栈帧,每个栈帧对应一个被调用的方法。
StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。比如递归调用一个方法。
OutOfMemoryError:虚拟机在动态扩展栈时无法申请到足够的内存空间。比如无限地创建线程,并为每个线程循环增加分配内存。
本地方法栈
同Java虚拟机栈
Java堆
存储对象本身的以及数组,堆是被所有线程共享的,在JVM中只有一个堆。
OutOfMemoryError:没有内存完成实例分配,或者不能再扩展。比如无限new对象,在List中保存(这样不会被回收)
方法区
存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等,也是被线程共享的。
OutOfMemoryError:无法满足内存分配要求。比如生成大量的动态类。
希望我的回答可以帮助到你!