欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础:14 JVM内存

程序员文章站 2024-03-16 11:42:04
...

1、JVM内存

JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间,可以分为两大部分,线程私有区和共享区
Java基础:14 JVM内存

2、线程私有区

  1. 程序计数器:当同时进行的线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,不免发生线程切换。这时,每个线程就需要一个属于自己的计数器来记录下一条要运行的指令。
  2. Java虚拟机栈:描述Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。与线程同时创建。每个方法执行时都会创建一个栈帧来存储方法的信息,新调用的方法入栈,返回的出栈,所以栈的大小决定方法调用的可达深度。
    特点:先进后出
  3. 本地方法栈:与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法。不同虚拟机实现的方法不同。

3、线程共享区

此区域是用来存储被各线程共享的数据

  1. 方法区:用于存放加载类的元数据信息,存储已被虚拟机加载的类信息、常量、静态变量即时编译器编译后的代码数据等(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)
  2. 堆:存放对象实例和数组,在虚拟机启动时创建,是垃圾回收的主要区域。
    注意:在Java中凡是new 出来的对象,都存放在堆区。

4、简单程序的内存使用

public static void main(String[] args) {
	int a = 10;
	System.out.println(a);
}

main方法入栈——>调用4个字节32位空间,标记为a,存储数据10——>println方法入栈——>调用println方法,获取a标记的变量空间的值,并显示在控制台

public static void main(String[] args) {
	int a = 10;
        int b = 20;
	int sum = add(a,b);
        System.out.println(sum);
}
public static int add(int a, int b) {
	return a + b;
}

(方法栈帧)main方法入栈——>(局部变量栈帧)调用4个字节32位空间,标记为a,存储数据10——>(局部变量栈帧)调用4个字节32位空间,标记为b,存储数据20——>(方法栈帧)add方法入栈——>(局部变量栈帧)产生2组临时4个字节32位空间,标记为a和b,存储数据10和20——>(方法栈帧)add方法入栈——>(局部变量栈帧)产生临时4个字节32位空间,标记为temp,存储数据30(即a+b)——>(局部变量栈帧)调用4个字节32位空间,标记为sum——>返回sum,销毁所有临时空间——>(方法栈帧)println方法入栈——>调用println方法,获取sum标记的变量空间的值,并显示在控制台——>(方法栈帧)println方法出栈,add方法出栈,重回main方法

public static void main(String[] args) {
	int[] arr =new int[] {3,2,5,8,4,1};
	for(int i = 0; i < arr.length; i++){
                System.out.println(arr[i]);
        }
}

(方法栈帧)main方法入栈——>(堆区)调用6个4个字节32位空间,标记为(地址),存储初始数据0——>(堆区)修改数据——>(方法栈帧)add方法入栈——>(局部变量栈帧)产生空间,标记为arr,存储数据地址——>(局部变量栈帧)产生临时4个字节32位空间,标记为i,存储数据0——>(方法栈帧)println方法入栈——>(堆区)产生指针,指向arr[0]——>调用println方法,获取指针所指的变量空间的值,并显示在控制台——>(循环)——>(方法栈帧)println方法出栈,add方法出栈,重回main方法

相关标签: java基础笔记整理