### 深入理解Java中的一些概念 #### 1. JVM的组成 Java虚拟机(JVM)是Java程序运行的基础,其主要组成部分包括类加载器、运行时数据区、执行引擎以及本地方法接口。 - **类加载器(ClassLoader)**:负责读取文件系统的.class文件或者从网络下载.class文件,然后转化为Class对象。 - **运行时数据区(Runtime Data Area)**:包括程序计数器(Program Counter Register)、Java虚拟机栈(Java Virtual Machine Stacks)、本地方法栈(Native Method Stack)、Java堆(Java Heap)和方法区(Method Area)。 - **执行引擎(Execution Engine)**:将字节码解释执行或通过即时编译技术编译成机器码直接执行。 - **本地方法接口(Native Interface)**:用于支持Java代码调用本地方法。 #### 2. 运行时数据区 - **程序计数器(Program Counter Register)**:每个线程都有一个独立的程序计数器,用来记录当前线程执行的字节码指令的位置。 - **Java虚拟机栈(Java Virtual Machine Stacks)**:线程私有,每个线程拥有一个Java虚拟机栈。每当调用一个方法时,就会创建一个新的栈帧来存储该方法的信息。 - **栈帧(Stack Frame)**:用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 - **本地方法栈(Native Method Stack)**:与Java虚拟机栈类似,但服务于本地方法调用。 - **Java堆(Java Heap)**:被所有线程共享,用于存储对象实例和数组。 - **GC垃圾回收**: 使用-Xms和-Xmx控制初始大小和最大大小。 - **方法区(Method Area)**:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。 #### 3. 运行时数据区的程序计数器 程序计数器是线程私有的,用于记录当前线程执行的字节码的行号指示器。它的工作原理是通过改变计数器的值来选取下一条需要执行的字节码指令。 #### 4. 运行时数据区—Java虚拟机栈 Java虚拟机栈是线程私有的,主要用于描述Java方法的调用关系。栈的生命周期与线程相同,每个方法执行时都会创建一个栈帧。栈帧中包含局部变量表、操作数栈、动态链接、方法入口等信息。 - **局部变量表**:保存了各种基本数据类型(int、string、float等)、对象引用和returnAddress类型。 - **两种异常**: - **StackOverflowError**:方法无限调用导致栈满。 - **OutOfMemoryError**:每启动一个线程分配的线程空间不足。 #### 5. 运行时数据区—堆 Java堆是线程共享的区域,所有线程都可以访问堆中的数据。它是Java虚拟机中内存最大的一块,几乎所有的对象实例都在这里分配内存。 - **堆满**:会导致内存溢出。 - **设置堆的大小参数**: - **-Xms**:初始化堆的大小。 - **-Xmx**:堆的最大值。 - **GC垃圾回收**:堆是垃圾回收的主要场所。 #### 6. 垃圾回收—可达性分析 垃圾回收的基本思路是从一系列称为GC root的对象作为起始点,向下搜索。搜索过的路径构成引用链。当一个对象到GC root没有任何引用链相连接时,即被认为是不可达的,会被判断为可回收的对象。 #### 7. 垃圾回收—基础算法 - **标记—清除(Mark-Sweep)**:首先标记出需要回收的对象,之后统一回收已标记的对象。 - **复制(Copying)**:将内存空间划分为等大的两部分,每次只使用其中的一半。当第一块内存用完时,把存活的对象复制到第二块,然后清除剩余可回收的对象。 - **标记—整理(Mark-Compact)**:在标记清除的基础上将所有存活的对象向一端移动,剩余的对象都可以删除。 - **分代收集(Generational Collection)**:根据对象的存活周期不同,将内存分为不同的区域进行垃圾回收。 #### 8. 垃圾回收—分代收集算法 分代收集算法利用对象存活的时间特性将内存划分为不同的区域,例如新生代和老年代,针对不同区域采用不同的垃圾回收策略。 #### 9. 垃圾回收—垃圾收集器 不同的垃圾收集器有不同的特点,如Serial收集器、Parallel收集器、CMS收集器和G1收集器等,它们分别适用于不同的应用场景。 #### 10. 类加载流程 类加载流程包括加载、验证、准备、解析和初始化五个阶段。 - **加载(Load)**:将类的.class文件读入内存,并转化为二进制数据流。 - **验证(Verify)**:确保输入的字节流包含的信息符合JVM的要求。 - **准备(Prepare)**:为类变量分配内存并设置类变量的初始值。 - **解析(Resolve)**:将符号引用转化为直接引用。 - **初始化(Initialize)**:执行类构造器<clinit>()方法。 #### 11. 需要加载类的情况 - **遇到new、putstatic、getstatic、invokestatic字节码指令时**:如果类尚未初始化,则需要先触发初始化。 - **对类进行反射调用时**:如果类还没有初始化,则需要先触发初始化。 - **初始化一个类时**:如果父类还没有初始化,则需要先初始化父类。 - **虚拟机启动时**:用于指定一个主类来启动应用。
剩余7页未读,继续阅读
- 粉丝: 337
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 项目采用YOLO V4算法模型进行目标检测,使用Deep SORT目标跟踪算法 .zip
- 针对实时视频流和静态图像实现的对象检测和跟踪算法 .zip
- 部署 yolox 算法使用 deepstream.zip
- 基于webmagic、springboot和mybatis的MagicToe Java爬虫设计源码
- 通过实时流协议 (RTSP) 使用 Yolo、OpenCV 和 Python 进行深度学习的对象检测.zip
- 基于Python和HTML的tb商品列表查询分析设计源码
- 基于国民技术RT-THREAD的MULTInstrument多功能电子测量仪器设计源码
- 基于Java技术的网络报修平台后端设计源码
- 基于Python的美食杰中华菜系数据挖掘与分析设计源码
- 基于Java与JavaScript混合技术的吉森摄影项目设计源码