Java虚拟机在在执行程序的过程中会将他所管理的内存划分为若干个不同的数据区域,这些
区域有各自不同的作用,以及创建和销毁的时间。Java虚拟机规范中包括以下几个运行时数据区域
1.1程序计数器
是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。这个内存区域是java虚拟机规范中唯一个没有指定outofmemoryError情况的区域。
1.2Java虚拟机栈
线程私有的与线程生命周期一致,它描述的是java方法执行的内存模型,每个方法被执行都会创建一个栈帧(用于存储局部变量表、操作栈、动态链接、方法出口等信息)每个方法被调用直至完成的过程,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。
虚拟机栈中的局部变量表部分。存放了编译期的基本数据类型、对象引用类型
这个区域抛出StackOverflowError异常和outOfMemoryError异常。
1.3本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的,虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
1.4 Java堆
Java堆是虚拟机所管理的内存中最大的一个。是被所有线程共享的一块内存区域,在虚拟机启动时创建。唯一目的就是存放Java对象,所有实例都在这里分配内存。
Java堆还可以细分为:新生代和老年代等;
1.5 方法区
与Java堆一样是各个线程共享的内存区域。用于存储已经被虚拟机加载的类信息、如类名、访问修饰符、常量、静态变量、字段描述、方法描述、即时编译器编译后的代码等数据。
1.6运行时常量池
方法区的一部分。常量池用来存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。这部分也会抛出outofmemoryError异常。
1.7 直接内存
并不是java虚拟机规范制定的内存区域,但是这部分也被频繁的调用。而且也可能导致outofmemoryError异常出现。
1.8JVM参数
Java堆: -xmx -xms 堆最大值和最小值
本地方法栈: -Xoss参数
Java虚拟机栈: -Xss参数
运行时常量池、方法区:常量池分配在方法区中所以可以通过-XX:PermSize和-XX:MaxPermSize限制
本机直接内存:direcmemory容量可以通过-XX:MaxDirectMemorySize指定(如果不指定默认与Java堆的最大值-Xmx指定一样)