【java进阶】java 虚拟机内存区域划分(JVM)

java虚拟机内存区域划分为:堆,虚拟机栈,本地方法栈,方法区,程序计数器。其中堆,方法区为线程共享区域,其他区域为线程私有的。

1.程序计数器(Program Counter Register)

 程序计数器是一块很小的内存空间,是当前线程所执行的字节码的行号指示器。字节码解释器工作就是通过改变程序计数器的值来选取下一条执行的字节码指令。

2.虚拟机栈(Java Virtual Machine Stacks)

虚拟机栈是java方法执行的内存模型。虚拟机站线程私有,生命周期与线程相同。每个方法执行都会在虚拟机栈中创建一个栈帧。栈帧用于存储局部变量表,操作数栈,动态链接,方法出口信息等。如果请求栈深度大于虚拟机所允许的最大深度,会抛出StackOverFlowError异常。当前大部分虚拟机都可以动态扩展栈的深度,如果扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。

栈容量设定:-Xss128k

3.本地方法栈(Native Method Stack)

本地方法栈与虚拟机栈发挥的作用是相似的,只是虚拟机栈为java方法服务,本地方法栈为虚拟机用到的Native方法服务。本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。HotSpot虚拟机不区分虚拟机栈和本地方法栈。

4.方法区(Method Area)

方法区用来存储加载的类信息,常量,静态变量,即时编译器编译后的代码等。方法区是线程共享的。JDK1.7之前方法区中包括运行时常量池,1.7之后运行时常量池被转移到堆中。垃圾收集行为在方法区中和少出现,方法区中的垃圾回收主要包括常量池的回收和类的卸载。方法区中也会抛出OutOfMemoryError异常。

方法区大小设定:-XX:PermSize=10M -XX:MaxPermSize=10M

4.1 运行时常量池(Runtime Constant Pool)

Class 文件中包括类的版本,字段,方法和接口等信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用。这部分在类加载后存放在方法区中的运行时常量池中。

5.堆(Java Heap)

堆是java虚拟机中最大的一块内存,是线程共享的。堆中存放对象的实例,堆也是垃圾回收的主要区域。java虚拟机规范规定,java堆可以是物理上不连续的空间,只要在逻辑上连续即可。从垃圾回收角度看,由于现在收集器都采用分代收集算法。堆可以分为年轻代和老年代。

堆大小设置参数:-Xms20m -Xmx20m

-Xms 默认堆内存

-Xmx 最大堆内存

-XX:HeapDumpOnOutOfMemoryError 虚拟机堆内存溢出异常时,Dump出当前内存堆转储内存快照。

6.直接内存(Direct Memory)

直接内存不是虚拟机运行时数据区的一部分。JDK1.4中新加入NIO类,引入了基于通道与缓冲区的I/O方式,可以使用Naive函数库直接在堆外分配内存。

直接内存大小设定:-XX:MaxDirectMemorySize=10M

猜你喜欢

转载自blog.csdn.net/weixin_42217331/article/details/82184858