JVM入门之内存结构(堆、方法区)

yizhihongxing

JVM入门之内存结构(堆、方法区)

JVM是Java虚拟机的缩写,是Java技术的核心和基础。学习JVM内存结构对于Java程序员来说非常重要,本文将对JVM内存结构、堆和方法区进行详细讲解。

JVM内存结构

JVM的内存结构主要由以下几个部分组成:

  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
  • 方法区

其中堆和方法区是Java程序中数据存储的主要区域,我们重点来详细介绍。

堆是Java虚拟机中内存最大的一块,所有类的实例和数组都在堆上分配空间。堆是线程共享的,所有线程都可以访问并修改堆中的对象。

Java中,堆内存的大小是通过-Xmx和-Xms指定的,-Xmx指定堆内存的最大容量,-Xms指定堆内存的初始容量。

堆的分类

Java堆分为新生代和老年代两部分,新生代又分为Eden空间、Survivor1空间、Survivor2空间(也叫From空间和To空间)。

  • 新生代:是所有新创建对象的存储空间,占堆空间的一部分,一般为1/3。新生代的大小可以通过-Xmn来指定,默认为整个堆的1/3。

  • 老年代:是存储长期存活的对象的空间,占堆空间的2/3。老年代的大小可以通过-XX:PermSize和-XX:MaxPermSize来指定。

堆的垃圾回收

Java中的垃圾回收主要是针对堆中的对象的回收。垃圾回收的目的是为了使Java程序能够自动释放不再被使用的内存空间。

Java的垃圾回收算法主要包括三种:

  • 标记-清除算法
  • 复制算法
  • 标记-整理算法

其中复制算法一般用于新生代内存的垃圾回收,而标记-清除算法和标记-整理算法一般用于老年代内存的垃圾回收。

方法区

方法区是用于存储类的相关信息,比如类的成员变量、方法信息、静态变量、运行时常量池等等。方法区的大小由-XX:PermSize和-XX:MaxPermSize参数指定,默认值为64M。

方法区的分类

方法区分为两个部分:常量池和类信息。

  • 常量池:Class文件中的常量池用于存放编译期生成的各种字面量和符号引用。
  • 类信息:存放每个类的结构信息,比如成员变量、方法等信息。

方法区的垃圾回收

方法区的垃圾回收主要针对无用的类和常量的回收。Java7及之前的版本中,方法区的垃圾回收主要依靠对类的卸载实现。Java8开始,方法区的垃圾回收采用了元空间的概念进行实现。元空间直接使用本地内存,因此不存在垃圾回收问题。

示例说明

示例一

public class Demo1 {
    public static void main(String[] args) {
        byte[] b1 = new byte[1024 * 1024];
        System.out.println("分配了1M空间给b1");
        byte[] b2 = new byte[1024 * 1024 * 2];
        System.out.println("分配了2M空间给b2");
        byte[] b3 = new byte[1024 * 1024 * 3];
        System.out.println("分配了3M空间给b3");
        byte[] b4 = new byte[1024 * 1024 * 4];
        System.out.println("分配了4M空间给b4");
    }
}

这个示例中分别分配了1M、2M、3M、4M的空间给b1、b2、b3、b4。由于堆大小为5M(默认为整个堆的1/3),因此最后一次分配空间的时候会出现OutOfMemoryError错误。

示例二

public class Demo2 {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = "abc";
        String s3 = "ab" + "c";
        System.out.println(s1 == s2); // false
        System.out.println(s1 == s3); // false
        System.out.println(s2 == s3); // true
    }
}

这个示例中,我们分别使用new关键字和直接赋值的方式创建了三个字符串对象s1、s2、s3。Java的字符串常量会被JVM缓存,因此s2和s3引用的是同一个字符串常量对象。而s1由于使用了new关键字创建,因此它引用的是一个新的字符串对象,与s2和s3不同。因此s1、s2、s3三个变量的比较结果也是不同的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JVM入门之内存结构(堆、方法区) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java 汇编JVM编写jasmin程序的操作方法

    Java汇编是一种利用Jasmin工具编写JVM汇编代码的技术。在Java虚拟机中,Jasmin程序就相当于Java程序源代码,可以通过JVM将其转化为可执行的二进制代码。以下是Java汇编JVM编写jasmin程序的完整实现攻略。 步骤一:安装Jasmin Jasmin是一个免费的开源工具,可以从其官方网站下载最新版本:http://jasmin.sour…

    Java 2023年5月23日
    00
  • SpringBoot中热部署配置深入讲解原理

    SpringBoot中热部署配置深入讲解原理 热部署是指在应用程序运行时,对代码进行修改后,无需重启应用程序即可使修改生效。在Spring Boot中,可以通过配置实现热部署。本文将深入讲解Spring Boot中热部署的原理,并提供两个示例。 原理 Spring Boot中的热部署是通过Spring Boot DevTools实现的。Spring Boot…

    Java 2023年5月15日
    00
  • Java版水果管理系统源码

    Java版水果管理系统源码攻略 系统介绍 Java版水果管理系统源码是一款基于Java语言开发的水果供应管理系统,主要用于管理水果供应链上的各个环节,包括水果添加、修改、删除、查看等功能,同时还支持销售管理、库存管理、供应商管理等功能,满足了水果供应管理中的各种需求。该系统使用MVC设计模式,采用Java Swing作为前端界面开发框架,使用MySQL数据库…

    Java 2023年5月24日
    00
  • Java String类简单用法实战示例【字符串输出、比较】

    给您详细讲解一下Java String类的用法。 String类简介 在Java中,String类是一个代表字符串的类,字符串是一种常用的数据类型,它代表一个不可变的字符序列,即一旦创建,就不能再改变它的值,除非创建一个新的字符串。因此,String对象是不可变的。 字符串输出 我们可以使用System.out.println()方法在控制台输出字符串。下面…

    Java 2023年5月26日
    00
  • Java调试器的作用是什么?

    Java调试器是帮助Java程序员识别和纠正程序错误或问题的工具。使用调试器可以单步执行程序,查看代码执行状态和变量的值,并在运行时发现程序错误和异常。 以下是使用Java调试器的步骤: 1. 配置调试器 在使用Java调试器之前,需要将调试器连接到正在运行的Java进程。一般来说,可以使用IDE(集成开发环境)来连接调试器。 以Eclipse为例,可以通过…

    Java 2023年5月11日
    00
  • 从基础学java–数组

    从基础学java–数组 什么是数组 数组是一种可以存储一组数据的结构,这些数据可以是同一类型或不同类型的。在Java中,数组是存储同一类型数据的容器,它们通过下标进行访问。 定义数组 在Java中,可以使用以下语法定义数组: dataType[] arrayName; // 声明数组 arrayName = new dataType[arrayLength…

    Java 2023年5月26日
    00
  • JAVA用递归实现全排列算法的示例代码

    全排列算法是一个经典的、递归思想的算法,它将一组数据按照一定顺序排列,使得每个数据都和其他数据组成一组不同的排列。在JAVA中,我们可以利用递归的思想来实现全排列算法。以下是针对该问题的完整攻略: 1. 全排列算法的基本原理: 全排列算法的基本原理是:对于一个长度为n的序列,全排列可分解为两部分:固定第一个元素,对剩余的n-1个元素进行全排列;再将每一个排列…

    Java 2023年5月26日
    00
  • Java的Struts框架报错“ActionFormException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionFormException”错误。这个错误通常由以下原因之一起: 表单验证失败:如果表单验证失败,则可能会出现此错误。在这种情况下,需要检查表单验证规则以解决此问题。 表单数据类型不匹配:如果表单数据类型与ActionForm中定义的类型不匹配,则可能会出现此错误。在这种情况下,需要检查表单数据类型…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部