了解Java之虚拟机
线程私有:程序计数器、虚拟机栈、本地方法栈;(随着线程的创建而创建,随着线程的死亡而死亡)
线程共享:堆、方法区。
程序计数器:
- 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
- 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
虚拟机栈:为虚拟机执行 Java 方法 (也就是字节码)服务
本地方法栈:为虚拟机使用到的 Native 方法服务
方法/函数的调用:java中函数的调用遵循栈原理,先进后出,如:方法A调用方法B,方法B又调用方法C,那么方法A先被压入java栈,然后方法B被压入java栈,最后方法C被压入java栈;当C方法执行完成后,C方法被弹出java栈,然后继续执行B方法剩余的部分,等B方法执行完成,B方法被弹出Java栈,最后再执行方法A,当方法A执行完成,A方法被弹出Java栈,从而完成整个方法的调用。
堆:是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。Java堆还可以细分为:新生代和老年代。是垃圾收集器管理的主要区域。
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JDK 1.8 的时候,方法区被彻底移除了(JDK1.7就已经开始了),取而代之是元空间,元空间使用的是直接内存。