Java文件编译后生成class文件,class文件包含Java成型执行的字节码。
Java运行时数据区:
线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁
线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁
方法区:JVM用来存储加载类信息,常量,静态变量,编译后的代码等数据,虚拟机规范中这是一个逻辑区划分、具体实现根据不同虚拟机来实现。
堆内存:细分为老年代,新生代(Eden,S0,S1),JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存。如果满了,就会出现OOM。
虚拟机栈:每个线程都在JVM运行时数据区有一个私有的空间。
线程栈由多个栈帧组成,栈帧主要包含本地变量表,操作数栈。
一个线程会执行一个或者多个方法,一个方法对应一个栈帧;
栈帧内容包含:局部变量表,操作数栈,动态链接,方法返回地址,附加信息等;
栈内存默认最大是1M,超出则抛出StackOverFlowError。
程序计数器:记录当前线程执行的字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空。
每个线程都在JVM运行时数据区有的空间,占用内存很少。
CPU同一时间,只会执行一条线程中的指令,JVM多线程会轮流切换并分配CPU执行时间。
为了线程切换后,恢复正确的执行位置,需要通过程序计数器来记录。