JVM 内存模型学习笔记(一)
JVM 内存模型
一、JVM 内存结构
每个线程都只能访问自己的线程栈,不能访问其他线程的局部变量。所有原生类型的局部变量都存储在线程栈中,因此对其他线程是不可见的。线程可以将一个原生变量值的副本传给另一个线程,但不能共享原生局部变量本身。
堆内存中包含了 Java 代码中创建的所有对象,不管是哪个线程创建的。其中也包含了包装类型(如:Btye、Boolean、Integer、Long、Float 等)。不管是创建一个对象并将其赋值给局部变量,还是赋值给另一个对象的成员变量,创建的对象都会被保存在堆内存中。
如果是原生数据类型的局部变量,那么他的内容就全部保留在线程栈上。如果是对象引用,则栈中的局部变量曹位中保存着对象的引用地址,而实际的对象内容保存在堆中。
对象的成员变量与对象本身一起存储在堆上,不管成员变量的类型是原生数值,还是对象引用。
类的静态变量则和类定义一样都保存在堆中。
堆内存又称为“共享堆”,堆中的所有对象,可以被所有线程访问,只要他们能拿到对象的引用地址。如果一个线程可以访问某个对象时,也就可以访问该对象的成员变量。如果两个线程同时调用某个对象的同一个方法,则他们都可以访问到这个对象的成员变量,但每个线程的局部变量副本时独立的。
二、JVM 内存整体结构
每启动一个线程,JVM 就会在栈空间栈分配对应的线程栈,比如 1MB 的空间(-Xss1m)。线程栈也叫做 Java 方法栈。如果使用了 JNI 方法,则会分配一个单独的本地方法栈(Native Stack)。
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/7e45f5e2ba619c6519b5ebdad】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论