JAVA学习【10】JVM基础知识整理
2016-03-16 20:35
375 查看
JVM是面试必考内容,需特别注意。
JVM(Java Virtual Machine)是在本地计算机平台上利用程序模拟的一种虚拟机,是Java语言能够跨平台运行的根本,可以认为JVM是一个本地进程,用于运行.class文件。
每个Java程序都是一个独立的JVM实例,都有独立的堆空间,同一Java程序的多个线程共享同一个堆空间。
JAVA程序运行过程
由上可知,JVM主要是将.class文件解释成操作系统可以运行的机器码。
JVM的基本结构
类装载器:根据类名装载.class文件到Runtime Data Area的Method Area
执行引擎:执行字节码。Class文件被加载后 , 会把指令和数据信息放入内存中,Execution Engine则负责把这些命令解释给操作系统。
本地接口:调用本地接口的。他的作用是调用不同语言的接口给JAVA用。
运行时数据区:JVM虚拟机模拟的内存,包括
(1)堆(Heap):存储类的对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
(2)栈(Stack):存放当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack
Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。
(3)方法区域(Method Area):存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。反射类Class获得的信息都来源于方法区域。
(4)程序计数寄存器(Program Counter Register):存储每个线程下一步将执行的JVM指令。
(5)本地方法栈(Native Method Stack):支持native方法的执行。
其中,所有线程共享使用堆(Heap)和 方法区域(Method
Area),每个线程独立拥有栈(Stack)、程序计数寄存器(Program Counter Register)和本地方法栈(Native Method Stack)。
关于String存储的运行时常量池(Run-time Constant Pool)通常认为位于堆(Heap)中,有时也认为位于方法区域(Method Area)中,因为可以认为方法区域(Method Area)也位于堆(Heap)中,即
JVM的运行过程
JVM是如何将.class文件解释成机器码的了?
1) 装载.class文件(包括加载类、链接、初始化)可以参考图文http://sishuok.com/forum/blogPost/list/355.html
2) 管理并分配内存执行程序
3) 执行垃圾收集
可以参考http://www.open-open.com/lib/view/open1408453806147.html
JVM的垃圾回收
JVM中会在以下情况触发回收:对象没有被引用 , 作用域发生未捕捉异常 , 程序正常执行完毕 , 程序执行了System.exit() , 程序发生意外终止
垃圾回收器GC(Garbage Collection)对对象生命周期分析后,将内存中不再被使用的对象进行回收。GC把对象分为年青代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation),对不同生命周期的对象使用不同的算法进行回收。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
年青代(Young Generation):所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
年老代(Old Generation):在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代(Permanent Generation):用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响。
常见垃圾回收策略:
(1)引用计数回收机制
引用计数是标识Heap中对象状态最明显的一种方法,引用计数的方法简单来说就是对每一个对象都提供一个关联的引用计数,以此来标识该对象是否被使用,当这个计数为零时,说明这个对象已经不再被使用了。
缺点:并且引用计数无法解决循环引用的问题,因此JVM并没有采用引用计数。
(2)根搜索算法回收机制(JVM采用的垃圾回收策略)
具体可以参考http://www.open-open.com/lib/view/open1437834571349.html
以上只是JVM基础知识整理
JVM(Java Virtual Machine)是在本地计算机平台上利用程序模拟的一种虚拟机,是Java语言能够跨平台运行的根本,可以认为JVM是一个本地进程,用于运行.class文件。
每个Java程序都是一个独立的JVM实例,都有独立的堆空间,同一Java程序的多个线程共享同一个堆空间。
JAVA程序运行过程
由上可知,JVM主要是将.class文件解释成操作系统可以运行的机器码。
JVM的基本结构
类装载器:根据类名装载.class文件到Runtime Data Area的Method Area
执行引擎:执行字节码。Class文件被加载后 , 会把指令和数据信息放入内存中,Execution Engine则负责把这些命令解释给操作系统。
本地接口:调用本地接口的。他的作用是调用不同语言的接口给JAVA用。
运行时数据区:JVM虚拟机模拟的内存,包括
(1)堆(Heap):存储类的对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
(2)栈(Stack):存放当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack
Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。
(3)方法区域(Method Area):存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。反射类Class获得的信息都来源于方法区域。
(4)程序计数寄存器(Program Counter Register):存储每个线程下一步将执行的JVM指令。
(5)本地方法栈(Native Method Stack):支持native方法的执行。
其中,所有线程共享使用堆(Heap)和 方法区域(Method
Area),每个线程独立拥有栈(Stack)、程序计数寄存器(Program Counter Register)和本地方法栈(Native Method Stack)。
关于String存储的运行时常量池(Run-time Constant Pool)通常认为位于堆(Heap)中,有时也认为位于方法区域(Method Area)中,因为可以认为方法区域(Method Area)也位于堆(Heap)中,即
JVM的运行过程
JVM是如何将.class文件解释成机器码的了?
1) 装载.class文件(包括加载类、链接、初始化)可以参考图文http://sishuok.com/forum/blogPost/list/355.html
2) 管理并分配内存执行程序
3) 执行垃圾收集
可以参考http://www.open-open.com/lib/view/open1408453806147.html
JVM的垃圾回收
JVM中会在以下情况触发回收:对象没有被引用 , 作用域发生未捕捉异常 , 程序正常执行完毕 , 程序执行了System.exit() , 程序发生意外终止
垃圾回收器GC(Garbage Collection)对对象生命周期分析后,将内存中不再被使用的对象进行回收。GC把对象分为年青代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation),对不同生命周期的对象使用不同的算法进行回收。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
年青代(Young Generation):所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
年老代(Old Generation):在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代(Permanent Generation):用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响。
常见垃圾回收策略:
(1)引用计数回收机制
引用计数是标识Heap中对象状态最明显的一种方法,引用计数的方法简单来说就是对每一个对象都提供一个关联的引用计数,以此来标识该对象是否被使用,当这个计数为零时,说明这个对象已经不再被使用了。
缺点:并且引用计数无法解决循环引用的问题,因此JVM并没有采用引用计数。
(2)根搜索算法回收机制(JVM采用的垃圾回收策略)
具体可以参考http://www.open-open.com/lib/view/open1437834571349.html
以上只是JVM基础知识整理
相关文章推荐
- Java中ArrayList类的用法(转)
- Struts2的异常处理机制
- JDK环境变量配置
- Java 获取本机ip
- 设计模式之装饰器模式
- Java基础知识
- Leetcode:257. Binary Tree Paths(JAVA)
- eclipse最有用快捷键整理
- java使用JexcelApi和POI两种方法操作excel
- Java实现抽象工厂模式+java的反射的机制
- 使用Eclipse时一些报错
- Struts2拦截器实现异常处理机制
- Java拼接批量新增SQL语句
- Ubuntu 命令行 安装 Java
- 一种简单的利用文本扫描类写的猜数字游戏
- Java基础 接口
- 配置Ubuntu14.04 下的java开发环境笔记
- Java集合源码学习笔记(四)HashMap分析
- Java数据抓取总结--2.使用Jsoup抓取当前天气情况
- 菜鸟入门Java