JVM作用
JAVA由于有虚拟机的特性,很多东西是编译器自己做的,不相C语言 内存的分匹配和释放需要人为控制, JVM有垃圾回收器自动的进行处理,所以很多情况下,这种处理并不能让我们满意。为了解决这个问题还有线程处理的问题,我们需要学习JVM来处理相关异常(内存溢出)以及自定义JDK。
JVM学习的知识框架
1、了解JAVA虚拟机的发展 特别是Hotsop
2、了解其自动内存管理结构(垃圾回收器)
3、虚拟机如何执行程序
4、Java程序如何从源码到字节码 字节吗到机器码
5. JAVA里提供了高效的线程操作,但是还是不够, 我们可以通过JVM自己去搞 高效的并发操作
2.3是理论基础 (哪里发生的溢出异常)
4.5 运用 理论进行实践 (如何解决内存溢出的异常 还有自定以JDK)
2、了解其自动内存管理结构(垃圾回收器)
3、虚拟机如何执行程序
4、Java程序如何从源码到字节码 字节吗到机器码
5. JAVA里提供了高效的线程操作,但是还是不够, 我们可以通过JVM自己去搞 高效的并发操作
2.3是理论基础 (哪里发生的溢出异常)
4.5 运用 理论进行实践 (如何解决内存溢出的异常 还有自定以JDK)
目前我学JVM,达到的目标:
1、构建相关的学科框架
2、着重去理解,第二章。内存管理里的内存结构 帮助后续编程;四五章系统优化,暂不管
2、着重去理解,第二章。内存管理里的内存结构 帮助后续编程;四五章系统优化,暂不管
相关知识导图和模型如下:
内存结构:
虚拟机栈: 存放对象引用包括各种基本数据类型(int .对象引用)
栈帧:有关方法的各种信息,局部变量 ,如何去调用方法
本地本地方法栈:作用和栈帧差不多,只不过是存放虚拟机native方法的
堆: 存放各种对象,数组的数据 方法区: 类加载进来之后,类信息(字段 方法 接口)静态量,常量(逻辑上的划分)常量池:运行时期也可以存放相关数据
程序计数器:线程开始时,JVM依据这个程序计数器进行操作
栈帧:有关方法的各种信息,局部变量 ,如何去调用方法
本地本地方法栈:作用和栈帧差不多,只不过是存放虚拟机native方法的
堆: 存放各种对象,数组的数据 方法区: 类加载进来之后,类信息(字段 方法 接口)静态量,常量(逻辑上的划分)常量池:运行时期也可以存放相关数据
程序计数器:线程开始时,JVM依据这个程序计数器进行操作
以上是虚拟机内部的结构,外部还有执行引擎和本地库接口,和其他软件进行相关连接
与相关线程的知识:
堆和方法区是数据共享的
虚拟机栈 本地方法栈 程序计数器是私有的
虚拟机栈 本地方法栈 程序计数器是私有的
GC概念:
GC (GarbageCollection)是垃圾回收机制,在JAVA中开发人员无法使用指针来自由的管理内存,GC是JVM对内存(主要就是对象)进行管理的方式,GC使得JAVA开发人员摆脱了繁琐的内存管理工作,让程序开发更有效率。
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。但是,为了保证GC能够在不同平台实现的问题,Java规范对GC的很多行为都没有进行严格的规定。例如,对于采用什么类型的回收
算法、什么时候进行回收等重要问题都没有明确的规定。因此,不同的JVM的实现者往往有不同的实现算法。这也给Java程序员的开发带来行多不确定性