Java程序使用的内存主要分为两大类:
虚拟内存:
这是由JVM(Java虚拟机)自己管理的内存区域,包含运行Java程序所需要的各种数据结构和运行环境。
本地内存:
这是JVM之外的内存,由操作系统直接管理,Java程序可以通过特定的机制和接口访问和使用本地内存。
从线程的角度来看,Java内存模型(Java Memory Model, JMM)定义了Java程序中变量(包括实例字段、静态字段和数组元素)的访问规则。JMM的主要目标是屏蔽底层硬件和操作系统的差异,让程序员只需关注逻辑上的一致性。Java的内存分为以下几个区域:
堆(Heap):
存储对象和数组。所有通过`new`关键字创建的对象都放在堆中,堆内存中的数据有默认值,例如整数默认为0,浮点数默认为0.0,字符默认为`\u0000`,布尔默认为false,引用类型默认为null。
栈(Stack):
存储方法调用的局部变量。每个线程在创建时都会分配一个私有的工作内存空间,用于存放该线程的方法调用所需的局部变量。当方法执行结束后,分配给该方法的栈会释放,其中的变量也随之释放。
方法区(Method Area):
存储.class相关信息,包括方法的信息。方法区也被称做静态区,用于存放全局变量、静态变量和字符串常量等数据。
总结起来,Java程序使用的内存包括由JVM管理的虚拟内存和操作系统管理的本地内存,而在Java内存模型中,内存主要分为堆、栈和方法区三个部分。