
1、什么是本地方法,就是一些不方便由java实现的系统级别方法,有c或者c++实现的方法。java去进行调用,这些方法运行使用的内存就叫本地方法栈。
典型的,Object对象的clone方法,这种native方法,都是没有实现的,都是去调c或者c++实现的。
1、线程私有。在多线程执行过程中,例如:线程1执行到 第九行代码,线程1的时间片结束,cpu执行线程2代码。那么线程1里面的程序计数器会将第十行代码的地址进行存储,每个线程都有一个程序计数器。只能线程内部进行访问。当cpu切换回线程1执行时,获取程序计数器的地址接着往下执行。
2、程序计数器,唯一一个不会存在内存溢出的部分。
3、作用:加载下一条jvm指令的执行地址,物理上通过寄存器实现。
4、将java源代码编译为 二进制字节码,会将文件的首地址给解释器,同时将下一条 代码的地址加载进程序计数器。下一次解释器在进行代码执行时,就直接去程序计数器中获取地址。
1、每个线程运行时所需要的内存,称为虚拟机栈
2、每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存
3、每个线程只能有一个活动栈帧(栈顶部的那个栈帧),对应着当前正在执行的那个方法。
4、存放 基本数据类型的数据(包装数据类型存储在堆上) 、引用数据类型的变量名及对象的引用(也就是堆分配的地址),但是引用的数据与对象并不放在栈中,而是放在堆中
5、栈内存的更新速度要快于堆内存,由于局部变量的生命周期很短;
6、内存存放的变量生命周期一旦结束就会被被释放,释放顺序为先进后出
1、它是线程共享的,堆中的对象都需要思考线程安全问题
2、有垃圾回收机制
3、存放引用数据类型的数据与new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。
4、堆内存存放的实体会被垃圾回收机制不定时的回收。
1、所有java虚拟机线程共享的区域。存储和类结构相关的信息,例如:成员变量,方法数据,成员方法和构造器方法,特殊方法。
2、方法区在虚拟机启动时创建,逻辑上是堆的一个组成部分会被垃圾回收机制不定时的回收
1、在JDK1.6及之前的版本,字符串常量池存放在方法区中间,在JDK1.7版本后来,字符串常量池就被移到堆中了。
2、在java编译后生成.class文件,会放在常量池中,每一个class文件都有一个对应的class常量池。
3、会存放基本数据类型的值
4、会存放被声明为final的常量


public class Demo {
    String username;
    public void method() {
        int i=1;
        System.out.println("执行类方法");
    }
    public static void main(String[] args) {
        int i=1;
        String str="hello java";
        Demo demo=new Demo();
        demo.username="123";
        demo.method();
    }
}1、第一这是一个Demo类,那么在编译后会生成Demo.class文件,放在常量池中;
2、main方法是程序的主入口,那么在栈中会生成main方法的方法帧。
3、执行第一行代码 int i=1; 由于int是基本数据类型,会在栈中给 i=1分配内存空间。
4、下面执行String……,由于String是引用数据类型,那么str变量名会放在栈中,但是里面的值"hello java"会放在方法区的常量池中。str指向hello java。
5、 new了一个demo对象,那么会在栈中存入demo对象,指向堆中,堆中存入具体的对象属性
6、声明了demo对象的username属性,那么会在堆中存入“123”。
7、调用了demo对象的method方法,那么会在栈里面又生成一个方法帧,由于栈的先进后出的特点,会先执行新的方法帧里面的内容,这时会执行method方法里的程序,打印输出执行类方法
8、method方法执行完毕,方法帧里没有线程后,方法帧会出栈,
注意:方法帧出栈后,相对应的堆和方法区里的内容不会清空,会等到进程结束,垃圾回收机制会进行处理
9、main方法执行完毕,出栈,线程结束,栈中没有方法帧,进程结束。
