首页 > Java > java教程 > 正文

Java 中的内存类型

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

Java虚拟机内存区域是一个运行时区域,用于执行java应用程序运行时涉及的各种程序,JVM的内存区域大致分为五个不同的部分,分别是方法区、堆区、堆栈、程序计数器(PC)寄存器区域和本机方法区域。在本文中,我们将讨论 Java 中不同类型的内存。

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

Java 中最常见的 5 种内存类型

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

1。方法区

所有正在执行的线程共享这部分JVM内存区域。类元素,如常量池、类字段、构造函数代码、方法代码等。方法区可以被视为堆区的一部分,但仅存储每个类的数据。可以说方法区负责保存类级别的信息。

2。堆内存

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

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

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

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

3。堆栈内存

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

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

4。 PC寄存器

pc寄存器的主要作用是存储当前执行指令的地址。它还存储负责执行当前指令的线程的地址。分配给pc寄存器的内存大小非常小。在 JVM 中执行的 Java 应用程序不会对 PC 寄存器内存或其内容产生任何影响。

5。原住民地区

该区域是使用java以外的语言实现的。随着新线程的创建,内存将在该区域中为每个创建的线程分配。原生区域的大小可以是固定的,也可以是动态的。

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 中的内存类型

内存分配:

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

  • 在Main类中,进入main方法后,由于id,name为局部变量,在栈内存中创建了一个空间,如下所示:
    • 具有原始值的整数 id 将存储在堆栈内存中。
    • StudentData 对象 s 的引用存储在堆栈内存中,指向原始 StudentData 对象,而原始 StudentData 对象存储在堆内存中。
  • 对 StudentData 类构造函数的调用将进一步添加到堆栈内存的顶部。将存储以下内容:
    • 调用对象的引用。
    • 整数变量 id,值为 11。
    • String类型变量名的引用,它将指向堆内存中字符串池中存储的实际对象。
  • 在StudentData类中声明的两个名为studentId和studentName的实例变量将被存储在堆内存中。

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

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