jvm内存分区
java内存是由jvm进行管理的,其内存简易模型如下图:
jvm管理的内存大体上可分为方法区、堆、程序计数器、线程栈、本地方法区这几部分。
方法区:
主要存放类的元信息(包括类的名称、修饰符、静态变量、final常量、属性信息、方法信息)。
本区域全局共享。
会被GC管理。
加载类过多,需要内存超出其设定内存大小时,会抛出OutOfMemory异常。
堆区:
该区域是GC主要管理的区域,存放内容包括Class对象、数组对象、通过new关键字创建的对象。
本区域全局共享。
会被GC管理。
程序计数器:
记录当前线程运行的指令位置。
本区域线程私有。
线程栈:
存储方法栈帧。执行线程每执行一个方法,都会创建一个栈帧插入线程栈中,顾名思义,这些栈帧在线程栈中是以栈的数据结构进行维护的,执行线程从一个方法退出时会从栈顶删除一个栈帧。每一个栈帧里存储的信息包括局部变量表、操作数栈等。
本区域线程私有。
本地方法区:
主要支持一些jvm内部的native方法的调用。例如java通过native方法实现了CAS的操作,并发包的原子类的相关操作就是基于此进行实现