是安装在计算机操作系统上的一个虚拟计算机。
专门用于处理java程序和底层操作系统的链接工作,将java程序翻译成底层的操作系统可以理解的语言。
有别于JDK。JDK是java的开发环境,是java开发人员需要的,里面除了JVM,还有一些其他的东西。JVM是小于JDK的。
JVM的结构图如下图所示:
1. 类加载器:加载类文件到内存。[这里的类文件是class文件]
2. 运行数据区:1中加载的class文件,全部保存在运行数据区。java能够很好的运行,也是得益于运行数据区的管理。
3. 执行引擎:也叫做解释器,负责讲class文件解释成操作系统的语言。
4. 本地接口:本地接口的初衷是为了实现java中调用其他的C/C++的程序,于是就在内存中开辟了一个本地方法栈,用于等级本地方法,然后在执行引擎的时候调用本地方法。[现在使用的越来越少了]
1. 栈-stack
是java的程序运行区,在线程创建的时候创建,生命周期跟随线程的生命周期,所以栈中不存在垃圾回收的问题。
栈中存放是数据包括:
本地变量[输入参数、输出参数以及方法内的参数];
栈操作[记录入栈和出栈的操作];
栈帧数据[类文件、方法等]。
2. 堆
一个JVM实例中存放一个堆内存,堆内存的大小是可以调节的。类加载器读了类的文件后需要把类、方法、常变量放置在堆中。
堆内存又分为:
1) 永久存储区
常驻内存中的区域,存放JDK自身所携带的class、interface的元数据,都是一些运行环境必须的资源信息。不会被垃圾回收器回收。
2)新生区
类产生的区域。新生区又被分为两个部分:伊甸区和幸存者区。幸存区又被分为0区和1区。伊甸区new出新的类,当伊甸区满的时候,垃圾回收将这个区域整理回收,没有被回收的放到0区去。0区满了,垃圾回收又整理回收,没有回收的放到1区去。1区满了就整理到养老去去。
3)养老区
3. 方法区
被所有的线程所共享,保存:字段和方法字节码,以及一些特殊的方法如构造函数和接口代码。这里保存的有类变量。
4. PC register 程序计数器
指导执行引擎找到下一条指令
5. 本地方法栈
堆和栈区别
对存放的是对象,而对象内的临时变量存放在栈内存中;栈是跟随线程的,堆是跟随JVM。
类变量和实例变量的区别
类变量前面有static修饰,是类的变量;实例变量的实例new出来的。类变量存储在方法区中;实例变量存储在堆中。
java的方法传递的是值OR地址
都不是,对于原生数据传递的值,引用类型传递的地址。
原文:http://www.cnblogs.com/lxq0309/p/3742095.html