复习Java基础第三天
了解JVM
- JVM:Java Virtual Machine,它就是Java虚拟机。
- 所谓虚拟机是指:通过软件模拟的一台具有完整硬件系统功能的,运行在一个完全隔离环境中的计算机系统。
- JVM是通过软件来模拟Java字节码的指令集,是Java程序的运行环境。
- 基本数据类型,局部变量都是放在栈内存中的,用完就消失。
- new创建的实例化及数组是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除
JVM主要功能作用
- 通过ClassLoader查找和装载class文件。
- 解释字节码成为指令并执行,提供class文件的运行环境
- 进行运行期间的内存分配和垃圾回收。
- 提供与硬件交互的平台。
JVM是Java的核心和基础
在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的
计算机基于下层的操作系统和硬件平台可以在上面执行java的字节码程序。java
编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译
成字节码程序,通过JVM将每一条只能翻译成不同平台机器码,通过特定平台运行。
JVM周期
JVM在Java运行的时候,它才开始运行,程序结束时就停止。一个Java程序会开启一个JVM进程,如果一台电脑上运行三个程序,那么就会有三个运行中的JVM。
JVM的线程分为两种:守护线程和普通线程。
守护线程:守护线程是JVM自己使用的线程,比如垃圾回收(GC)就是一个守护线程。
普通线程:普通线程一般是Java程序的线程,只要JVM中有普通线程在执行,那么JVM就不会停止。权限够的话,可以调用exit()方法终止程序。
JVM的体系结构
- ClassLoader类加载器:负责加载.class文件,class文件在文件开头有特定的文件标示,并且ClassLoader负责class文件的加载等,至于它是否可以运行,则由Execution Engine决定。
- Execution Engine执行引擎:如果想让一个Java程序运行起来、执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
- 运行时数据区:运行时数据区分为五个主要部分。
- 方法区域:所有类级别的数据(包括静态变量)都将存储在此处。每个JVM都只有一个方法区域,它是共享资源的。
- 堆区:所有对象以及其对应的实例变量和数组都将存储在此处。每个JVM都有一个堆区。由于“方法”和“堆”区域共享多个线程的内存,因此存储的数据不是线程安全的。
- 堆栈区:对于每个线程,都会创建一个单独的运行时堆栈。对于每个方法的调用,将在堆栈存储器中创建一个条目,称为堆栈帧。所有局部变量都将在堆栈存储器中创建。堆栈区域是线程安全的,因为它不是共享资源。堆栈框架分为三个子实体:1. 局部变量数组:与该方法有关,设及多少个局部变量,并且相应的值都将存储在此处。2. 操作数堆栈:如果需要执行任何中间操作,则操作数堆栈充当执行该操作的运行时工作区。3. 帧数据:与该方法相对应的所有符号都存储在此处。在任何例外的情况下,捕获块信息将保留在帧数据中。
- PC寄存器:每个线程都有单独的PC寄存器,以在执行指令后保存当前执行指令的地址,PC寄存器将用下一条执行指令进行更新。
- 本地方法堆栈:本地方法堆栈保存本机方法信息。对于每个方法线程,都将创建一个单独的本地方法堆栈。
堆和栈的特点
堆:
堆内存用来存放new创建的对象和数组。
堆内存中所有实体都是有内存地址值的。
堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。
堆内存中的实体不在被指向时,JVM启动垃圾回收机制自动清除。
栈:
函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。
栈内存特点,数据一执行完毕,变量会立即释放,节约内存空间。
栈内存中的数据,没有默认初始化值,需要手动设置。
什么是深拷贝与浅拷贝
Java的深拷贝与浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。在 Java 中,除了基本数据类型(元类型)之外,还存在 类的实例对象 这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候。对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。
而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。
所以到现在,就应该了解了,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不同操作而已。
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型创建一个新的对象,并复制其内容,此为深拷贝。
总结
害!最近每天晚上回到家人已经累趴了,完全不想打开电脑了,复习做笔记都落下了!!!