JVM简单理解

来源:互联网 发布:寻秦记 赵倩 知乎 编辑:程序博客网 时间:2024/06/05 15:35

面试的时候,总有一些人问对虚拟机的理解,网上也有很多深入讨论虚拟机的文章,这里只想讲讲自己的简单认识

1、为什么要有JVM

应该说为什么会有JVM,为了实现Java所谓的平台无关性,如果没有JVM,java就不是我们认识的java(抄一段百度百科的话)

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

2、有哪些Java虚拟机

从古至今,有N多的虚拟机实现版本,反正能把.class也就字节码解释成具体平台上的机器指令执行的,都可以叫虚拟机。一开始搞出来的,基本上相当于简单的解释器。老外嘛,总喜欢搞些新东西出来,另外一些公司(比如IBM这个总喜欢自己创造的傻D)也创造了自己的虚拟机。经过不停的完善发展淘汰,功能逐渐完善,我们现在用的一般都是Hotspot JVM

3、Java虚拟机由那些部分组成

经常面试问到的什么JVM内存模型转载一篇博文,http://www.cnblogs.com/dingyingsi/p/3760447.htmlJVM

内存模型自己的理解

1)程序计数器--寄存器

线程私有

功能性的组件,存储的内容比较固定,占的空间的可预见的,不存在内存溢出

访问速度最快,最小、结构最简单、最直接

2)栈

线程私有

记录了方法本身的执行逻辑信息。比如变量表、返回值、返回地址这些(它们每一个叫做一个栈帧,也就是代码执行逻辑移动的最小单位)。基本数据类型直接存放在栈中,因为存储空间需求不大,没必要再弄个地址引用

因为是存储东西是不可预见,所以存在内存溢出。使用-Xss(stack space)参数设置虚拟机占的大小

栈的运行速度快,为什么。首先存储的内容是在编译期就已经确定了,并且很小。其次读取的时候,只需要读栈的下一条就可以了

Java到底是引用传递还是值传递,方法执行的时候,肯定从栈中取信息来执行,栈中只有对象的引用,最终改变的还是堆中的值,并不是复制,所以应该是值传递

3)本地方法栈

管理本地方法,跟程序员没关系。为什么叫栈,方法执行嘛,肯定都要用栈的结构来执行

4)堆

线程共享,需要考虑并发的同步,没有必要一个线程持有一套自己的对象,太奢侈了

那ThreadLocal不就是线程持有自己的对象嘛。。。可能是ThreadLocal持有的对象比较固定,大小也不大

对象存储在堆中,堆是纯存储单位,相比较栈是用来推动逻辑的运行

堆的存储速度稍微慢一些。因为需要动态分配内存。并且读取需要寻址堆里面

区分什么新生代、老年代。GC的重点区域

4)方法区

线程共享

不知道怎么翻译成方法区的,存储类的描述信息。包括:类名、方法信息、字段信息、静态变量以及编译器编译后的代码。是给JVM自己使用的。

4、程序员可能用到的虚拟机配置,针对Hotspot的,就是我们经常在eclipse的installed jre选项或者tomcat的catalina.bat/sh中配置的那一串XXXxxx64128256的东西,转载一篇文章http://blog.csdn.net/jewes/article/details/42174893

0 0