Java 的内存分配策略主要涉及到三种类型的内存区域:静态存储区(也称为方法区)、栈区和堆区。
静态存储区(方法区):
-
主要存放静态数据、全局static数据和常量。
-
这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
栈区:
-
当方法被执行时,方法体内的局部变量(包括基础数据类型、对象的引用)都在栈上创建。
-
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
-
栈区的内存会在方法执行结束时自动被释放。
堆区:
-
堆是用来存放对象的,堆中的内存可以按照任意顺序分配和释放。
-
堆由大片的可利用块或空闲块组成,由Java的垃圾回收器来负责回收不再使用的内存。
多个线程同时请求内存,如何分配?
在Java中,每个线程都有自己独立的栈空间,用于存储该线程的局部变量和方法调用信息。当多个线程同时请求内存时,它们各自在自己的栈空间中进行分配,互不影响。
对于堆区的内存分配,多个线程可以共享同一块堆内存。当线程需要创建对象时,它会向堆区申请内存空间,并通过指针(即对象的引用)来访问这个对象。由于堆区是共享的,因此需要采取同步措施来确保线程安全,避免多个线程同时修改同一个对象导致数据不一致的问题。
Java提供了多种同步机制来确保线程安全,例如synchronized关键字、ReentrantLock等。这些同步机制可以控制对共享资源的访问,确保同一时间只有一个线程可以访问某个资源,从而避免数据不一致的问题。
Java的垃圾回收器会自动回收不再使用的内存空间,包括堆区中的对象。当对象不再被引用时,垃圾回收器会将其标记为可回收状态,并在适当的时候回收其占用的内存空间。这有助于防止内存泄漏和内存溢出等问题。


659

被折叠的 条评论
为什么被折叠?



