**今日计划 Java内存区域与内存溢出异常
概述
Java虚拟机具有自动内存管理机制
提示:
1、Java虚拟机具有自动内存管理机制
2、Java虚拟机在执行java程序时,会把它管理的内存区域划分为不同的内存区域,各个区域具有不同的功能
3、Java运行时数据区有 程序计数器、虚拟机栈、本地方法栈、方法区、运行时常量池、直接内存
1、本地方法栈作用与虚拟机栈作用相似,线程私有
本地方法栈与虚拟栈的区别
a、本地方法栈为虚拟机使用到的本地方法服务
b、虚拟机栈为Java方法服务
2、、HotStop虚拟机把虚拟机栈与本地方法栈和二为一
3、本地方法栈在栈深度溢出抛出StackOverflowError(栈溢出)异常
本地方法栈在栈扩展失败(扩展时无法申请到足够的内存)抛出OutOfMemoryErro(内存溢出)异常
1、Java堆是虚拟机所管理的最大的一块内存区,线程共享区域
2、Java堆在虚拟机创建时启动
3、.Java堆目的
1)存放对象实例,几乎所有的对象实例都在这里分配内存
4、Java堆也是垃圾收集器管理的区域
1)、主流的HopStop内部垃圾收集器基于经典分代设计
1.有新生代、老年代
2)新生代由一个Eden区 两个Survivor区组成
5、Java堆细分是为了更好的进行垃圾回收或更快的分配内存
6、Java虚拟机规范规定Java堆可以处于物理上不连续的内存空间中,但在逻辑上必须是连续的
7、Java堆可以是固定大小的,也是可扩展的
1)通过参数-Xmx() -Xms()设定
8、Java堆没有完成实例分配,堆无法扩展时,Java虚拟机抛出OutOfMemory异常
1、方法区用于存储已被虚拟机加载的类型信息、常量、静态常量、即时编译器编译后的代码缓存等数据,是线程共享区域
2、Java虚拟机规范是把方法区描述为堆的一个逻辑部分 但目前是与堆分开的
3、JDK8以前永久代实现虚拟机的方法区
4、JDK8用本地内存中实现的元数据代替永久代
5、Java虚拟机规范对方法区的约束不严格,可以像堆一样不需要连续的内存和可以选择固定大小或可扩展,还可以选择不实现垃圾回收
6、方法区的垃圾回收主要针对常量池的回收和对类型的卸载
7、Java虚拟机规范规定,如果方法区不满足新的内存分配需求时,抛出OutOfMemory(内存溢出)异常
1、运行时常量池是方法区的一部分
2、运行时常量池用于存放编译期生成的各种字面量与符号引用,这部分在类加载后存放到方法区的运行时常量池中
3、符号引用翻译出来的直接引用也存储在运行时常量池中
4、运行时常量池特征 动态性
1)Java语言并不要求常量一定在编译期产生,运行期也可以将常量放入常量池中
2)String类的intern 方法
5、常量无法再申请到内存时会抛出OutOfMemory(内存溢出)异常
1、直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟定义的内存区域