栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

JVM底层分析

Java 更新时间:发布时间: 百科书网 趣学号
class Student{
    int stuNum;
    String name;
    int age;
    void show(){
        System.out.println("学号:"+stuNum+" 姓名:"+name+" 年龄:"+age);
    }
    Student(){}
}
public class Stu {
    public static void main(String[] args) {
        Student s1=new Student();
        s1.age=18;
        s1.stuNum=1;
        s1.name="嘿嘿";
        s1.show();
        Student s2=new Student();
        s2.age=18;
        s2.stuNum=2;
        s2.name="嘻嘻";
        s2.show();
    }
}

近期学习Java300集总结而来,有何不对欢迎私信。

JVM中有虚拟机栈,堆,方法区。由于jdk的版本不同,方法区的定义可能会有所不同。

先浅谈一下什么是虚拟机栈,堆,方法区。

虚拟机栈

1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)。 2. JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等) 3. 栈属于线程私有,不能实现线程间的共享! 4. 栈的存储特性是“先进后出,后进先出”。 5. 栈是由系统自动分配,速度快!栈是一个连续的内存空间! 堆 1. 堆用于存储创建好的对象和数组(数组也是对象) 2. JVM 只有一个堆,被所有线程共享 3. 堆是一个不连续的内存空间,分配灵活,速度慢! 4. 堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生 代、老年代的划分。 方法区 1. 方法区是 JAVA 虚拟机规范,可以有不同的实现。   (1). JDK7 以前是“永久代”   (2). JDK7 部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中   (3). JDK8 是“元数据空间”和堆结合起来。 2. JVM 只有一个方法区,被所有线程共享! 3. 方法区实际也是堆,只是用于存储类、常量相关的信息! 4. 用来存放程序中永远是不变或唯一的内容。 5. 常量池主要存放常量:如文本字符串、final 常量值。 程序执行过程

1.程序从main方法开始,加载里面的变量,

 

2.当程序执行到 Student s1=new Student();中的Student时,方法区会加载Student类,加载一些这个类的方法和引用数据类型的变量,并为其模块编写地址。

 

3.接着执行这句代码,该执行s1时,会在main的栈帧中添加s1变量,如下图所示

4.当程序执行到new关键字时,会在堆里面开辟空间和在虚拟机栈中创建Student的栈帧,并按照方法区里面的模板来进行创建。并且给s1赋值。其中String类型的变量和方法采用引用地址的方式。

5.Student s1=new Student();执行完之后虚拟机栈中Student的栈帧释放,并执行对对象中的变量进行赋值语句。如图所示:

6.当执行到s1.show();时,会在虚拟机栈中创建show的栈帧。虽然此方法看似没有传参数,但是会传隐式参数this,以便于获得学号、姓名和年龄的值。

7.执行完之后,虚拟机栈中show的栈帧释放。如下图所示:

8,创建第二个对象s2的过程重复步骤3到7。

9. 执行完之后,虚拟机栈中main的栈帧释放。程序结束。

 

 

 

 

 

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/959678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号