Java内存结构学习总结
自己学习后的笔记贴上来的,有不正确或者不完成的还望指正。
程序计数器:作用可以看成当前线程所执行的字节码的行号指示器。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储。---线程私有
虚拟机栈:描述JAVA方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口灯信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。局部变量表存放了编译期可知的各种基本数据类型和对象引用类型,所需内存空间在编译期间完成分配。---线程私有
虚拟机栈中的两种异常状况:如果线程请求的栈深度大于虚拟机允许的深度,抛出StackOverflowError;如果虚拟机栈可以动态扩展,当扩展无法申请到足够的内存时抛出OutOfMemoryError。
本地方法栈:为虚拟机使用到的Native方法服务。---线程私有
JAVA堆:是被所有线程共享的一块内存区域,在虚拟机启动时创建。所有的对象实例以及数组都要在堆中分配,垃圾收集器管理的主要区域。
方法区:存储被虚拟机加载的类信息(类名、访问修饰符、字段描述、方法描述等)、常量、静态变量、即时编译器编译后的代码等数据。垃圾收集器主要是针对该区域的常量的回收和对类型的卸载。
运行时常量池(属于方法区部分):存放编译期生成的各种字面量和符号引用。动态性:运行期间也可能将新的常量放入池中,如String类的intern()方法。
直接内存:堆外内存,新IO类中引入的机遇通道Channel与缓冲的I/O方式,使用Native函数库直接分配对外内存。
配置参数:
- -Xnoclassgc 关闭类垃圾回收功能
- -Xincgc 开启类的垃圾回收功能
- –Xms<size> 设置JVM初始化堆内存大小
- –Xmx<size> 设置JVM最大的堆内存大小
- –Xss<size> 设置JVM栈内存大小