JVM 详解

内存中栈(stack)、堆(heap)和方法区(method area)

  • 一个JVM就是一个进程,一个进程中有多个线程
  • JVM的运行时内存可以简单的分为如下几部分:

栈(Stack)

  • 每个线程有都自己的栈,用于存储对象的引用
  • 基本数据类型保存在栈中,保存的是实际值;引用类型也保存在栈中,保存的是实际对象的地址(即对象的引用);
  • 栈内存的数据用完就会被释放
  • 数组也是引用类型,数组的对象引用放在栈中

堆(Heap)

  1. 一个JVM只有一个堆,所有的对象都在堆上分配

方法区(Method Area)

  1. 一个JVM只有一个方法区,包含了所有载入的类的字节码和static修饰的静态变量

public static void main(String[] args) {
    /** 上面的语句中变量str放在栈上
     * new创建出来的字符串对象放在堆上
     * "hello"这个字面量放在静态区。
     */
    String str = new String("hello");
}

Java内存模型

  • Java虚拟机有自己的内存模型(Java Memory Model,JMM),JMM可以屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。
  • JMM是个抽象的内存模型,所以所谓的本地内存、主内存都是抽象概念,并不一定就真实的对应电脑系统的cpu高速缓存与物理内存,但可以简单的这么理解和记忆。
  • JMM定义了线程和主内存之间的抽象关系:共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory)也叫工作内存,本地内存保存了被该线程使用到的主内存的副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量





猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/80582286