最近了解了一下jvm的内存模型,它分为5个部分,程序计数器,栈,堆,本地方法栈,元空间,
其中,程序计数器是一块很小的内存空间,用来记录各个线程执行的字节码地址,
本地方法栈是用来管理本地方法的调用,这个是由c/c++实现,因为Java它本身一些跨平台的特性,它是不能直接调用动态链接库的,如果我们需要使用Java来调用动态链接库的话,就需要借助jnl来实现,这个本地方法栈就是来存储jnl本地方法的,jnl的方法我们需要用native来修饰,栈是主要用来存放局部变量表,字节码操作,动态链接,其中程序计数器,本地方法栈和栈它们三个是线程私有的,每个线程的这块内存区域都是独立的, 元空间是用来存储一些静态数据和类的加载信息,最后是堆,堆是jvm中最大的一块内存,堆是线程共享的,所有的线程都使用同一块堆区域。
其实在我们new一个对象时,Java会先在栈中创建一个变量,然后把这个对象中的数据存储到堆中,栈中的变量存储的是一个内存地址,相当于是一个指针,这个指针指向堆中存储对象数据的那片区域,当我们的代码运行结束后,栈中的数据会自动清除,但堆中的数据不会自动清除,它需要由我们Java的GC(垃圾回收机制)来清除,Java程序的字节码在内存中是以栈的方式存储的。