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.mzph.cn/news/223604.shtml

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

相关文章

【ThemeStudio】安装报错A Javascript error occurred in the main process

报错内容: 问题原因:系统环境缺少microsoft visual c插件 解决方法: 下载 微软VC 地址

Docker——2. Docker基础

1. 常见命令 不用重复使用docker run命令,这是创建容器命令,启动容器应该是docker start; docker ps 查看进程运行状态; docker rmi 删除镜像、rm 删除容器; docker logs 查看日志、docker exec 执行命令进入容器内部&…

19.(vue3.x+vite)v-if和v-for哪个优先级更高

前端技术社区总目录(订阅之前请先查看该博客) v-if和v-for哪个优先级更高 (1)实践中不应该把v-for和v-if放一起,可以包一层template (2)在vue2中,v-for的优先级是高于v-if (3)在vue3中,v-for的优先级是低于v-if 组件代码 <template><div><!--包一…

[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity

文章目录 一、完整代码二、论文解读2.1 介绍2.2 Self-Attention is Low Rank2.3 模型架构2.4 结果 三、整体总结 论文&#xff1a;Linformer: Self-Attention with Linear Complexity 作者&#xff1a;Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma 时间&#…

iframe异步加载和延迟加载

iframe异步加载和延迟加载是Web开发中常用的两种优化技术&#xff0c;用于提升页面加载性能和用户体验。 iframe异步加载&#xff1a;通常情况下&#xff0c;浏览器会按照HTML文档的顺序加载页面中的元素&#xff0c;而iframe标签内的内容会阻塞主页面的加载。为了解决这个问题…

浏览器输入URL再按下回车会经历哪些过程

目录 前言 一、解析URL 二、解析域名(DNS) 三、TCP三次握手建立连接 1.seq、syn、ack含义 2.三次握手 四、发送http/https请求 五、服务器响应请求 六、浏览器解析渲染页面 七、TCP四次挥手断开连接 总结 前言 看各种面经发现这个问题是一个高频出现的面试问题&#xff0c;但…

每日一题SQL

以下题目来源微信公众号【SQL数据库开发】 1、编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名&#xff08;Rank&#xff09;相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔…

SunTorque——如何校核扭矩法拧紧的装配载荷和工作应力?

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 扭矩法拧紧是一种常用的装配方法&#xff0c;可以保证紧固件的安全性和可靠性。但是&#xff0c;在装配过程中&#xff0c;如果扭矩法拧紧的装配载荷和工作应力不准确&#xff0c;可能会导致紧固件松动、损坏或失效。因…

Python之禅

import this 这是 Python 社区中著名的 "The Zen of Python"&#xff08;Python之禅&#xff09;文档&#xff0c;由 Python 创始人之一的 Tim Peters 撰写。这个文档包含了一系列关于编程和代码设计哲学的原则&#xff0c;以指导 Python 社区的开发者。以下是这些原…

四十五、Redis主从

目录 1、数据同步原理 &#xff08;1&#xff09;全量同步 &#xff08;2&#xff09;增量同步 &#xff08;3&#xff09;优化Redis主从集群 &#xff08;4&#xff09;什么时候执行全量同步 &#xff08;5&#xff09;什么时候执行增量同步 2、流程 1、数据同步原理 &…

代码阅读次数多于编写次数

代码阅读次数多于编写次数 维护者 > 作者 如今这已是程序员的共识&#xff0c;提醒我们初次编写代码不应该为了追求方便而牺牲将来阅读和修改此段代码的人。 “代码的阅读次数多于编写次数”传达的意思是&#xff0c;通过保持代码简单、编写测试和文档等方式来降低维护代…

Salesforce“卷土重来”:对中国CRM市场影响在哪?

于本土CRM而言&#xff0c;Salesforce是一面镜子&#xff0c;也更是催化剂。 长期来看&#xff0c;Salesforce的加入&#xff0c;从某种程度上将会加速中国CRM赛道的合理价值曲线的走向&#xff0c;通过带动外界对于CRM整个赛道的关注和热度&#xff0c;进而加速本土CRM的成长…

在vue项目中,数据已经在页面渲染,但在后续操作时获取不到数据

如下图 产生这个问题的原因 异步问题 如何解决 方法一&#xff1a;可以将其存放在一个setTimeout里面&#xff08;利用一个极小的延迟来获取数据&#xff09;&#xff0c;如下图 效果 方法二&#xff1a;将操作放入axios里面&#xff0c;如下图

心理学效应

条柠檬心理马太效应飞轮效应酸葡萄效应凡勃伦效应登门槛效应糖果效应南风效应野马效应聚光灯效应毛毛虫效应曝光效应

【Matlab】如何使用MATLAB可视化二重积分(附完整MATLAB代码)

可视化二重积分 前言正文完整代码代码实现可视化结果 前言 二重积分是指在二维空间中对函数进行积分。二重积分的公式如下&#xff1a; ∫ a b ∫ c d f ( x , y ) d x d y ∫_a^b ∫_c^d f(x, y) dx dy ∫ab​∫cd​f(x,y)dxdy 其中&#xff0c; a a a 和 b b b 是 x x x…

Docker-consule 服务发现与注册

consul服务更新和服务发现 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&…

7-8 报销

年底&#xff0c;报销都挤在一堆&#xff0c;财务忙得不可开交。每个报销表包括姓名&#xff0c;各项费用的金额。对于每个报销单&#xff0c;这里规定按如下要求处理&#xff1a; 金额高的优先处理&#xff1b;若金额相等时&#xff0c;则姓名字典序小的优先处理&#xff1b;…

java发起http、https请求,并携带cookie、header,post参数放body并可选关闭ssl证书验证,高可用版

公司有个需求是发起https请求对接国家数据接口&#xff0c;需要带header、cookie&#xff0c;并关闭ssl证书验证&#xff0c;搜了很多文章&#xff0c;都说用HttpsURLConnection发起请求&#xff0c;但不知为啥在封装body参数的时候一直报400封装出错&#xff0c;也欢迎指出不足…

Linux出击之网络环境设置

Linux中如果想要设置静态IP&#xff0c;这就需要我们进行自己去设置。 首先想知道是否有网络&#xff0c;我们就可以查看我们的网卡信息呀&#xff0c;ping 外网地址试试。 比如&#xff0c; ping www.baidu.com ip addr show, 这两个命令都可以让我们对网络有一个了解。 …

【AHK】设置esc为退格键但又可以通过ctrl+esc保留原来esc的退出的功能

该需求为68键本人自用常用习惯。通过奖罚esc设置为backspace键&#xff0c;开始的习惯思维是通过send实现&#xff0c;导致一直陷入死循环&#xff0c;最后经过多次尝试得出以下方案。 还可以用于 键位对调的思路&#xff0c;即直接对调esc和backspace 方案1 esc::backspace ^e…