JDK 内存模型
线程私有的内存区域:
- 程序计数器:一个较小的内存区域,标识字节码代码行
- JVM虚拟机栈:方法执行时,会创建一个栈帧保存局部变量表,操作次数,动态链接,方法出口等信息
1.会抛出栈溢出异常
2.会抛出内存溢出 (OOM)
内存泄漏:是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
一般出现内存泄漏的情况:长生命周期存活的对象,内部持有不使用对象的引用,导致不使用的垃圾对象无法回收
例子:用户登陆以后,保存用户的信息,如果用户长时间不使用,需要清除用户的信息
- 本地方法栈:为虚拟机使用的Native方法服务
线程共享内存区域:
- Java堆:在JVM启动创建时,所有的对象实例以及数组都要在堆上分配,如果内存不够将会跑出OOM异常(内存溢出)
- 方法区/元数据区:存储已被虚拟机加载的类信息、常量、静态变量。内存回收针对的是常量池的回收以及对类型的卸载,当内存不够会抛出OOM异常
- 运行时常量池:编译期及运行期间产生的常量被放在运行时常量池中。常量包括:基本类型、包装类(包装类不管理浮点型,整型只有-128~127)和String。类加载时,会查询字符串常量池,以保证运行时常量池所用的字符串与字符串常量池是一致的
Class文件常量池: 用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放。
运行时常量池: 具备动态性,运行期间也可以将新的常量放入池中。
字符串常量池: 存储字符串对象,或字符串对象的引用