JAVA虚拟机内部体系结构之内存分析

Autowired的使用介绍 我们都知道在spring中@Autowired注解,是用来自动装配对象的。@Service@Autowired没错,这样是能够装配成功的,因为默认情况下spring是按照类型装配的,也就是我们所说的byType方式。此外,@Autowired注解的required。 阅读详情
 

JAVA虚拟机内部体系结构:

方法区:

1.  将被装载类型的信息放到方法区

2.  方法区中包含了在整个程序中永远唯一的元素(类的代码信息、常量、静态变量、字符串常量)

3.  被所有线程共享

 

堆:

1.  存储的全部都是对象(即new出来的东东)

2.  JVM只有一个堆区,被所有线程共享

3.  堆是不连续的内存空间,是由new分配的,获得比较灵活,但是速度慢。

 

栈:

1.  每个线程一个栈,栈中的数据是私有的,其他栈不能访问

2.  局部变量在栈中存放

3.  栈是一块连续的内存空间,由系统自动分配,速度快。

 

 

在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

 

 

 

 

 

 

 

程序运行过程内存分析:

public class TestMemory{

   

    public static void main(String[] args){

       int i = 3;

       Man man = new Man();

       man.name="gao";

       man.age=18;

      

       String str = "nihao";

       String str2 = "nihao";

       String str3 = new String("hi");

       String str4 = new String("hi");

    }

}

 

class Man{

    String name;

    int age;  

}

 

 

 

字符串在内存中的表示形式:

String类对象称作不可变的字符串,这样的话编译器可以安排共享的字符串,同时也意味着String类中不提供这样的方法,它可以改变已存在的字符串中的单个字符。

 

Java中的字符串分配又有点特殊,如果直接声明称这样:String s1 = “hello”,则”hello”字符串是在内存中方法区的字符串池中分配,如果再次有需要用到”hello”,就直接在字符串池中查看有没有存在此字符 串,如果有则直接用,没有则创建。如果声明成String s3 = new String(”hello”),则”hello”是在堆内存中分配。

 

 

 

 

 

 

测试代码:

public   class  AppMain{      

// 运行时, jvm 把appmain的信息都放入方法区

    public   static   void  main(String[] args){  // main 方法本身放入方法区。

       Sample test1 = new  Sample( " 测试1 " );   // test1是引用,所以放到栈区里,

       Sample test2 = new  Sample( " 测试2 " );// Sample是自定义对象应该放到堆里面

       test1.printName();

       test2.printName();

 

    }

}

public class Sample { // 运行时, jvm 把appmain的信息都放入方法区

    /** 范例名称 */

    private String name; // new Sample实例后, name 引用放入栈区里, name 对象放入堆里

    /** 构造方法 */

    public Sample(String name) {

       this.name = name;

    }

    /** 输出 */

    public void printName() { // print方法本身放入 方法区里。

       System.out.println(name);

    }

}

OK,让我们开始行动吧,出发指令就是:“java AppMain”,包包里带好我们的行动向导图,Let’s GO!



系统收到了我们发出的指令,启动了一个Java虚拟机进程,这个进程首先从classpath中找到AppMain.class文件,读取这个文件中的二进制数据,然后把Appmain类的类信息存放到运行时数据区的方法区中。这一过程称为AppMain类的加载过程。
接着,Java虚拟机定位到方法区中AppMain类的Main()方法的字节码,开始执行它的指令。这个main()方法的第一条语句就是:
Sample test1=new Sample("测试1");
语句很简单啦,就是让java虚拟机创建一个Sample实例,并且呢,使引用变量test1引用这个实例。貌似小case一桩哦,就让我们来跟踪一下Java虚拟机,看看它究竟是怎么来执行这个任务的:

1、 Java虚拟机一看,不就是建立一个Sample实例吗,简单,于是就直奔方法区而去,先找到Sample类的类型信息再说。结果呢,嘿嘿,没找到@@,这会儿的方法区里还没有Sample类呢。可Java虚拟机也不是一根筋的笨蛋,于是,它发扬“自己动手,丰衣足食”的作风,立马加载了Sample类,把Sample类的类型信息存放在方法区里。

2、 好啦,资料找到了,下面就开始干活啦。Java虚拟机做的第一件事情就是在堆区中为一个新的Sample实例分配内存, 这个Sample实例持有着指向方法区的Sample类的类型信息的引用。这里所说的引用,实际上指的是Sample类的类型信息在方法区中的内存地址,其实,就是有点类似于C语言里的指针啦~~,而这个地址呢,就存放了在Sample实例的数据区里。

3、 在JAVA虚拟机进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被称为栈帧,每当线程调用一个方法的时候就会向方法栈压入一个新帧。这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据。OK,原理讲完了,就让我们来继续我们的跟踪行动!位于“=”前的Test1是一个在main()方法中定义的变量,可见,它是一个局部变量,因此,它被会添加到了执行main()方法的主线程的JAVA方法调用栈中。而“=”将把这个test1变量指向堆区中的Sample实例,也就是说,它持有指向Sample实例的引用。

OK,到这里为止呢,JAVA虚拟机就完成了这个简单语句的执行任务。参考我们的行动向导图,我们终于初步摸清了JAVA虚拟机的一点点底细了,COOL!

接下来,JAVA虚拟机将继续执行后续指令,在堆区里继续创建另一个Sample实例,然后依次执行它们的printName()方法。当JAVA虚拟机执行test1.printName()方法时,JAVA虚拟机根据局部变量test1持有的引用,定位到堆区中的Sample实例,再根据Sample实例持有的引用,定位到方法去中Sample类的类型信息,从而获得printName()方法的字节码,接着执行printName()方法包含的指令。

 

 

【实用工具】QQ自动发消息 程序下载:蓝奏云 源代码: #include<Windows.h> #include<bits/stdc++.h> #include<conio.h> using namespace std; void HideWindow() { HWND hwnd; hwnd=FindWindow("ConsoleWindowClass",NULL); if(hwnd) ShowWindow(hwnd,SW_HIDE); return; } int main() { pri 阅读详情

相关推荐

工业级RFID读写器|识读器CK-LR08-E00通过以太网TCPIP自由协议与汇川PLC控制器联机与通讯实例方案

本文以工业级RFID读写器CK-LR08-E00和汇川PLC控制器H5U是实例介绍工业级RFID读写器CK-LR08-E00通过以太网TCPIP自由协议与汇川PLC控制器联机与通讯方案。

华翔天诚科技 4372

Java虚拟机JVM内部体系结构

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 Java虚拟机JVM内部体系结构 易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。 JVM(Java虚拟机)是一个抽象机器。 它是一个提供可以执行Java字节码的运行时环境的规范。JVM可用于许多硬件和软件...

JKX_geek的博客 356

最优化方法 25:PDHG

前面的章节要么从原始问题出发,要么从对偶问题出发,通过求解近似点或者一个子优化问题进行迭代,而且推导过程中我们发现根据问题的参数特征,比如矩阵 AAA 是瘦高型的还是矮胖型的,采用对偶和原始问题的复杂度会不一样,可以选择一个更简单的。而这一节,我们将要从原始对偶问题出发来优化,什么是原始对偶问题呢?就是原始优化变量和对偶优化变量(原始函数和共轭函数)混合在一块,看下面的原理就知道了。 1. 原始对偶问题 现在考虑原始优化问题,其中 f,gf,gf,g 为闭凸函数 min⁡f(x)+g(Ax) \min \q

Glooow的博客 4602

【Java 虚拟机原理】JDK 体系结构 | Java 源码运行原理 | Java 虚拟机内存

一、JDK 体系结构、 二、Java 源码运行原理、 三、Java 虚拟机内存结构、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1574

TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

文章目录TCP介绍三次握手四次挥手滑动窗口拥塞避免算法 TCP介绍 三次握手 四次挥手

热爱编程的菜鸟 1万+

cesium加载天地图、OSM、谷歌底图

以上示例是加载矢量底图,若要加载影像或者其他只需要更换相应的url,在WebMapTileServiceImageryProvider中还要更改layer参数。url中’‘vec_w’,一些其他风格,基于CRAT渲染,两种方法效果差别不大。有两种方法加载天地图分别是。对应投影样式,具体可看。还要谷歌的一些卫星底图。

qq_44897914的博客 3001

java虚拟机的内部结构_Java虚拟机的内部体系结构

1.Java程序执行流程Java程序的执行依赖于编译环境和运行环境。源码代码转变成可执行的机器代码,由下面的流程完成:Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行。Java程序的运行需要Java虚拟机、Java API和Java Class文件的配合。Java虚拟机实例负责运行一个Java程序。当启动一个Java程序时,一个虚拟机实例就诞生了。当程序结束,这个虚拟机...

weixin_30752995的博客 262

从稀疏表示到低秩表示(一)

确定研究方向后一直在狂补理论,最近看了一些文章,有了些想法,顺便也总结了representation系列的文章,由于我刚接触,可能会有些不足,愿大家共同指正。 从稀疏表示到低秩表示系列文章包括如下内容: 一、 sparse representation 二、 一、 sparse representation 1  sparsity  一个线性表示解决的问题如下图所示:

彼岸花 3万+

Java虚拟机的体系结构

Java虚拟机的体系结构 1.Java虚拟机浅陋的见解 Java虚拟机是一个抽象的规范概念,设计者只是用一些规范来定义这些抽象的组成部分以及他们之间的交互。在创建运行一个Java程序的时候,也就创建了一个java虚拟机实例,也就是在内存中分配一个空间供给这个Java程序使用。把虚拟机分为不同的部分也是为了程序员更加清楚的了...

hutaozz的博客 398

Jetson AGX Orin 部署 JetPack:从依赖缺失到系统升级的完整排障指南

本文详细介绍了在Jetson AGX Orin开发板上部署JetPack SDK的完整排障指南,包括解决依赖缺失、系统升级和常见错误处理。通过确认硬件版本、配置正确的软件源、执行系统升级和安装核心组件等步骤,帮助开发者顺利完成JetPack的安装与配置,确保AI开发环境的稳定运行。

weixin_29172963的博客 160

乐企增值税及附加税费(一般纳税人适用)申报表填报能力说明文档V3.009

申报表填报,是指企业在自有业务系统中将算税结果数据按预填规则要求加工汇总后,进行申报表填报的过程。申报表填报前对纳税申报所需的前提条件进行校验。校验通过后,应用前序算税结果数据及预填规则进行纳税申报表预填,生成申报表数据。申报表数据通过申报业务规则校验后,经纳税人确认即完成申报表填报业务。

记录点滴 346

java虚拟机体系结构分析

1.Java虚拟机的生命周期当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。Java虚拟机实例通过调用任意某个初始类的main()方法来运行一个Java程序。只要还有任何非守护线程在运行,那么这个Java程序也在继续运行(虚拟机仍然存活)。2.Java虚拟机的体系结构  每个Java虚拟机实例都有一个方法区以及一个堆,他们是

czsd82的专栏 2298

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java虚拟机JVM的内部体系结构

JVM(Java虚拟机)是一个抽象机器。 它是一个提供可以执行Java字节码的运行时环境的规范。JVM可用于许多硬件和软件平台(即JVM是平台相关的)。 什么是JVM? JVM(Java虚拟机)是: 指定Java虚拟机的工作的规范。 但实现提供程序是独立的选择算法。 其实现是由Sun和其他公司提供。 它的实现被称为JRE(Java运行时环境)。 运行时实例只要在命令提...

qq_36243386的博客 192

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java虚拟机的内部构成

Java虚拟机会在在执行Java程序的时候会把其内存划分为一些不同的区域,这些区域都有其各自的用途,并且永远其自己的生命周期,下面我们来看看这张图 由上图我们可以看出,虚拟机的内存区域可以按照是否是线程共享的分为两大块,线程共享的区域有方法区和堆,线程私有的分为虚拟机栈,本地方法栈和程序计数器。下面我们来详细看看这些东西里面都存着什么吧。 方法区 方法区和Java堆一样,同属于是线程共享的数据区域。 方法区用来存储一些已经被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码缓存等数据。 其中方法区还有

魔法少女厄加特的博客 6504

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

使用Memory Analyzer tool分析JAVA虚拟机的内存溢出问题

有一次外场反馈了一个失败观察的离线工具的问题,打开了一个含有1W条失败观察离线数据文件,离线工具界面很快假死了,无法操作,同时CMD界面出现OutOfMemoryError的错误。   2.1    为何会内存溢出 JAVA内存空间中的堆区域(用于存放JAVA的对象)发生了内存溢出,有两个原因: Ø  你的应用比较消耗内存空间,需要较大的堆空间,而你设置的内存不够。 Ø  你的程序有隐

1897

JVM体系结构与Java虚拟机内部组成

1. JDK体系结构 JDK=JRE + tools jdk包含了Java运行时环境(类库,jvm虚拟机)以及自带的一些api和工具 2. java 跨平台的特性 一次编写,到处运行 是因为JVM屏蔽了不同操作系统在底层硬件与指令上的区别(因此我们下载JDK时需要区分操作系统及位数来下载) 3. jvm的组成部分 完整的java虚拟机由三部分组成: 1. 类装载子系统 2. 运行时数据区(也叫jvm内存模型) 运行时数据区又划分为:堆,方法区/元空间,栈,程序计数器,本地方法栈 3. 字节码执行引擎

weixin_41300437的博客 295

Java虚拟机体系结构

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752 我们一起学Java! JAV...

chuifuhuo6864的博客 112

文化数智作品工程实现:AI图像增强、绿色算力与权益分发全链路

从传统书画数字化到数智化,核心不再是简单的图片搬运,而是构建一套包含唯一标识、版权元数据与用户归属的完整资产体系。传统工笔水乡画的AI增强区别于通用超分,需要在提升分辨率的同时保护游丝描、墨色与纸本纹理;绿色算力则通过弹性伸缩、模型量化与队列削峰,解决高并发处理下的资源损耗问题。后续的优先购、集换与空投机制,本质上是一个需要幂等设计和权限校验的数字资产账本。本文从采集、预处理、AI增强、资产化到分发,拆解各环节的工程落地方法,为文化数字化系统和图片资产管理平台提供可直接迁移的实践参考。

weixin_34178244的博客 354

Java虚拟机学习 - 体系结构 内存模型

一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” 、“非堆”,  它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。 运行时常量池:是方法区

天行健,君子以自强不息 3万+

小研究 - Java虚拟机内存管理分析

小研究 - Java虚拟机内存管理分析

375

Java虚拟机(六)——内存溢出和内存泄露分析

内存溢出和内存泄露 内存溢出: 内存泄露: 内存溢出场景 内存泄露场景 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。 Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很

BridgeGeorge 2033

理解Java虚拟机体系结构

1 概述 众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么。正是得益于Java虚拟机,它号称的“一次编译,到处运行”才能有所保障。 1.1 Java程序执行流程 Java程序的执行依赖于编译环境和运行环境。源码代码转变成可

bbaiggey_bigdata的博客 1375

JAVA虚拟机体系结构

一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中...

guanshengg的博客 105

java虚拟机内部原理分析

java虚拟机内部原理分析 1 java虚拟机的分类 Sun HotSpot 也是目前大部分开发人员使用的虚拟机。目前被Oracle公司收购,如何知道我们安装的是哪个虚拟机呢,如下所示: kar:~ karl$ java -version java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13...

微信公众号《后端学长》 391
上一篇: JAVA经验部分总结
下一篇: JAVA编码规范
忆凡
博客等级 码龄15年 100粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值