关闭

JVM 堆栈区域数据存放流程

2323人阅读 评论(2) 收藏 举报
分类:


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()
字节码,执行此方法执行,打印出结果。

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





3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

JVM 堆栈区域数据存放流程

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

初识JVM中堆栈的存储

Java语言的一个显著特点就是跨平台型
  • regan1994
  • regan1994
  • 2014-11-09 14:53
  • 857

jvm堆栈方法区数据存放和操作流程

栈:  1 基础数据类型 byte short int long float double char boolean  2 方法的形式参数,方法调用完后从栈空间回收  3 引用对象的地址,引用...
  • liu136313
  • liu136313
  • 2016-04-26 12:50
  • 2044

JVM运行时数据区域及GC

JVM运行时数据区域及GC JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途、创建和销毁的时间。本文以Sun公司HotSpot虚拟机为例进行说明,J...
  • loveslmy
  • loveslmy
  • 2015-07-09 19:41
  • 2325

java JVM的内存区域(运行时数据区域)

JVM的内存形式:   (1)方法区:存放了要加载的类的信息(名称,修饰符等)、类中的静态变量、类中定义为final的变量、类中Field信息、类中的方法信息,当开发人员通过Class对象...
  • tianya3530
  • tianya3530
  • 2016-12-28 18:58
  • 2798

Java之美之JVM 中堆栈的区别

一。------------------------------------------------------------ 堆--用new建立,垃圾自动回收负责回收 1、堆是一个"运行时...
  • wangjia55
  • wangjia55
  • 2013-04-07 23:50
  • 2409

jvm 堆栈方法区数据存放和操作流程

栈:1 基础数据类型 byte short int long float double boolean char 2 方法的形式参数,方法调用完之后从栈空间回收3 引用对象的地址,引用完之后,栈空间地...
  • u014332037
  • u014332037
  • 2016-12-23 10:12
  • 107

jvm 堆栈方法区数据存放和操作流程

http://chengjianxiaoxue.iteye.com/blog/2153147 栈:  1 基础数据类型 byte short int long float d...
  • guolong1983811
  • guolong1983811
  • 2015-12-17 18:26
  • 365

JVM定位占用cpu过高堆栈信息(Linux)

第一步:使用top命令查看进程占用CPU的情况,获取PID top 从图中可以看出cpu占用高达46.5%的进程ID是16243 第二步:使用top -H -p命令获取进程中线程信息(其中H:...
  • keketrtr
  • keketrtr
  • 2017-01-09 15:22
  • 657

【JVM命令系列(2)】堆栈跟踪之Jstack命令

jstack是java虚拟机自带的一种堆栈跟踪工具。 功能 jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照...
  • liyanspace88888888
  • liyanspace88888888
  • 2016-03-10 09:40
  • 7130
    个人资料
    • 访问:4270048次
    • 积分:23878
    • 等级:
    • 排名:第323名
    • 原创:246篇
    • 转载:35篇
    • 译文:8篇
    • 评论:1050条
    博客专栏
    最新评论