前言
在学习java之前,要先了解java文件是如何运转的,就得了解一下JVM和java的内存结构。本文先介绍简单的java内存结构图,再总结一下程序运行时保存到什么地方。
简单的java内存结构图
1.方法区:用来存储代码。将.class文件加载到内存中,并存储在方法区
2.栈:用来存储局部变量,形参,方法的返回值,中间运算结果
3.堆:成员变量,数组对象,方法的引用
4.本地方法区:存储链接本地方法相关的代码
5.执行过程:
执行了java命令之后,classloader将.class文件,加载到内存中并存储在方法区。
然后JVM调用main方法,顺次执行代码。
将局部变量存储在栈区中,将引用变量是指向内容存储在堆区中。
引用变量所指向的空间,用来存储hashcode码,顺次执行到mian方法完毕。
再通过classLoader将.class文件内容在JVM所占用的空间全部卸载。
程序运行时保存到什么地方
内存的分配。有六个地方都可以保存数据:
(1) 寄存器。这是最快的保存区域,因为它位于处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。
(2) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。
(3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
(4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
(6) 非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。Java 1.1提供了对Lightweight
persistence的支持。未来的版本甚至可能提供更完整的方案。
总结
JVM栈由一个个的栈帧组成, 每个栈帧都是一个方法的调用状态. 每个栈帧主要由三部分组成: 局部变量表(又叫本地变量表), 操作数栈和其他一些信息. 主要是局部变量表和操作数栈.
分享到:
相关推荐
Java 虚拟机学习笔记: Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...
Java快速复习,笔记,面向对象入门,为什么用户java,JDK,JVM,JIT,JRE,jvm运行结构图,数组,封装,方法,构造,重载,static,继承,重写,final,抽象内,接口,lambda表达式,异常,ocp原则,内的生命周期,静态标准内存图
JAVA--达内培训笔记】 1、Java之父Golsling 1995年5月23日 Java诞生 1998年12月 1.2版本 Java2 J2SE J2EE J2ME 2004年12月 1.5版本(5.0) Java JavaSE JavaEE JavaME 2、Java SE --- Java标准平台 Java EE -...
核心Java笔记(达内培训)高清晰(自己制作)带目录。 1) 简单(Java语法是C++语法的一个“纯净”版本); 2) 可移植性 (一次编译到处运行) 3) 面向对象 4) 分布式(Java把打开套接字连接等繁琐的网络任务变得非常...
031503_【第15章:Java反射机制】_反射应用——取得类的结构笔记.pdf 031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java...
Java基础复习笔记05数据结构-栈~~~~~~~~~~
Java面向对象程序设计笔记: 目录----非原创,上课的时候老师给的资料哦 第一章 Java 前凑 3 1. Java前凑 3 Java产生的目的 3 Java的诞生的历史 3 2.Java语言的特点 3 简单性 3 面向对象 3 网络技能 3 3....
JVM内存结构笔记 55M大文件,全面细致的涵盖所有JVM内存管理知识点,学习JVM,收藏只此一份文档即可
此文对于java初学者,想了解清楚java内存结构的童鞋,很有参考价值
Java是一种广泛使用的面向对象的编程语言,由Sun ...综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的角色,是现代软件开发不可或缺的重要工具之一。
Java 到底有哪些优势? 1.跨平台(平台=OS) 可移植性 在不同的操作系统之上可以...gc 内存回收清理 Java 中的回收机制: 零引用回收 问题: System.gc(); Runtime.getRuntime().gc(); 调用gc 的下一行是否回收?不一定
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...
Java虚拟机(Java Virtual Machine,简称JVM),Java的“一处编译,处处运行”,就是因为Java程序编译成字节码文件后可以在任何计算机的JVM上执行,所以JVM是我们学习Java的重点之一。 JVM = 类加载器(classloader) + ...
算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、...
算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、...
java基础1.1 输入输出用户交互Scanner用户交互Scanner进阶1.2 基本数据类型基本数据类型类型转换变量,常量,作用域运算符补充:包机制补充:JavaDoc1.3 顺序结构1.4 循环结构while循环do-while循环for循环增强型for...