- 浏览: 103171 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
qiushuzhao:
';lll
spring data redis源码框架分析 -
qiushuzhao:
[color=yellow][/color]lll
spring data redis源码框架分析 -
jiuyuehe:
博主你好,用了你方法以后果然没有阻塞了,但是原理还是不太明白, ...
[转载]Java Process.exitValue & Process.waitFor()
概念:
JAVA的JVM的内存可分为5个区:堆(heap)、栈(stack)和方法区(method)、pc Registers、native method stacks
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.
jvm只有一个堆区(heap)被所有线程共享,
堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.
每个线程包含一个栈区,
栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,
被所有的线程共享。
方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
PC registers:
1. 每个线程拥有自己的程序计数器, 它指向下一条指令. 当线程调用本地方法的时候, 它为undefined
native method stacks
1. 调用其它语言时创建的栈,由于非java语言,因此其执行栈与java不同,不受jvm控制,但内存申请在JVM中进行
Example:
Main.java
public class Main //运行时, jvm 把Main的信息都放入方法区 { public static void main(String[] args) //main 方法本身放入方法区。 { Sample test1 = new Sample(" 测试1 "); //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面 Sample test2 = new Sample(" 测试2 "); test1.printName(); test2.printName(); } }
Sample.java
public class Sample //运行时, jvm 把Main的信息都放入方法区 { private name; //new Sample实例后, name 引用放入栈区里, name 对象放入堆里 public Sample(String name) { this.name = name; } public void printName() //print方法本身放入 方法区里。 { System.out.println(name); } }
OK,让我们开始行动吧,出发指令就是:“java Main”,包包里带好我们的行动向导图,Let’s GO!
系统收到了我们发出的指令,启动了一个Java虚拟机进程,这个进程首先从classpath中找到Main.class文件,读取这个文件中的二进制数据,然后把Main类的类信息存放到运行时数据区的方法区中。这一过程称为Main类的加载过程。
接着,Java虚拟机定位到方法区中Main类的main()方法的字节码,开始执行它的指令。这个main()方法的第一条语句就是:
Sample test1=new Sample("测试1");
语句很简单啦,就是让java虚拟机创建一个Sample实例,并且呢,使引用变量test1引用这个实例。
1、
Java虚拟机一看,不就是建立一个Sample实例吗,简单,于是就直奔方法区而去,先去到Sample类的类型信息再说。结果没找到,
这会儿的方法区里还没有Sample类呢。JVM通过classloader立马加载了Sample类,
把Sample类的类型信息存放在方法区里。
2、 Java虚拟机做的第一件事情就是在堆区中为一个新的Sample实例分配内存,
这个Sample实例持有着指向方法区的Sample类的类型信息的引用。这里所说的引用,实际上指的是Sample类的类型信息在方法区中的内存地址,
其实,就是有点类似于C语言里的指针啦~~,而这个地址呢,就存放了在Sample实例的数据区里。
3、
在JAVA虚拟机进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被称为栈帧,每当线程调用一个方
法的时候就会向方法栈压入一个新帧。这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据。OK,原理讲完了,就让我们来继续我们的跟踪行动!位
于“=”前的Test1是一个在main()方法中定义的变量,可见,它是一个局部变量,因此,它被会添加到了执行main()方法的主线程的JAVA方
法调用栈中。而“=”将把这个test1变量指向堆区中的Sample实例,也就是说,它持有指向Sample实例的引用。
接下来,JAVA虚拟机将继续执行后续指令,在堆区里继续创建另一个Sample实例,然后依次执行它们的printName()方法。当JAVA虚拟机
执行test1.printName()方法时,JAVA虚拟机根据局部变量test1持有的引用,定位到堆区中的Sample实例,再根据Sample
实例持有的引用,定位到方法去中Sample类的类型信息,从而获得printName()方法的字节码,接着执行printName()方法包含的指
令。
发表评论
-
spring data redis源码框架分析
2012-02-06 21:49 7889redis是由Salvatore Sanfilippo用C语言 ... -
Java Enum
2011-10-08 20:31 1030public enum Operation { ... -
Java内部类访问
2011-10-08 17:37 901当内部类为非静态时: public class In ... -
JVM Method Table
2011-10-07 16:10 1235方法表 为了提高访问效率,必须仔细的设计存储在方法区中的 ... -
JVM Symbolic refer 2 Direct Refer
2011-10-06 17:31 2Method Area: Symbolic Referen ... -
【转载】JVM中方法区
2011-09-29 14:17 1087原文链接:http://hi.baidu. ... -
java ClassLoader
2011-09-28 17:02 545JVM规范定义了两种类型的类装载器:启动内装载器 (bo ... -
【转载】java 回调函数
2011-09-18 16:01 1042java“回调函数” 所谓 ... -
[转载]Java Process.exitValue & Process.waitFor()
2011-09-17 13:14 15300Process.exitValue() 采用非阻塞的方式返回, ... -
Java读取classpath中的文件
2011-08-29 11:06 7726/** * 类AppsImport.java的实现描 ... -
【转载】jvm的内存调优
2011-08-23 17:30 1366原文链接:http://k ... -
【转载】Java 垃圾回收策略调优,实践篇
2011-08-23 17:13 889转载自:http://www.douban.c ... -
[转载]线程sleep()和wait()的区别
2011-07-01 15:07 844线程sleep()和wait()的区别 ... -
checked Exception and RuntimeException
2011-05-29 15:25 9201. RuntimeException 虚拟机执行程序时,如果 ... -
【转载】编程式事务 声明式事务区别
2011-05-09 19:08 979原文链接:http://topic.csdn.net/u/20 ... -
[转载]java回调函数
2011-04-28 16:55 902转载自:http://www.blogjava.net/ ... -
【转载】jms topic与jms queue区别
2011-02-18 17:29 10913作者longdick http://longdick.i ... -
【转载】JAVA NIO 简介
2011-02-18 11:30 892原文链接:http://www.iteye.com/topic ... -
RTTI & Reflection(反射机制)
2011-01-16 15:45 2270RTTI & Reflection 一、RTTI(R ... -
Java编程思想中异常的限制
2011-01-08 20:55 10501. 构造函数必须抛出基类构造函数的抛出的异常; 这 ...
相关推荐
JVM初探- 内存分配、GC原理与垃圾收集器,从从提上讲解了jvm中GC的原理、基本的算法和针对不同内存区使用的算法,同时,详细的讲解了当前主要使用的垃圾收集器
JVM初探内存分配GC原理与垃圾收集器共16页.pdf.zip
NULL 博文链接:https://caerun.iteye.com/blog/1162634
jvm源码
jvm 配置jvm参数 配置jvm参数
jvm源码,jvm-native的源码,jvm支行机制,可对jvm的运行过程进行分析 个人网站:https://www.zhangjunbk.com
JVM图解-JVM指令-JVM原型图.rar
深入解析jvm深入解析jvm深入解析jvm深入解析jvm深入解析jvm深入解析jvm
46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT...
主要是JVM内存分配及简单的JVM性能调优
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...
学习关于JVM基础,java内模型的全面透析,Jar hell问题以及解决办法,Class文件格式 • Java编译执行流程 • ClassFile的格式介绍 • ClassFile中FieldInfo和MethodInfo介绍 • 类型描述Descriptor介绍 • ClassFile...
JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...
jvm
首先讲述JVM的基本概念和原理、架构等。最后一HelloApp讲述JVM的工作过程
jvm 详细介绍,了解jvm各个组成部分和功能
JVM配置资料JVM配置资料JVM配置资料JVM配置资料
Introduction to JVM Languages English | 2017 | ISBN-10: 178712794X | 390 pages | PDF/MOBI/EPUB (conv) | 6.42 Mb Key Features This guide provides in-depth coverage of the Java Virtual Machine and its ...
Jvm入门,Jvm入门,Jvm入门,Jvm入门,Jvm入门,Jvm入门
讲JVM工作原理、垃圾回收讲的非常好的一个ppt