JVM 堆栈区域数据存放流程

在Java程序运行过程中,JVM定义了各种区域用于存储运行时数据。其中的有些数据区域在JVM启动时创建,并只在JVM退出时销毁。其它的数据区域与每个线程相关。这些数据区域,在线程创建时创建,在线程退出时销毁。

JVM 由3部分组成:

栈区

---------------------------------

基础数据类型 byte short int long float double char boolean
方法的形式参数,方法调用完后从栈空间回收
引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC
栈内的数据线程之间独立
具体划分为:基本类型变量区、执行环境上下文、操作指令区

堆区
---------------------------------

this
new 出来的对象
数组
jvm只有一个堆区,并被所有线程共享

方法区(又叫静态区和永久区)

---------------------------------

字符串常量
static
所有class
被所有线程共享, 其内存放程序中永远唯一的元素

案例分析:

public class AppMain {// 运行时 jvm把类信息加入方法区

	/**
	 * @param args
	 */
	public static void main(String[] args) {// main方法放入方法区

		Sample test1 = new Sample("hello"); // test1是引用 放入栈中 new Sample("hello")对象放入堆中
		test1.printName();

	}

}

class Sample { // 运行时 jvm把 类信息放入方法区

	private String name; // new Sample()后, name 引用放入栈  name对象放入堆

	public Sample(String name){
		this.name = name;
	}

	public void printName(){ // 方法本身放入方法区
		System.out.println(name);
	}
}

执行分析说明:

Sample test1 = new Sample("hello");
test1.printName();
0 知识前导:
jvm每个线程都拥有一个方法调用栈,用于跟踪线程中运行的一系列方法调用过程,
  栈中的每个元素成为栈帧,线程调用每个方法时会将方法栈压入一个新帧,
  帧里面存放方法参数,局部变量,运算过程产生的临时数据

1 jvm去方法区寻Sample类信息
2 寻找不到,jvm使用classloader加载Sample类信息进入内存方法区
3 在堆内存中创建Sample对象,并持有方法区中Sample类的类型信息的引用
4 test1添加到执行main()方法的主线程java调用栈中,指向堆空间中的内存对象
5 执行test1.printName()时,jvm根据test1定位到堆空间的Sample实例,在根据
Sample实例在方法区持有的引用,定位到方法区Sample类型信息,获得printName()
字节码,执行此方法执行,打印出结果。

下面再补充几个图,进一步了解:

时间: 2024-07-28 13:32:09

JVM 堆栈区域数据存放流程的相关文章

用SSM框架注册用户并把用户数据存放到数据库的流程

问题描述 用SSM框架注册用户并把用户数据存放到数据库的流程 用SSM框架注册用户并把用户数据存放到数据库的流程 ,不是特别了解层与层之间的关系 , 求大神讲解. 解决方案 http://download.csdn.net/download/u011503113/6256373

《DNS与BIND(第5版)》——7.2 更新区域数据文件

7.2 更新区域数据文件 网络总是在不断变化的--新的工作站加入,老的被淘汰或卖掉,或者将主机移至另一个网络.每次改变都意味着区域数据文件必须跟着修改.应该手动修改这些文件还是应该使用工具协助修改呢? 本节将首先讨论如何手动修改区域数据文件.然后再介绍一个协助修改的工具:h2n.事实上,本书推荐使用工具来创建区域数据文件:或者至少使用工具来增加序号.区域数据文件的语法很容易导致错误.因为它无法保证存放在不同文件中的地址和指针记录,能够保持彼此之间的一致性.不过,就算是使用工具,也还是必须知道更新

存储-用C#进行堆栈储存数据

问题描述 用C#进行堆栈储存数据 对于一下txt数据,要将上面的数据分块,进行储存,对于下面数据L与S之后的数据分别存储,怎么用StreamWriter存储ID147312303.586499860.308ID148311970.966499740.297ID164303521.015497684.195ID165303069.052497407.154ID180295818.444495133.562GPS22295447.814494949.879ID148ID147L0ID149L185.

Excel中去除选定区域数据的技巧

  Excel的使用确实很简单,但是在简单中我们也要讲究效率.比如:要在Excel中去除选定区域数据,这其实是有多种多样的方法的,我们逐一来看一下,看到底在操作过程中使用哪种方法比较好. 一.最简单的方法就是直接用鼠标将需要删除的单元格区域框选起来,选中之后直接按住键盘中的"Delete"即可删除该区域的数据. 二.通过excel选定区域快速删除.具体操作如下: 1.首先打开你需要修改的excel文件,打开之后,长按鼠标"左键",并拖动,选定一个区域后释放.如图所示

《Cacti实战》——3.3 数据可视化流程

3.3 数据可视化流程 数据可视化是最终呈现监控结果的重要一环,Cacti的最终任务就是将数据进行可视化展现.当系统完成数据的检索与存储之后,Cacti通常会使用RRDTool内置的绘图工具来绘制图表. 进入Cacti的"图形管理"界面,可以使用调试模式查看绘制图形的执行命令,如图3-5所示. 这段语句的主要作用见配置脚本3-1中的注释. 配置脚本3-1 SNMP查询的XML脚本头信息 c:/rrdtool/rrdtool.exe graph - \ #使用rrdtool命令绘图 --

大数据全流程平台在互联网金融的实现

本文讲的是大数据全流程平台在互联网金融的实现, 如果有这么一家公司,它把数据视为它的生命线,那么它对数据系统一定有非常非常多的需求,它可能会要求它们的数据系统足够灵活,可以非常方便的加减数据源,它可能需要实时查询裸数据,也有可能对这个数据进行各种各样的计算,它还有可能去提高每次访问的实时性,同时也有可能提高批量离线分析时的性能以及水平扩展能力,如果你是一个架构师,你会怎样设计这套系统呢? 大家下午好,我是来自宜信的侯松,我今天分享的主题是<大数据全流程平台在互联网金融场景下的实现和借鉴意义>,

大规模数据存储集群数据存放的设计,分布式shardid的生成 - 如何指定范围随机数, 分组随机数

标签 PostgreSQL , 分组ID生成 , 生成哈希映射 , sharding , shard 背景 在一些分布式数据库系统中,通常会有多个数据节点,用户的数据分布策略通常有一致性哈希.按列哈希.随机分布等. 除了随机分布,其他的分布方法数据和数据节点是一对一的关系. 上当节点数变得特别特别多的时候,数据如果依旧按照全局进行哈希分布,可能会带来一个问题,例如节点数到达1万个,一张1亿的表,会分布到1万个节点中,那么多个表进行JOIN时,会涉及到1万个节点的运算,这里面可能还涉及节点和节点之

C#怎么将大量的数据存放进MSSQL数据库中

问题描述 C#怎么将大量的数据存放进MSSQL数据库中 大概有200万条数据等待存放进MSSQL数据库中 之前从数据库中使用dataset和dataadpter获取6万条数据 然后一番处理产生了200万条数据 这些数据存放在一个数组中 200条*3个字段 的数组中 现在就需要将这个数组中的数据存放进数据库中 等待大神降临 解决方案 BULK INSERThttp://rsljdkt.iteye.com/blog/1147707http://database.51cto.com/art/20110

《DNS与BIND(第5版)》——4.2 建立区域数据

4.2 建立区域数据 建立电影大学名称服务器的第一步,是将主机表转换成等效的DNS区域数据.该数据的DNS版本有多个文件.一个文件将所有主机名映射成地址.其他文件将地址映射回主机名.名称到地址(name-to-address)的查询有时被称作正向解析(forward mapping),而地址到名称(address-to-name)的查询则被称作逆向解析(reverse mapping).每个网络都拥有自己的逆向解析数据文件. 作为本书的一个约定,将主机名映射到地址的文件称作db.DOMAIN.例