Java是按照运行时数据的存储结构来划分内存结构的,java虚拟机规范将java运行时的诗句划分为6种:
1.PC寄存器
用于保存当前执行程序的内存地址,同时java程序是多线程的,不可能一直都按照线性执行下去,当有多个线程交叉执行时,被中断的线程程序当前执行到哪条的内存地址需要记录下来。
2.java栈
java栈是与线程相关到一起的,每当创建一个线程时,JVM就会为这个线程创建一个java栈,这个hava栈中含有很多的栈帧,栈帧是与每个方法关联起来的,每运行一个方法就会创建一个栈帧。每个栈帧内部会有变量,操作栈与方法返回值等信息。
每当一个方法执行完成时,战歌栈帧就会弹出战阵的元素作为这个方法的返回值,并清除这个栈帧。java栈顶就是当前正在执行的活动栈。PC寄存器也会执行这个位置。当这个栈帧调用另外一个方法时,与之对应的新的栈帧又被创建,并放在栈顶。
java栈中的诗句不是共享的。不会存在同步锁的问题。
3.堆
存放java的对象。
堆是被所有的java线程所共享的,要注意同步问题。
4.方法区
JVM方法区适用于存储类结构的地方,比如在class解析过程中,都会存到这个区域。
方法区属于永久区的一部分,这个区域被所有的线程所共享。大小可以通过参数来控制。
这个方法区存储的大小一般在程序启动后的一段时间就会确定了。需要加载的类通常都已经加载到jvm中了。如果项目中存在对类的动态编译,需要观察方法区的大小是否满足类存储。
5.运行时常量池
6.本地方法栈
是为native方法准备的空间。