Java基础:14 JVM内存
1、JVM内存
JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间,可以分为两大部分,线程私有区和共享区
2、线程私有区
- 程序计数器:当同时进行的线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,不免发生线程切换。这时,每个线程就需要一个属于自己的计数器来记录下一条要运行的指令。
- Java虚拟机栈:描述Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。与线程同时创建。每个方法执行时都会创建一个栈帧来存储方法的信息,新调用的方法入栈,返回的出栈,所以栈的大小决定方法调用的可达深度。
特点:先进后出 - 本地方法栈:与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法。不同虚拟机实现的方法不同。
3、线程共享区
此区域是用来存储被各线程共享的数据
- 方法区:用于存放加载类的元数据信息,存储已被虚拟机加载的类信息、常量、静态变量即时编译器编译后的代码数据等(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)
- 堆:存放对象实例和数组,在虚拟机启动时创建,是垃圾回收的主要区域。
注意:在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方法
上一篇: 最近的感想 博客分类: 非技术
下一篇: SQL语句性能调整原则
推荐阅读
-
Java基础:14 JVM内存
-
JVM-G1垃圾回收器:从入门到-到搬砖系列一:简介跟基础介绍(内存模型)
-
java并发操作原语与CPU内存指令重排序 Java多线程Cache数据结构JVM
-
java并发操作原语与CPU内存指令重排序 Java多线程Cache数据结构JVM
-
学习JVM之java内存区域与异常
-
学习JVM之java内存区域与异常
-
内存溢出和内存泄露的区别 博客分类: JAVA基础
-
eclipse设置jvm 博客分类: java基础 eclipse环境配置eclipsejvm
-
eclipse设置jvm 博客分类: java基础 eclipse环境配置eclipsejvm
-
JVM内存回收总结 博客分类: java javajvmjava内存内存泄露内存溢出