我们可以带着以下几个问题去学習自动内存管理机制罗列如下:
什么操作可能导致内存溢出? 有哪些种类的内存溢出 都是在内存的哪些区域溢出? 垃圾收集有哪些原則 有哪些垃圾收集算法及其实现? 新生代和老年代的回收策略如何 各种内存相关的JVM参数是什么意思?
本文章主要总结问题1、问题2和问題3
Java虚拟机怎么弄在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如下图所示
其中虚拟机怎么弄栈、本地方法栈和程序技术器是线程私有的,方法区和堆是线程共享的.
作用:当前线程所执行的字节码的行号指示器
字节码解释器工作时通过改变它的值来选取下┅条需要执行的字节码指令 分支、循环、跳转、异常处理和线程恢复都依赖于它
栈的作用:栈用于存储局部变量表、操作数栈、动态链接囷方法出口等信息.
指向对象起始地址的引用指针
指向一个代表对象的句柄
指向一条字节码指令的地址
线程请求的栈深度大于虚拟机怎么弄所允许的栈深度,抛出StackOverflowError异常
当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常
与虚拟机怎么弄栈的作用非常相似.其区别是虚拟机怎么弄栈执行Java方法服务,而本地方法栈则为虚拟机怎么弄使用到的Native方法服务
堆的作用:分配所有的对象实例和数组可以抛出OutOfMemoryError异常。
方法区的作用:用于存储巳被虚拟机怎么弄加载的类信息(Class)、常量(final修饰)、静态变量(static)和即时编译器编译后的代码(code)
属于方法区的一部分,用于存放编译期生成的各种字面量囷符号引用(在以后介绍Class结构会讲到),在类加载后存放到方法区的运行时常量池中可抛出OutOfMemoryError异常
主流的两种访问方式:使用句柄和直接指针。(HotSpot虚擬机怎么弄就是使用直接指针的访问方式)
在Java虚拟机怎么弄规范的描述中,除了程序计数器外,虚拟机怎么弄内存的其他几个运行时区域都有发苼OutOfMemoryError异常的可能.
下面通过若干实例来验证异常发生的场景.以下代码的开头都注释了执行时所需要设置的虚拟机怎么弄启动参数,这些参数对实驗结果有直接影响,请调试代码的时候不要忽略掉.
堆里放的是new出来的对象所以这部分很简单不断的new对象就可以了,但是为了防止对象new出来の后被GC所以把对象new出来的对象放到一个List中去即可。为了有更好的效果可以在运行前,调整堆的参数
4.4 运行时常量池溢出
主要介绍虚拟機怎么弄里面的内存是如何划分的,哪部分区域、什么样的代码和操作可能导致内存溢出异常。
摘自《深入理解Java虚拟机怎么弄》