Java Hour 58 Java Virtual Machine
每每谈到Java Virtual Machine, 你必须意识到这个有三种意思:
1 一个抽象的指南
2 一个具体的实现
3 一个运行时的实例
JVM 的生命周期
每个运行时JVM 实例都是为一个特定的应用程序服务的,随着应用程序的消亡而消亡。
起始点是main 方法,这个大家都知道。
public static void main(final String[] args) { ApplicationContext context = ApplicationContextUtils.getApplicationContext(); WeatherBusiness weatherBusiness = context.getBean(WeatherBusiness.class); weatherBusiness.getWeather(); }
随便一个public static void main 方法就是个入口了。
至于要如何启动这个方法,就得看不同的JVM 初始化实现方式。
在一个经典的Sun Java 2 SDK 中,可以用命令行的方式启动:
java ClassName Parametes
在JVM 的世界里,线程有守护线程和非守护线程两种。一般如GC 线程之类的守护线程都是JVM 自己用的。
Main 方法线程是初始线程,不能是守护线程。
也因此,当所有的非守护线程都返回后,JVM 实例将会退出。
JVM 的架构
关于类型加载器,执行引擎以及Native 方法接口,这个在以前的部分已经有阐述。
这里关注的是类型加载器载入在内存中的东东。
部分JVM 中的运行时数据是被应用程序的所有线程所共享的。
每个JVM 都对一个自己的method area 和 heap, JVM 每装载一个class 文件,就将类型信息等二进制信息放入这个method area. 顺便把应用程序实例化的对象扔到heap 里面。
数据类型
Java 语言中的基本类型基本对应了JVM 中的基本类型。JVM 对于boolean 是用int 来实现的。
有一种特殊的类型就是returnAddress 类型,这种类型是用在 finally 里面。
方法区
JVM 中,所有类型相关的信息被存在一个块叫做method area 的逻辑内存中。
一些类中的静态的字段同样也是存在method area中。
所有线程都共享同一块method area.
method area 大小是不固定,同时也是可以被GC 的。
类型信息
1 类型全限定的名称
2 类型直接父类的全限定名称
3 类型是class 还是接口
4 类型的访问级别
。。。。。。
除了这些类型信息意外,JVM 还必须保存以下这些东西:
1 该类型的常量池
2 字段信息
3 方法信息
4 static 变量
5 一个到ClassLoader 的引用
6 一个到Class 的引用
常量池
常量池类型于一个数组。
字段信息
字段名
字段类型
字段访问级别
方法信息
方法名
方法返回类型
方法参数
方法访问级别
当然还有:
方法的字节码,方法栈大小,异常表
类变量
static 而不是常量的类变量的处理方式是不同的。
这个后面有讲述
一个ClassLoader 的指针
这个东东表面是哪个类型加载器加载了这个类型,必须的。
一个Class 类的指针
每加载一个类型,一个java.lang.Class 类的实例就被创建了。
这个class 实例,可以让你能够访问method table 中的元数据。
Note:
一个Java 应用程序对应一个JVM 实例?
Main 方法所在的初始线程可以是守护线程么?
一个JVM 实例有一个自己的method area 和 heap?
JVM 有一种特殊的returnAddress 类型?
类的静态变量存在哪里?
method area 必须是线程安全的?
每加载一种类型,就会创建一个java.lang.Class 的实例。
Java Hour 58 Java Virtual Machine的更多相关文章
- py, pyc, pyw, pyo, pyd Compiled Python File (.pyc) 和Java或.NET相比,Python的Virtual Machine距离真实机器的距离更远
https://my.oschina.net/renwofei423/blog/17404 1. PyCodeObject与Pyc文件 通常认为,Python是一种解释性的语言,但是这种说法 ...
- fail to create java virtual machine..
今天打开zend stdio 的时候 出现的错误 fail to create java virtual machine... 然后找度娘了,,都说改xxxxx, 我打开360 ,把内存清理了一遍 ...
- Failed to create the Java Virtual Machine.问题的解决
运行Eclipse,出现了"Failed to create the Java Virtual Machine."错误: 解决的办法是在Eclipse的解压目录下找到eclipse ...
- eclipse failed to create the java virtual machine 问题图文解析
eclipse failed to create the java virtual machine 问题图文解析 分类: java常用软件异常2010-10-02 23:45 73200人阅读 评论( ...
- How to run a (Tomcat)Java application server on a Azure virtual machine
http://www.windowsazure.com/en-us/documentation/articles/virtual-machines-java-run-tomcat-applicatio ...
- [转载]Eclipse提示No java virtual machine
第一次运行Eclipse,经常会提示下面的问题:... No java virtual machine was found after searching the follwing location ...
- SQL Developer 4.0 启动报错“unable to create an instance of the java virtual machine located at path”
安装了Oracle之后,第一件事情就是想想怎么去连接,进而操作.SQL Developer是官方提供的强大工具,个人看来也是第一选择. 目前官网提供的最新版是4.0.1.14.48,下载下来之后,就跃 ...
- 解决Eclipse启动报错Failed to create the Java Virtual Machine
电脑:2G内存,WIN7 32位. 启动adt-bundle-windows-x86-20140702\eclipse\eclipse.exe时,报错[Failed to create the Jav ...
- myeclipse启动报错 no java virtual machine。。。
如果环境变量里已经配置了JAVA_HOME,但是在启动的时候还会提示下面的信息: A Java Runtime Environment (JRE) or Java Development Kit ...
随机推荐
- Python2.x与Python3.x的区别
这个星期开始学习Python了,因为看的书都是基于Python2.x,而且我安装的是Python3.1,所以书上写的地方好多都不适用于Python3.1,特意在Google上search了一下3.x和 ...
- intel 系列的PC机处理器是大端的还是小端的?
intel 系列的PC机处理器是大端的还是小端的?由于要安装oracle,需要知道是大端机器还是小端的,你好,现在流行的PC,是微型处理器,也就是所谓的小端处理器. 大端处理器是由若干个微型处理器有机 ...
- js数组常用操作方法小结(增加,删除,合并,分割等)
本文实例总结了js数组常用操作方法.分享给大家供大家参考,具体如下: var arr = [1, 2, 3, 4, 5]; //删除并返回数组中第一个元素 var theFirst = arr.shi ...
- C++ Primer Plus第6版18个重点笔记
下面是我看<C++ Primer Plus>第6版这本书后所做的笔记,作为备忘录便于以后复习. 笔记部分 C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有 ...
- 获取window窗口大小
窗口大小 跨浏览器确定一个窗口的大小不是一件简单的事.IE9+.Firefox.Safari.Opera和Chrome均为此提供了4个属性:innerWidth.innerHeight.outerWi ...
- <转>错误 x error LNK1104: 无法打开文件“E:\xxxx\Debug\xxxx.exe”
刚刚还好好的,怎么突然就出现这样的错误, 后来分析原因, 第一:查看那个exe文件是否存在, 第二:查看那个文件或者那个文件所在的文件夹是否打开或者改名字等等操作占用着这个文件. 第三:重新清理并生成 ...
- HDOJ 4731 Minimum palindrome
Minimum palindrome Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- [Effective JavaScript 笔记] 第11条:熟练掌握闭包
理解闭包三个基本的事实 第一个事实:js允许你引用在当前函数以外定义的变量. function makeSandwich(){ var magicIngredient=”peanut butter”; ...
- 代码规范和常用的js插件以及测试工具
1.代码规范 .model层 1.1.1database file_proerty 1.1.2java fileProperty. 1.2.字段要有空指针 1.3.不创建爱数据库外键约束 1.4.已知 ...
- C# params关键字
params数组的要点 C#开发语言中 params 是关键字,可以指定在参数数目可变处采用参数的方法参数.在函数的参数数目可变而执行的代码差异很小的时候很有用! class Program { st ...