JVM学习-基础篇-堆&方法区

一般 Java 程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实现对象在线程之间共享。

java 复制代码
public class Test {    
    public static void main(String[] args) {        
        Student s1 = new Student();        
        s1.name = "张三";       
        s1.age = 18;       
        s1.id = 1;
        s1.printTotalScore();        
        s1.printAverageScore();        
        
        Student s2 = new Student();       
        s2.name = "李四";        
        s2.age = 19;        
        s2.id= 2;        
        s2.printTotalScore();        
        s2.printAverageScore();    
    }
}

这段代码中通过 new 关键字创建了两个 Student 类的对象,这两个对象会被存放在堆上。在栈上通过 s1和 s2 两个局部变量保存堆上两个对象的地址,从而实现了引用关系的建立。

堆内存的溢出

堆内存大小是有上限的,当对象一直向堆中放入对象达到上限之后,就会抛出OutOfMemory错误。

三个重要的值

堆空间有三个需要关注的值,used、total、max。used指的是当前已使用的堆内存,total是java虚拟机已经分配的可用堆内存,max是java虚拟机可以分配的最大堆内存。

设置堆的大小

要修改堆的大小,可以使用虚拟机参数 --Xmx(max最大值)和-Xms (初始的total)。

语法:-Xmx值 -Xms值

单位:字节(默认,必须是 1024 的倍数)、k或者K(KB)、m或者M(MB)、g或者G(GB)

限制:Xmx必须大于 2 MB,Xms必须大于1MB

bash 复制代码
-Xms6291456
-Xms6144k
-Xms6m
-Xmx83886080
-Xmx81920k
-Xmx80m

方法区

方法区是存放基础信息的位置,线程共享,主要包含:

1、 类的元信息,保存了所有类的基本信息

2、 运行时常量池,保存了字节码文件中的常量池内容

  • 编译期生成的字面量(如字符串字面量、final常量)

  • 符号引用

3、 静态变量

4、 即时编译器(JIT)编译后的代码

类的元信息

方法区是用来存储每个类的基本信息(元信息),一般称之为 InstanceKlass对象。在类的加载阶段完成。其中就包含了类的字段方法等字节码文件中的内容 ,同时还保存了运行过程中需要使用的虚方法表(实现多态的基础)等信息。

运行时常量池

常量池中存放的是字节码中的常量池内容。

字节码文件中通过编号查表的方式找到常量,这种常量池称为静态常量池。当常量池加载到内存中之后,可以通过内存地址快速的定位到常量池中的内容,这种常量池称为运行时常量池。

字符串常量池

方法区中除了类的元信息、运行时常量池之外,还有一种区域叫字符串常量池(String Table)

字符串常量池存储在代码中定义的常量字符串内容。比如"123"这个123就会被放入字符串常量池。

方法区的实现
  • JDK 7将方法区存放在堆区域的永久代空间,堆的大小由虚拟机参数 -XX:MaxPermSize = 值来控制。

  • JDK 8将方法区存放在元空间中,元空间位于操作系统维护的直接内存中,默认情况下只要不超过操作系统承受的上限,可以一直分配。可以使用 -XX:MaxMetaspaceSize = 值将元空间最大大小进行限制。

在 JDK 7 及之前的版本中,静态变量是存储在方法区(永久代)的,而从 JDK 8 开始,随着永久代的移除,静态变量被存储在了堆区,并且位于 Class 对象内部。

相关推荐
ThsPool31 分钟前
【ENVI二次开发学习整理 02】IDL语言基础与程序设计
学习·中间件
一只小菜鸡..1 小时前
南京大学 操作系统 (JYY) 学习笔记:文件系统实现——从 FAT、ext2 到现代 B-Tree 黑科技
笔记·科技·学习
深爱水瓶 血影S狂风1 小时前
Linux.NET学习手记(2)
linux·学习·.net
明明真系叻1 小时前
RAG学习(1)
学习·rag
✎ ﹏梦醒͜ღ҉繁华落℘1 小时前
单片机基础知识--LVGL学习-lv_obj_add_flag()
c语言·单片机·学习
春水碧于天,画船听雨眠1 小时前
LangChain学习笔记(一)
笔记·学习·langchain
zerwave2 小时前
Docker 学习:多容器网络互通——从 host 模式到自定义 bridge 网络
网络·学习·docker
Zzj_tju2 小时前
Instruction Tuning 论文精读路线:从 Supervised Fine-Tuning 到 Instruction Following
人工智能·笔记·学习·语言模型·自然语言处理
j7~2 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
min(a,b)3 小时前
学习第10天:日志、测试、配置与容器化部署
学习