JAVA栈、堆、方法区

news2024/11/7 5:32:28

一、什么是JAVA栈、堆、方法区

      我们java程序的运行首先会先将.java的文件编译成.class文件,然后由JVM虚拟机的类加载器加载各个类的字节码文件到内存中进行执行,JVM虚拟机将这些数据加载到内存时会对内存进行划分为几个区域分别为栈、堆和方法区,那它们各自的作用是什么呢?

JAVA方法区

        方法区是JVM堆的一个逻辑部分,它主要分为:
        类信息池:它主要存储类每个类的信息(包括类的名称、方法信息、字段信息)以及编译器编译后的类的字节码;
        静态池:存储被static修饰的静态变量和静态方法,当加载类时会扫描将该类的static属性优先存储在静态池中,而且这个操作是在创建对象之前操作的这也就是为什么静态方法不能包含有非静态变量,同一个进程下多个线程是共享这个静态属性,从jdk8开始静态变量的移到了堆区中。

        字符串常量池:存储字符串常量当我们使用String定义一个字符串时,会先将字符串常量存储到字符串常量池中,然后将该地址返回给到变量;

JAVA堆

        堆区存储的是所有创建的对象,对象中不存放基本类型和对象引用,只存放对象本身,每个对象都包含一个对应的class信息。它同样也是被同一进程下的所有子线程共享。一旦这些对象没有被栈帧里的变量所使用时,则java里的垃圾收集器会自动清理这些对象信息。

JAVA栈

        每个方法在运行时都会创建一个栈帧,栈帧里存放的是方法的参数、局部变量和返回值等信息。每个线程有自己独立的栈区,它并不会被其他子线程共享。
        栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

二、JAVA实例

        这里我们通过一个简单的实例来模拟一下JVM的内存分配的过程。

Person类:

public class Person {
    int age;
    String name;
    double weight;
    double height;
    /**
     * 空构造器
     */
    public Person(){}

    /**
     * 构造器的重载
     * @param name
     * @param age
     * @param height
     * @param weight
     */
    public Person(String name,int age,double height,double weight){
        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
    }
    public  void addAge(int age){
        this.age +=age;
    }
}

main入口:

public static void main(String[] args) {
    Person p = new Person("张三",18,175.5,173);
    System.out.println("名字为:"+p.name);
    p.addAge(2);
}

代码执行过程:

这段代码执行的过程主要有9步:
1. main入口函数开始,在栈区给main分配了一个main函数栈帧。

2. 在实例化Person类之前需要先将Person的字节码信息加载到方法区,我们这里没有静态变量,如果有静态变量也会将静态变量先加载到静态变量池中。

3. new一个对象后会在堆区中给这个对象开辟一个对象空间。

4. 创建对象后进行对象的初始化操作,这时我们需要初始化一个name字符串常量,因此需要先将字符串常量"张三"存储到方法区里的字符串常量池中。

5. 这时给堆中的对象属性进行赋值,name赋值的是字符串常量的地址。

6. 创建完对象后,回到main方法里,将这个对象的地址给到了一个的局部变量p中,p存储到main的函数栈帧里。

7. 当我们调用addAge方法时,也需要先在栈区中为它创建一个栈帧。

8. addAge方法有个传参,变量为age,age变量放在addAge的栈帧中。

9. 执行addAge方法里的内容。

总结

        这里通过一个简单的例子介绍了java程序在执行时的过程,针对类的加载、对象的创建,属性赋值和执行方法这些操作时JVM对内存的分配情况,这也让我们更好的理解了java的执行过程,在我们现实开发过程中,如果有遇到变量是否有权限访问,以及变量赋值时是否会影响其他对象这些问题时能有一个更好的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 02

目录简介 什么是渐进式框架? 就是一开始不需要你完全掌握它的全部功能特性,可以后续逐步增加功能。没有多做职责之外的事情。所以VUE的适用面很广,你可以用它代替老项目中的JQuery。也可以在新项目启动初期,有限的使用VUE的功能…

LLM ReAct: 将推理和行为相结合的通用范式 学习记录

LLM ReAct 什么是ReAct? LLM ReAct 是一种将推理和行为相结合的通用范式,可以让大型语言模型(LLM)根据逻辑推理(Reason),构建完整系列行动(Act),从而达成期望目标。LLM ReAct 可以应用于多种语言和决策任务,例如问答、事实验证、交互式决策等,提高了 LLM 的效率、…

论文导读 | 多模态知识图谱的构建

背景介绍 现有的知识图谱大多是以单一的文本的形式表示,而多模态知识图谱会将文本信息和图像等其他模态的信息综合起来。 多模态知识图谱主要分为两种表现形式,其一是将多模态信息作为实体的属性,另一种是将多模态信息作为单独的实体。 多…

uniapp接入萤石微信小程序插件

萤石官方提供了一些适用于uniapp / 小程序的方案 如 小程序半屏 hls rtmp 等 都TM有坑 文档写的依托答辩 本文参考了uniapp小程序插件 以及 萤石微信小程序插件接入文档 效果如下 1. 插件申请 登录您的小程序微信公众平台,点击左侧菜单栏,进入设置页…

QTday04(事件)

今日任务 代码&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTimer> #include <QMessageBox> #include <QTextToSpeech> #include <QD…

利用特殊反序列化组件攻击原生反序列化入口

目录 前言 本文所述攻击的本质是将上述组件中的类拼接到反序列化利用利用链中&#xff0c;打的是Serilizable入口&#xff0c;而不是特殊反序列化入口 攻击原理 利用链分析 readObject()->任意类toString() HotSwappableTargetSource & XString BadAttributeValue…

数据防泄密软件排行榜

数字化时代&#xff0c;数据已成为企业的重要资产。然而&#xff0c;数据泄露事件却时常发生&#xff0c;给企业带来巨大的经济损失和声誉风险。因此&#xff0c;数据防泄密软件的重要性日益凸显。 数据防泄密软件是什么 它是一种专门用于防止敏感数据泄露的软件工具。它通过对…

Java虚拟机常见面试题总结

梳理Java虚拟机相关的面试题&#xff0c;主要参考《深入理解Java虚拟机 JVM高级特性与最佳实践》(第2版, 周志明 著)一书&#xff0c;其余部分整合网络相关内容。注意&#xff0c;关于Java并发编程的面试题因为内容较多&#xff0c;单独整理。Java基础相关的面试题可以参考Java…

“懒宅经济”崛起,智能家电品牌快收好这份软文推广指南

目前&#xff0c;国内智能家电呈迅猛发展之势&#xff0c;"懒宅经济"崛起使智能小家电市场不断扩展&#xff0c;根据数据显示&#xff0c;目前购买智能家电的消费者大部分目的是为了节省时间&#xff0c;以及对新鲜事物有着强烈的好奇心&#xff0c;由此来看&#xf…

Pytorch从零开始实战06

Pytorch从零开始实战——明星识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——明星识别环境准备数据集模型选择开始训练模型可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1c…

订水商城H5实战教程-01需求分析

目录 1 用户分析2 模块分析3 原型设计3.1 首页3.2 商城3.3 一键订购3.4 我的3.5 确认订单3.6 地址管理3.7 编辑地址3.8 搜索3.9 搜索结果3.10 充值3.11 我的订单3.12 开票信息3.13 优惠券3.14 我的空桶3.15 商品详情3.16 购物车3.17 门店信息3.18 订单详情 总结 生活中&#xf…

2023柏鹭杯 express fs

进去看看&#xff0c;发现有个file的参数 查看源码有个?filecheck.html&#xff0c;我们尝试?file/etc/passwd&#xff0c;发现可以直接访问任意文件&#xff0c;但是访问不到flag,可能被waf禁掉了 实际上node不能像php有伪协议可以绕&#xff0c;也没办法用什么编码绕过等&…

Android前台服务和通知

前台服务 Android 13及以上系统需要动态获取通知权限。 //android 13及以上系统动态获取通知权限 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {checkPostNotificationPermission(); } private void checkPostNotificationPermission() {if (ActivityCompat.chec…

xhadmin多应用Saas框架如何下载安装?

xhadmin是什么&#xff1f; xhadmin 是一套基于最新技术的研发的多应用 Saas 框架&#xff0c;支持在线升级和安装模块及模板&#xff0c;拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能&#xff0c;助力企业发展、国家富强&#xff0c;致力于…

小白学java--垃圾回收机制(Garbage Collection)

压测过程中&#xff0c;作为测试会时不时听到研发说命中gc了&#xff0c;如果一头雾水&#xff0c;来看看什么是gc。 1、什么是垃圾回收机制 垃圾回收的执行过程会导致一些额外的开销&#xff0c;例如扫描和标记对象、回收内存空间等操作。这些开销可能会导致一定的性能损失和…

云安全(2)--CAP_SYS_MODULE逃逸

文章目录 测试环境配置实际环境利用 测试环境配置 docker run -it --cap-addSYS_MODULE ubuntu:18.04实际环境利用 cat /proc/self/status|grep Cap然后使用capsh decode一下 capsh --decode00000000a80525fb发现有CAP_SYS_MODULE权限&#xff0c;那么直接往内核注入恶意mo…

Streamlit库开发python交互式Web应用程序

Streamlit是一个开源的Python库&#xff0c;旨在帮助开发人员轻松创建数据科学和机器学习的Web应用程序。它允许您只需几行Python代码即可构建交互式Web应用程序&#xff0c;因此常用于创建数据驱动的应用程序、仪表板和原型。Streamlit以其简单性而闻名&#xff0c;通常被数据…

光影之梦:影视动画渲染的魅力

在动画世界中&#xff0c;光影与色彩是赋予生命与灵魂的魔法。它们将虚无的想象变为具象的画面&#xff0c;让故事情感跃然于屏幕之上。影视动画渲染&#xff0c;正是这一魔法的精妙施展&#xff0c;它以光影为笔&#xff0c;色彩为墨&#xff0c;勾勒出一个个绚丽多姿的梦境。…

洗地机哪个好用?2023年洗地机推荐指南

说到提高家庭幸福生活的家电&#xff0c;洗地机肯定是少不了的&#xff0c;特别对于现在快节奏的生活来说&#xff0c;高效率的解决家务活&#xff0c;而且能够大幅度的提高生活质量。在市场上&#xff0c;消费者面临着选择合适洗地机的难题&#xff0c;因为有各种型号、功能和…