JVM相关知识简要整理说明

当我们在Java中编写代码时,JVM(Java虚拟机)是我们的代码执行的环境。JVM是Java程序的核心,它负责将我们编写的Java代码转换成可执行的机器码。

1.首先说明一下JVM中的加载程序时用到的3个区域:

当Java程序在运行时被加载到JVM中时,JVM会将程序分为三个区域:方法区。这三个区域分别用于存储不同类型的数据,下面我来具体说一说。

1.堆

在计算机科学中,堆(Heap)是一种动态分配内存的存储区域。它是在程序运行时动态分配的,用于存储引用数据类型的对象和数据。堆的创建和释放不依赖于程序的静态代码结构,而是根据运行时的需求进行动态管理。

堆内存是用来存储Java对象的数据结构,它在程序运行时动态地分配和释放内存。当我们创建一个对象时,Java会在堆内存中分配空间来存储该对象的数据和属性。堆内存的大小由Java虚拟机(JVM)的堆大小配置决定。

堆内存的特点包括:

  • 动态分配:堆内存的大小根据程序的需要动态分配,可以根据对象的大小和数量进行自动调整。
  • 对象存储:堆内存主要用于存储Java对象,每个对象都有一个在堆上分配的内存空间。
  • 垃圾收集:堆内存中的对象不再被引用时,垃圾收集器会自动回收这些对象所占用的内存空间,以便供其他对象使用。

与堆内存相对应的是栈内存(Stack Memory),栈用于存储程序的调用栈和局部变量等数据。栈内存在程序运行时被动态分配和释放,其大小由编译器和执行时的上下文决定。

需要注意的是,堆内存的管理对于开发者来说是透明的,因为Java的垃圾收集器会自动处理的创建、释放和内存回收。开发者无需手动管理堆内存,只需要关注对象的创建和使用即可。

堆是Java程序中最重要的一部分,它用于存储对象。当我们使用new关键字创建一个对象时,JVM会在堆中为这个对象分配一块连续的内存空间。堆的大小是可以动态调整的,可以通过设置JVM参数来控制堆的大小。

在堆中存储的对象是共享的,即多个线程可以同时访问同一个对象。因此,在多线程编程中,需要注意对象的线程安全性问题。

2.栈

栈一般用于存放方法调用的信息,包括方法的参数、局部变量、返回值和异常信息等。每个线程都有自己的栈,用于存储方法调用的信息

具体来说,栈主要用于存储以下几种数据:

(1)方法的参数

当一个方法被调用时,JVM会将方法的参数压入栈中,以便方法可以访问这些参数。

(2)局部变量

在方法中定义的变量称为局部变量,局部变量的作用域仅限于方法内部。当一个方法被调用时,JVM会在栈中为方法的局部变量分配空间,并在方法执行结束后释放这些空间。

(3)返回值

当一个方法执行完毕后,JVM会将方法的返回值压入栈中,并将栈顶的返回值弹出,以便调用方法可以访问这个返回值。

(4)异常信息

当一个方法抛出异常时,JVM会将异常信息压入栈中,以便程序可以捕获和处理这个异常。当异常被捕获和处理后,JVM会将异常信息从栈中弹出。

       总的来说,JVM中的栈主要用于存储方法调用的信息,包括方法的参数、局部变量、返回值和异常信息等。

3.方法区

方法区是Java程序中用于存储类的信息的区域。方法区包含了类的字节码静态变量常量池等信息。方法区的大小是固定的,一般情况下为几十MB。

在方法区中存储的类的信息是共享的,即多个线程可以同时访问同一个类的信息。因此,在多线程编程中,需要注意类的线程安全性问题。

3.1常量池:

  • 常量池是Java虚拟机中的一块内存区域,用于存储字符串常量、基本类型常量和符号引用。在Java程序中,常量池是一个重要的概念,它可以提高程序的性能和可读性。
  • 常量池分为两种:运行时常量池和编译时常量池。

(1)运行时常量池:

  • 运行时常量池是在类加载时动态生成的,用于存储类的常量。在运行时常量池中,可以存储字符串常量、基本类型常量和符号引用。在Java程序中,我们可以使用String.intern()方法将字符串常量添加到运行时常量池中。
  • 运行时常量池是每个类的私有数据区域,用于存储类的常量。在类的加载过程中,JVM会读取类的字节码文件,并将其中的常量添加到运行时常量池中。运行时常量池的大小是固定的,一般情况下为几十MB。

(2)编译时常量池:

  • 编译时常量池是在编译时生成的,用于存储编译时的常量。在编译时常量池中,可以存储字符串常量、基本类型常量和符号引用。在Java程序中,我们可以使用final关键字定义常量,并将其添加到编译时常量池中。
  • 编译时常量池是每个类的共享数据区域,用于存储类的常量。在编译时,编译器会将类中的常量添加到编译时常量池中。编译时常量池的大小是固定的,一般情况下为几十KB。
  • 总的来说,常量池是Java虚拟机中的一块内存区域,用于存储字符串常量、基本类型常量和符号引用。在Java程序中,常量池是一个重要的概念,它可以提高程序的性能和可读性。在编写Java程序时,我们应该注意使用常量池来存储常量,以提高程序的性能和可读性。

总的来说,Java程序在运行时会被加载到JVM中,并被分为三个区域:堆、栈和方法区。堆用于存储对象,栈用于存储方法调用的信息,方法区用于存储类的信息。对于Java程序员来说,了解JVM的内存结构和机制是非常重要的,这可以帮助我们编写更高效、更优秀的Java代码。

结合下图

图片来源: 

https://blog.csdn.net/qq_36382679/article/details/105811282

2.在Java编程中,JVM涉及到很多方面,如类的加载、new一个类、方法的加载、定义一个静态变量等等,下面我会逐一介绍。

1.类的加载

在Java中,类的加载是指将类的字节码文件加载到JVM中,并在JVM中生成一个对应的Class对象。类的加载是JVM的一个重要功能,它负责将类的字节码文件加载到JVM中,以便程序能够使用这些类。

类的加载过程分为三个阶段:加载、连接和初始化。在加载阶段,JVM会读取类的字节码文件,并生成一个对应的Class对象。在连接阶段,JVM会进行验证、准备和解析等操作。在初始化阶段,JVM会执行类的静态代码块,并初始化类的静态变量。

2.new一个类

在Java中,我们可以使用new关键字来创建一个类的实例。当我们使用new关键字创建一个类的实例时,JVM会在堆内存中为这个实例分配空间,并调用类的构造函数来初始化这个实例。

3.方法的加载

在Java中,方法的加载是指将方法的字节码文件加载到JVM中,并在JVM中生成一个对应的Method对象。方法的加载是JVM的一个重要功能,它负责将方法的字节码文件加载到JVM中,以便程序能够调用这些方法。

方法的加载过程分为两个阶段:加载和连接。在加载阶段,JVM会读取方法的字节码文件,并生成一个对应的Method对象。在连接阶段,JVM会进行验证、准备和解析等操作。

4.定义一个静态变量

在Java中,我们可以使用static关键字来定义一个静态变量。静态变量是类级别的变量,它属于类而不属于对象,所有的对象共享同一个静态变量。当我们定义一个静态变量时,JVM会在方法区中为这个静态变量分配空间,并将其初始化为默认值。

总的来说,在Java编程中,JVM涉及到很多方面,如类的加载、new一个类、方法的加载、定义一个静态变量等等。对于Java程序员来说,了解JVM的工作原理和机制是非常重要的,这可以帮助我们编写更高效、更优秀的Java代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ヾ草木萤火(≧▽≦*)o

希望大家多多支持,我会继续分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值