几个基本概念:
1.Java对象 2.Java方法 3.一个编译好的类,以class文件的形式出现
4.Java的本地方法 5.线程私有和线程共有
一、方法区(永久代) 和 堆(heap)
这两个区域是线程共有的,供所有线程使用。所以,对存放在这两个地方的资源进行操作时,如果是程序是多线程的,那么要考虑同步。
方法区存放的是类的类型信息。类的类型信息有,类的静态变量,其它从class文件中读取到的信息。
当用户访问一个类的静态方法或者类的静态变量,或者使用该类来创建一个对象时,如果方法区中还没有该类的信息,那么,类加载系统就会找寻对应的类文件,将其加载到方法区中
用户在运行程序的过程中,程序根据需要会动态创建若干对象,这些创建的对象将会存放在堆上,也就是堆上存放的是动态创建的对象。
二、虚拟机栈(java stack) 和本地方法栈,程序计数器
虚拟机栈,本地方法栈,程序计数器,这三个区域是线程私有的。也就是说,每个线程都有着三个东西。各个线程都独自方法自己的这三个区域。
虚拟机栈和程序计数器:
栈帧,存放了描述一个java方法的调用状态的数据;虚拟机栈是由栈帧组成的。
一个Java方法调用状态包含:该方法的本地变量,调用该方法时传递的参数,该方法的返回值,执行过程中的中间结果。
当一个线程,要执行一个方法时,那么,就会将该方法对应的栈帧入栈到虚拟机栈中;方法执行完毕,就将该栈帧从虚拟机栈中出栈。
在执行方法的时候,程序计数器,记录者线程要执行的下一条指令。
本地方方法栈,是专门用来保存本地方法的调用状态的。
参考资料: