java的内存图

明确:jre jdk jvm关系

(详细去看这篇文章)

三者的大致结构是这样的,简单来说就是JDK包含JRE,JRE又包含JVM的关系。如下图所示:

从图中可以看出JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java开发工具(javac/java/jdb等)和Java基础的类库(即Java API 包)。

java底层内存图

从jdk8开始,java取消了方法区的概念,增加元空间,将原来方法区的功能分给了元空间和堆

下文我还是把元空间称为方法区

java底层用C申请一个大数组,划分为方法区,栈,堆,程序计数器,本地方法栈

  • 方法区:存有类信息,静态信息常量池
  • 栈:方法拷贝运行
  • 堆:对象,字符串常量池
  • 程序计数器:辅助栈区域,决定什么时候出栈入栈。
  • 本地方法区:翻译成操作系统本身的内核方法,对接驱动程序

出现第一个问题:已经有有一个方法区,为什么还要添加一个本地方法区,多此一举??

有时java应用需要与java外面的环境交互,这是本地方法存在的主要原因。

    你可以想想java需要与一些底层系统,如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节,正是有了它才可以通过操作系统驱动硬件。

java运行时本地方法栈也会消耗外面的内存(例如操作系统调用内核方法,消耗外部损失)

补充知识点:

静态成员函数的对象仍然在堆中,句柄在静态信息常量池中

类Person一开始是在硬盘存的,经过jdk变成class文件,调用时再经过jre加入内存

在堆中new一个对象,对象具有对象头(可以找到所属类),对象的成员方法,变量信息。(没有静态信息)

静态信息加载到静态信息常量池

方法只有栈顶的方法在执行

下文是我演示的代码,我将对其进行详细讲解 

package multi_threaded;public class Test {//public static void main(String[] mmm) {Person x1 = new Person();Person x2 = new Person();m1(x1,x2);System.out.println("x2.age=" +x2.age);}public static void m1(Person w, Person e) {Person m = w;w = e;e = m;///m2(w);System.out.println("w.age=" +w.age);}public static void m2(Person k) {k.age = 99;}
}
package multi_threaded;public class Person {public int age;public String name;public static int flag;public void m1() {}public void m2() {}public static void m3() {}
}

编写代码

1.在编写代码的时候是写在硬盘上的,只有被调用后才会进入内存

 当开始加载main方法时入栈

加载Person类和Test类到类信息区,即左上角的部分。

它的静态成员函数和静态方法实体都是在静态信息常量池中。类信息常量池仅仅是存静态成员的地址。

mmm进栈,Test.main栈区先入栈的是mmm,即main函数的参数。

Person对象x1进栈, 在栈区存储的是对象地址,对象开在堆里面。

里面的对象

具有对象头信息(是指得可以找到对象模板的地址,因此可以通过对象.getClass()获取类信息)

具有成员变量:存的是字符串常量地址或数字

具有成员函数 (拷贝)

-----注意,堆里的对象没有静态信息

 x2进栈,操作与x1一,唯一不同的是不用把person再次加载了,只加载一次,静态信息也不用处理

调用m1方法:

调用方法后,方法压栈,

注意:方法并不是含在mian里面的,是压在它头上

 形参person w和e

这个m1(x1,x2)传递的是值传递,所以传过来的是地址

明确:值传递并不是只有数字是值,只要是信息都是值

开始交换操作

m=w

w=e

e=m

 调用m2方法:

形参k指向w,修改年龄为99

 之后递归回去,执行完的出栈,比较简单,此处省略200字。。。

最后运行结果:

w.age=99

x2.age=99

与图中信息一致。讲解完毕,下课! 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB六轴机械臂机器人的动力学分析

1、概述 动力学以牛顿第二定律为核心,这个定律指出了力、加速度、质量三者间的关系。 质点动力学有两类基本问题: 一是已知作用于质点上的力,求质点的运动,这个就是正动力学。 二是已知质点的运动,求作用于质点上的力…

微服务实战系列之MQ

前言 从今天起,席卷北国的雪,持续了一整天,北京也不例外。这场意外的寒潮,把整个冬天渲染的格外cool。当然你可以在外面打雪仗、堆雪人、拉雪橇,也可以静坐屋内,来一场围炉煮茶的party。此刻,冬…

小白学爬虫:根据商品ID或商品链接获取天猫商品详情数据接口方法

小白学爬虫的方式可以按照以下步骤进行: 学习Python基础知识:首先需要掌握Python编程语言的基本语法和数据类型,了解Python的常用库和模块,例如requests库等。学习爬虫的基本概念:了解什么是爬虫、为什么需要爬虫、爬…

2023年【烟花爆竹储存】考试题及烟花爆竹储存报名考试

题库来源:安全生产模拟考试一点通公众号小程序 2023年烟花爆竹储存考试题为正在备考烟花爆竹储存操作证的学员准备的理论考试专题,每个月更新的烟花爆竹储存报名考试祝您顺利通过烟花爆竹储存考试。 1、【单选题】1.3级烟花爆竹成品装卸应在仓库安全出口…

小小手表探索更多 好玩伴也是好帮手

华为儿童手表 5X 不仅是孩子的好玩伴,也是家长的好帮手。全能形态让小小手表探索更多,高清双摄记录美好,离线定位随时掌握,绿色纯净守护成长,让孩子享受科技带来的安全与乐趣。

亚马逊鲲鹏系统可快速创建大量的买家账户

在数字时代的浪潮中,人们总是在寻找更便捷、高效的方式来完成各种任务,而亚马逊鲲鹏系统的出现,无疑为那些渴望拥有大批量买家号的人提供了一个全新的可能性。在这个系统中,注册买家号变得轻而易举,只需准备好一些必要…

智能养号新玩法:探秘亚马逊鲲鹏系统的AI一键养号

在亚马逊这个庞大的电商平台上,刚注册的买家号往往需要经过一段时间的“磨合”才能正式进行下单。为了提高账号的活跃度,亚马逊鲲鹏系统推出了一款颠覆性的AI智能一键养号工具,让养号变得更加轻松便捷。 对于刚注册的买家号而言,直…

ArkTS 任务统计页面

我们继续学习使用ArkTS实现一个任务进度的统计功能。 1.公共的组件、样式 class Task{static id: number 1// 任务名称name: string 任务${Task.id}// 任务状态: 是否完成finished: boolean false }// 统计的卡片样式 Styles function card(){.width(95%).padding(20).backg…

物联网终端设备众多,为何遥测终端机备受瞩目?

遥测终端机是一种用于数据采集、远程传输、数据存储与处理的综合体设备,已逐渐成为现代智能物联领域的焦点。遥测终端机集成了多种传感器与通信模块,能够实时采集各种环境参数,如温度、湿度、压力、流量等,同时支持无线通信&#…

基于径向模糊的体积光在Cesium中的应用

概述 当空间中包含足够稠密的光散射介质(例如气体分子和气溶胶)时,光源透过遮挡物的缝隙投射的光线打在空气中的尘埃上,产生散射进入到人眼中,这些光线看起来像是一道一道的光柱,被称为体积光。 在图形渲…

美易官方:道指续创收盘历史新高

美国股市周三继续上涨,道琼斯工业平均指数连续六个交易日收高,并再次创下收盘历史新高。尽管市场对全球经济增长放缓的担忧依然存在,但美国经济数据的强劲表现以及企业盈利的良好预期,使得投资者对股市的信心得到提振。 在今日的交…

【seata】 seata整合nacos + springcloud alibaba 真保姆级教程 解决各种坑点

前言: 坑点太多了,以至于需要单独写篇博客记录一下。 网上教程五花八门且不声明版本,文档不对应以及seata本身的bug,就造成了部署时各种踩坑,如果你和博主一样,已经又恰好很久没碰过nacos了,那可…