首页 > Java > java教程 > 正文

Java中的内存分配

王林
发布: 2024-08-30 15:17:34
原创
570 人浏览过

java中的内存分配可以定义为给java程序或服务分配存储的过程。 java中的内存分配是在JVM(Java虚拟机)内存中完成的,大致分为堆内存和非堆内存。本文将详细介绍堆内存和栈内存(相当于非堆内存)是如何分配给Java程序的。

广告 该类别中的热门课程 JAVA 掌握 - 专业化 | 78 课程系列 | 15 次模拟测试

Java 中的内存分配是如何工作的?

众所周知,java是一种面向对象的语言;因此,Java中创建的所有对象都存储在JVM(Java虚拟机)中。 JVM内存分为以下几个部分:

Java中的内存分配

1.堆内存

Java运行时在执行Java程序时使用堆内存为对象和类分配内存。每当在java中创建一个对象时,它就会存储在堆内存中。此外,垃圾收集进程在堆内存上运行,以释放不必要的空间;垃圾收集从堆区域中删除那些没有任何引用的对象。 java中的堆内存分为以下几个部分:

  • 年轻代:这是放置所有新创建的对象的部分。当 Java 堆的这一部分被填满时,会发生一次小型垃圾回收以释放空间。
  • 老年代:小垃圾回收后内存中剩余的所有对象都会移入老年代。因此,这是堆内存中存在长期存活对象的部分。
  • 永久代:JVM 的这一部分包含本机和静态方法,为运行 Java 应用程序提供元数据。

以下是有关 Java 堆内存的一些要点:

  • 如果堆空间已满,java 会抛出 OutOfMemory 错误。
  • 与堆栈内存相比,访问堆内存的速度较慢。
  • 与堆栈内存相比,堆内存的大小要大得多。
  • 堆内存不是线程安全的,因为所有对象都共享它。
  • 堆内存中不存在自动释放,因为它需要垃圾收集器来释放空间。

2.堆栈内存

顾名思义,堆栈内存基于 LIFO(后进先出)原则。栈内存用于静态内存分配,java程序中的每个执行线程都有自己的栈内存。每当调用 Java 方法时,都会在 Java 堆栈内存中创建一个新块,用于保存本地或中间变量以及对方法中其他对象的引用。一旦该方法执行完成,堆栈中的内存块就会变空并被下一个方法使用。因此,堆栈内存大小小于堆内存。以下是堆栈内存的一些重要特性。

  • 随着新方法添加到堆栈内存和从堆栈内存中删除,堆栈内存会增长和缩小。
  • 方法完成执行后,堆栈内存会自动分配和释放。
  • 与堆内存相比,访问堆栈内存的速度更快。
  • 每当堆栈内存满时,java就会抛出一个称为堆栈溢出异常的异常。
  • 堆栈内存是线程安全的,因为每个线程都有自己的堆栈内存。

这是java中堆栈和堆内存的一个小比较:

             
              Heap Memory          Stack Memory
The entire application uses heap memory during its runtime. The application in parts uses stack memory. That means it is used one at a time during thread execution.
Heap memory is larger than stack memory. Stack memory is small as compared to heap memory.
All objects created during the application are stored in heap memory. Stack memory only stores local variables and references to objects.
Access to heap memory is slow. Access to stack memory is fast as compared to heap memory.
Heap memory is allocated by creating new objects and gets deallocated by a garbage collector. Stack memory is automatically allocated and deallocated with the end in method execution.
Heap memory stays as long as the application is running. Stack memory stays only until a method is executing.
堆内存          堆栈内存 整个应用程序在运行时使用堆内存。 部分应用程序使用堆栈内存。这意味着它在线程执行期间一次使用一个。 堆内存大于堆栈内存。 与堆内存相比,堆栈内存较小。 应用程序期间创建的所有对象都存储在堆内存中。 堆栈内存仅存储局部变量和对象引用。 访问堆内存很慢。 与堆内存相比,访问堆栈内存的速度更快。 堆内存通过创建新对象来分配,并由垃圾收集器释放。 堆栈内存在方法执行结束时自动分配和释放。 只要应用程序运行,堆内存就会保留。 堆栈内存仅保留到执行方法为止。 表>

Java 中的内存分配示例

现在我们将看到一个 Java 示例,展示如何分配内存

代码:

package com.edubca.javademo;
class StudentData{
int rollNumber;
String name;
public StudentData(int rollNumber, String name) {
super();
this.rollNumber = rollNumber;
this.name = name;
}
public int getRollNumber() {
return rollNumber;
}
public void setRollNumber(int rollNumber) {
this.rollNumber = rollNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
int id = 11;
String name = "Yash";
StudentData s = null;
s = new StudentData(id, name);
System.out.println("Student Id is " + s.getRollNumber());
System.out.println("Student Name is " + s.getName());
}
}
登录后复制

输出:

Java中的内存分配

现在我们来看看上面的程序中内存是如何分配的:

1.在Main类中,进入main方法后,由于id、name是局部变量,因此在栈内存中创建了一个空间,如下所示:

  • 具有原始值的整数 id 将存储在堆栈内存中。
  • StudentData 对象 s 的引用存储在堆栈内存中,指向原始 Student 对象,而原始 Student 对象存储在堆内存中。

2.对 StudentData 类构造函数的调用将添加到堆栈内存的顶部。结果,将存储以下内容:

  • 调用对象的引用。
  • 整数变量 id,值为 11。
  • String类型变量名的引用将指向堆内存中字符串池中存储的对象。

3. StudentData类中声明的两个实例变量将存储在堆内存中。

以上是Java中的内存分配的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板