1.TCP/IP协议(最基础的一定要会)
物理层 数据链路层 网络层 传输层 应用层
三次握手四次挥手
实际上是客户端和服务端开始传送数据的表现,A客户端与B服务端建立TCP连接时,首先A向B发送SYN包同步序列编号,等待B确认,第二次握手服务器接到了SYN包,自己再发送一个SYN包以及ACK包确认,请求应答,最后A回复seq+1确认,这样TCP一次连接三次握手的过程就建立了。
Seq序号,占32位,表示TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
Ack序号 确认序号,ACK为1时才有效,Ack=Seq+1
标志位:6个 :URG紧急指针有效,ACK确认序号有效,PSH接受放应该尽快将这个报文交给应用层, RST重置连接,SYN发起一个新连接,FIN释放一个连接。
Ack和ACK不一样,Ack是确认序号,ACK是标志位的确认序号有效。
四次挥手终止TCP连接
2.TCP和UDP区别
① TCP协议是有连接的,即在传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束后还要结束连接。而UDP是无连接的。
②TCP协议保证数据按序发送以及到达,超时重传来保证可靠性,但是UDP不保证按序到达,不保证到达,只是努力交付,即使是按序发送的序列,也不保准按序送到。
③TCP协议所需的资源多,首部需要20个字节,UDP首部只需要8个字节
④TCP有流量控制和拥塞控制,UDP没有网络堵塞不会影响发送端的发送速率。
⑤TCP是一对一连接,而UDP是一多一 一对多 多对多的通信
⑥TCP面向的是字节流的服务,UDP面向的是报文的服务。
3.http和https
http是超文本传输协议,是基于请求与响应,无状态的应用层协议,长基于TCPIP协议传输数据。
多路复用,通过单一的连接发起多重请求-响应消息。
HTTPS是身披SSL外壳的HTTP,https通过计网进行安全通信的传输协议,TLS/SSL是传输层加密协议。
区别:
http无状态(没有存储能力,比如每次登陆都得写密码),无连接(需要每次都三握四挥),无法保护数据的完整性,传输协议的数据需要以明文形式显示。如何解决无状态:使用cookie/session技术,或者HTTP/1.1持久连接的方法。
https基于http通过SSL或者TLS提供加密处理数据、验证对方身份以及数据完整性保护
通信的过程其实是对应数据的入栈和出栈。
4.进程和程序的区别(我一直都背的进程和线程,懵住了,但真的很基础)
①进程是程序的一次执行。
②进程是可以并行执行的计算
③进程是一个程序与其使用的数据再处理机上顺序执行时发生的活动。
④进程是系统进行资源分配和调度的一个独立单位
本质区别:
①程序是永存的,进程是暂时的
②进程有并发性,程序没有
③二者不是一一对应关系,一个程序可以对应多个进程,多个进程可执行同一个程序,一个进程可执行一个或者几个程序
④进程是竞争计算机资源的基本单位,但是程序不是。
5.进程和线程,线程之间的关系
①线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。
②一个进程由一个或者多个线程组成,线程是一个进程中代码的不同执行路线
③进程之间相互独立,但统一进程下的各个线程之间共享程序的内存空间
④线程上下文切换比进程上下文切换要快得多
为啥不多进程而是多线程呢?
答:线程廉价且启动较快,对系统资源的冲击比较小,多进程不可预测且测试困难。
6.死锁,预防死锁
死锁就是多个线程因竞争资源而造成的一种僵局,若无外力作用,这些进程都讲无法向前推进。
**四个必要条件:**互斥性:线程对资源的战友是排他性的,一个资源只能被一个线程占有,直至释放;请求和保持条件:一个线程对请求被占有的资源发生阻塞,对已经获得的资源不释放;不剥夺,一个线程在释放资源之前,其他线程无法剥夺占有;循环等待,发生死锁时,线程进入死循环。
预防:破获请求和保持:要求进程在申请资源前,要释放自己拥有的资源。;允许进程进行抢占,方法一:如果去抢资源,被拒绝,就释放自己的资源。方法二:操作系统允许抢,只要你优先级大,可以抢到。;破坏循环等待:所有资源统一编号,按照资源编号顺序提出。
7.读写锁(这个不会,但好像也挺基础的)
读锁是共享的
写锁是排他的
读-读能共存,
读-写不能共存,
写-写不能共存。
8.堆和栈
栈内存:存储局部变量,更新速度快,声明周期短
堆内存:存储数组和对象,凡是new简历的都是在堆中,堆中存放的是实体,实体用于封装数据,java垃圾回收(不定时)。
9.虚拟内存和实际内存(操作系统学的,有点久远)
当虚拟内存中的值真正需要用的时候,物理内存才会开辟一段地址来存储虚拟内存中的值
所以真正能使用的物理内存的大小则为:虚拟内存(pagefile.sys) + 物理内存
10.抢占式进程调度(这个也不会,菜哭了)
最常见的现象是你这个进程运行时间太长了,是时候切换到另一个进程了
11.java内存管理机制,垃圾回收
java内存管理就是对象的分配和释放问题,分配由程序员new,释放有垃圾回收机制执行
int i=0;i直接存储在栈中。 Integer i(i此时是对象) = new Integer(5);这样,i对象数据存储在堆中,i的引用存储在栈中,通过栈中的引用来操作对象。
static变量有点类似于C中的全局变量的概念;
垃圾回收机制是一种动态存储管理技术,自动释放不再被程序引用的对象,避免内存泄漏,CPU空闲或空间不足时自动进行垃圾回收。
12.java类加载机制
装载(查找并加载类的二进制数据),链接(Link 验证准备解析)),初始化(为类的静态变量赋予正确的初始值)
13.常见容器类
Collection:独立元素序列
Map:键值对对象,使用键来查找值。
LinkedList类 :基于链表的数据结构
ArrayList类:基于数组的数据结构
Collection、List、ArrayList、Vector及map、HashTable、HashMap
14.set的使用场景,map使用场景
set可以做到整数数组的去重,但是对象就不可以。
map中的集合,元素成对存在,每个元素由键和值两部分组成。
15.hashmap的实现原理
哈希表,哈希表的主干就是数组。新增或者查找某个元素,通过当前元素的关键字,通过摸一个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。
链地址法,数组+链表的方法。HashMap的主干是一个Entry数组,Entry是HashMap的基本组成单元,每一个包含一个key-value键值对。解决哈希碰撞,HashMap中的链表出现越少,性能才会越好。
JDK1.8在1.7的基础上针对增加了红黑树进行优化,即当链表超过8时,链表转换为红黑树,快速增删改查,提高HashMap的性能。
红黑树
java中用来存储有序的数据,时间复杂度为O(lgn),效率高,TreeSet和TreeMap
平衡二叉查找树,根节点是黑色,所有叶子是黑色,红色结点的子节点是黑色。
AVL,平衡查找二叉树(通过左旋和右旋来实现)
2-3-4树
四阶的B树:
2-节点:包含1个元素,两个子节点
3-节点:包含2个元素,三个子节点
4-节点:包含3个元素,四个子节点
一般对第二个节点操作?
234树转换成红黑树
涂色规则:
2节点:黑色
3节点:左倾或者右倾,上黑下红
4节点:
红黑树平衡:左 旋 右旋 变色
16.第一第二第三范式
第一范式:所有属性不可再分,原子性
第二范式:在第一范式的基础上,依赖一个候选码
第三范式:在第二范式的基础上,消除了传递依赖
17.mysql和oracle的特点算法题,题不难也都是基础,但我代码能力真的差的一批.
18.给一个链表的头部节点,进行升序排序,输出
19.归并排序
HashMap和ConcurrentHashMap的区别
hashtable线程安全,无论是key还是value都不能为null,
hashmap线程不安全,可以存储null键和null值
以上都是数组+链表实现的
ConcurrentHashMap:HashMap不支持并发,而ConcurrentHashMap支持并发,由segment组成
哈希表牺牲了顺序性。
大于8个
vector,list
int和Integer的区别
1.integer是int的包装类,int则是java的一种基本类型数据
2.integer变量必须实例化后才能使用,而int不用
3.integer实际上是对象的引用,生成了一个指针指向此对象;而int则是直接存储数据值。
4.integer的默认值是null,int的默认值是0;
C++多态,虚函数机制
进程通信
算法题:最长不重复字串(HashTable,O(N))
Java多态(看程序说结果,比较复杂,还考察了override和overwrite)
多态的三个必要条件:继承、重写、父类引用指向子类对象
多态调用方法时,硬先检查父类中是否有该方法,如果没有则编译错误,如果有则去调用子类的同名方法
虚函数的存在是为了多态,加final变为非虚函数,java的普通函数就相当于C++的虚函数。
多态的实现方法:重写、接口、抽象类和抽象方法
override重写
外壳不变,核心重写,即返回值和形参都不改变,内容可以重写。父类没有的方法,子类不能有。
overload重载
构造函数 方法名字相同,参数不同,返回的类型和值不同
二叉搜索树
二叉搜索树相对于线性结构,在构造复杂度和删除复杂度方面占优,在查询复杂度方面,有可能类似斜树,即每层只有一个节点的情况,这时并不占优势。
二叉搜索树左子树小,右子树大。
B树b+树
磁盘
B树所有节点都可以存储key和data
B+树只有叶子结点才能存储data,叶子结点包含了这颗数的所有键值。
数据库使用最为频繁的一种索引 B+(blance)
红黑树理解以及Java实现
1.红黑树定义:
每个结点非黑即红
根节点是黑色
叶子结点黑色,即空的叶子结点
若一个结点为红色,则子节点为黑色
从一个结点到该节点的子孙结点的所有路径上包含相同数目的黑色结点。
①数组动态划分,连续划分,可能会越界。
②链表,在内存当中不连续
③二叉树 增删改查比较多
完美二叉树(满二叉树)、完全二叉树、完满二叉树
遍历操作:中序遍历(左中右)、先序遍历(根左右)、后序遍历(左右根)
前驱结点:小于当前结点的最大值
后继结点:大于当前结点的最小值
删除结点
1.叶子结点直接删除
2.只有一个子节点的找前驱结点或后继结点
3.有两个子节点:找到替代结点(前驱结点或者后继结点)
插入
1.执行二叉搜索树逻辑
2.将插入的结点变为红色
3.适当旋转以及颜色调整
用互斥锁实现读写锁,写者优先
算法题:有100个方格,每个上面有毒蘑菇和体力蘑菇,毒蘑菇减体力体力蘑菇加体力,当前体力是能跳到的最远距离,求是否能跳到最远方格,如果可以,求落在第100格上的最大剩余体力
服务方法调用
RPC/Netty
序列化/反序列化
10亿找Top10000,需要考虑分片,如果用最小堆需要考虑高效合并
要考虑等待时间且带有优先权的打印机,设计数据结构使打印任务高效
二十四点牌
乐观锁、悲观锁
解决并发控制
悲观锁:Java 里面的同步 synchronized 关键字的实现 读锁和写锁
乐观锁:线程在提交前,根据版本进行冲突检测一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会 +1。当线程 A 要更新数据时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值与当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。 CAS比较并交换
// capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement)
Spring的两大核心
IOC(控制反转:把对象的创建过程交给spring ioc容器去管理)
Bean的初始化方式有三种
1.实例化工厂
2.静态工厂
3.构造方法
AOP(面向切面编程)
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
springboot 和 springmvc
springboot自动配置,快速敏捷地开发新一代基于spring框架的应用程序
spring是一个引擎
spring MVC是基于Spring的一个mvc框架
springboot是基于spring4的条件注册的一套快速开发的整合包
C/S架构和B/S架构
C/S:第一层在客户机系统上结合界面的显示与业务逻辑
第二层通过网络结合了数据库服务器
C/S架构软件有一个特点,就是如果用户要使用的话,需要下载一个客户端,安装后就可以使用。比如QQ,OFFICE软件等。
B/S:web浏览器,只要有web浏览器就行,前端做数据渲染,后端做逻辑设计
有三层(cs两层)无需升级多个客户端、升级服务器即可
Redis
数据库acid:atom 原子性(不可分割) consistence一致性(前后数据一致) isolation 隔离性(多并发数据相互隔离) durablility持久性(对数据库中数据的改变是永久的)
支持五种数据类型:字符串、列表、集合、散列表、有序集合
与传统数据库不同的是,redis存在内存中,读写快
innodb和myisam
innodb为mysql默认存储引擎,最大的特色就是支持了ACID兼容的事务功能 聚集索引 支持行级锁
myisam为mysql5.5版本之前的默认数据库引擎,性能佳但是有一个致命,不支持事务处理。非聚集索引 支持表级锁
数据库优化方法
1.选取最适用的字段属性:即空间能小就小。
2.事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
数据库索引底层是怎样实现的
B+数实现的,没有遵循最左匹配原则。
索引是为了加快搜索
innodb在线事务处理
myisam联机事务处理
jdbc中如何进行事务处理
手动提交事务 commit()提交 rollback()回滚 savepoint保存点
只有存在并发数据访问时才需要事务,多个事务访问同一数据时,可能会存在5类问题,脏读、不可重复读、欢度、两类更新问题。
udp如何变得可靠传输
UDP要想可靠,就要接收方收到UDP之后回复个确认包,发送方有个机制,收不到确认包就要重新发送,每个包有递增的序号,接收方发现中间丢了包就要发重传请求,当网络太差时候频繁丢包,防止越丢包越重传的恶性循环,要有个发送窗口的限制,发送窗口的大小根据网络传输情况调整,调整算法要有一定自适应性。
线程通信的四种方式
1.volatile:修饰的变量被某个线程更改必须理科刷新到主内存 变量在使用之前必须重新读取主内存的值 轮询
2.等待/通知机制:wait notify方法
3.join方式
4.threadLocal
5.synchronized加锁
String和StringBuffer的区别
String不可改变字符串 StringBuffer可以改变字符串。
StringBuffer线程安全,StringBuilder线程不安全,底层实现上的话,StringBuffer其实就是比StringBuilder多了Synchronized修饰符。
基本数据类型
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
java.lang.String类是final类型的,因此不可以继承这个类
array arraylist区别
array可以包含基本类型和对象类型,但是ArrayList智能包含对象类型
array是固定的,Arraylist是动态变化的。
值传递和引用传递
值传递是基本型白能量所说的,传递的是副本数值
引用传递是对对象变量而言的,传递的是对象地址的一个副本
请你解释为什么会出现4.0-3.6=0.40000001这种现象?
计算机在计算10进制小数时,会先转换为2进制,这个过程出现了误差。
==是什么意思
==对比引用是否地址相同,对比值是否相等
hashcode
重写equals和hashcode 首先比较key-》hashcode-》value
hashcode相同但是对象不一定相同,hashcode比较地址
map情况
hashmap不支持线程同步因为会使得取出来的值不一样,允许键为null,想同步的话需要用到synchronizedMap方法或者ConcurrentHashMap
hashtable支持线程同步 写入比较慢 不允许键或者值为空
linkedhashmap hashmap的子类,保存了插入顺序
treemap 根据键排序 默认升序
关键字
final:不可被继承
synchronized:保证统一时刻只有一个线程执行改短代码 有异常会自动释放锁 类锁(静态方法)和对象锁(成员方法)
Lock:没有unlock()会死锁
lock可以让等待的线程响应中断 而synchronized不行,等会一直等
volatile:保证有序性和可见性 刷新主内存
面对对象的六原则一法则
单一职责:高内聚、低耦合
开闭原则:对扩展开放,对修改关闭
依赖倒转原则:面向接口编程
里氏替换原则:任何时候都可以用子类型替换掉父类型。
接口隔离原则:接口要小而专,绝不能大而全
合成聚合复用原则
迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了
处理异常
try 一个东西 catch错误 finally
Java的接口和C++的虚类的相同和不同
C++的虚类实际上就是java的抽象类
即抽象和接口的区别:抽象继承一个,但是接口有很多个
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。
finalize垃圾回收
java面对对象的特性
抽象、继承、封装(接口)、多态性
static:编译即创建 非static:运行才创建
ArrayList(索引快 插入慢)和LinkedListed(插入速度快)(双向链表实现存储)都是非线程安全的,vector由于synchronize所以线程安全
set不重复 list可重复
序列化serializable
深克隆
ConcurrentHashMap的原理
此类包含两个静态内部类:HashEntry(封装映射表的键值对)和Segment(充当锁的角色)
1.7前是Segment+HashEntry
1.8放弃了Segment臃肿的设计,取而代之的是Node+CAS+Synchronized
TreeMap的底层实现就是红黑树数据结构
依赖注入:set注入 构造器注入 接口注入
cookie 和 session 的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
SSL四次握手
http和https的区别
https需要申请证书到CA经济成本大
http是明文传输 https是加密的安全传输
http是80 https是443
http连接简单没有状态 https是ssl加密的传输,身份认证的网络协议比较安全
浏览器接到URL
1.DNS解析 2.TCP连接 3.发送HTTP请求 4.服务器处理请求并返回HTTP报文 5.浏览器解析渲染页面
icmp
自协议用于ip主机和路由器之间传递控制信息,不传输用户数据单重要。
直播用tcp还是udp
目前行业里直播还是以TCP占绝对份额,rtmp或者hls都是基于TCP,但是从底层UDP和TCP的特性来看,还是UDP适合做实时性通信,比如直播。
如果是为了快速出产品,到不必纠结是TCP还是UDP做直播,大佬们已经把协议、客户端、服务器端都准备好了,都是基于TCP,比如nginx,但是如果是想重造轮子,当然UDP好。
字节移动端开发面经
进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的
进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket
调度算法
先来先服务调度算法:对短作业不利
短作业优先调度算法:对长作业不利
高优先权调度算法:作业调度和进程调度
搞响应比优先调度算法:响应比 =(等待时间+要求服务时间)/ 要求服务时间
时间片轮转法
多级存储
只有采用由多级存储器组成的存储体系,把几种存储技术结合起来,才能较好地解决存储器大容量、高速度和低成本这三者之间的矛盾。
面向对象的三个基本特征、和作用
封装(把客观的事务封装成抽象的类) 继承 多态
虚函数的作用和原理
为了实现多态,虚函数实现原理:虚函数表、虚函数指针
智能指针的类型有哪些,有什么作用
share_ptr unique_ptr
C语言关键字volatile(注意它是用来修饰变量而不是上面介绍的volatile)表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新存取。该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程
需要字节对齐的根本原因在于CPU访问数据的效率问题。例如,假设一个处理器总是从存储器中取出8个字节,则地址必须为8的倍数。
tcp和udp应用场景
tcp:文件传输、接收邮件、远程登录
udp:在线视频、qq聊天、广播通信
为什么建立连接是三次握手,而关闭连接却是四次挥手呢
对于3次握手:主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
对于4次挥手:其实你仔细看是2次,因为TCP是全双工的,所以,发送方和接收方都需要Fin和Ack。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。
服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
拥塞控制主要是四个算法:
慢启动
拥塞避免
拥塞发生
快速恢复
1. 在浏览器输入一个URL按下回车后,其流程是?
分析:如果要连接到远程服务器,首先要知道服务器的IP地址和端口,然后发送请求到服务器,服务器再响应。因此寻址和如何建立连接是关键。
步骤:
(1)进行寻址:若浏览器缓存中存有URL的对应IP,则直接查询IP;否则访问DNS(Domain Name System)进行寻址(Domain Name Resolution)。
(2) DNS或者URL Cache返回网页服务器的IP地址。
(3)浏览器与网页服务器进行三次握手建立TCP连接。由于是网页浏览服务,故连接到服务器的80端口。
(4)浏览器与服务器建立HTTP会话(Session),接收来自服务器的HTTP数据。
(5)浏览器解析HTTP数据,在本地窗口内渲染并显示网页。
(6)当浏览器页面被关闭时,终止HTTP会话并关闭连接。
http和https的区别,https用什么保证安全
http是应用层协议,它会将要传输的数据以明文的方式给传输层,这样显然不安全。https则是在应用层与传输层之间又加了一层,该层遵守SSL/TLS协议,用于数据加密。
**加密的方式有两种:
对称加密
对称加密速度快,但是加密和解密的钥匙是相同的
非对称加密
算法更加复杂,速度慢,加密和解密钥匙不相同。
在https中,加密过程大致如下:
首先服务器将公钥给浏览器,浏览器拿到公钥之后,生成一个“会话密钥”,这个会话密钥属于对称加密,然后用公钥加密这个“会话密钥”发送给服务器,最后,在数据传输的过程中,就用这个会话密钥来加密数据。打个比方:我有二把钥匙,我把其中一把钥匙放在信封里,然后把信封交给你。但是这个信封只有你能打开。
上述的过程是在3次握手中完成,采用明文发送,握手完成以后,客户端和服务端就约定好了“会话密钥”,以后的数据传输,就采用这个会话密钥加密。
FTP,NFS,SMTP) 6表示层5 会话层 4传输层(TCP,UDP)3 网络层 (IP))2数据链路层1物理层
在TCP/IP协议中,计算机的唯一标识符称为IP地址。
NAT是网络地址转换,也就是将私有的IP转换为公网的IP,让你内网的客户机,通过这个NAT技术能可以连接到公共互联上去。
JVM
-Xss为虚拟机参数,来指定每个线程的Java虚拟机栈内存大小
堆为所有对象分配内存的地方,是垃圾收集的主要区域
垃圾回收
垃圾收集主要是针对堆和方法区进行。
- 引用计数算法
为对象添加一个引用计数器,对象增加一个引用计数器加1,失效则减1,引用计数为0的对象可被回收。 - 可达性分析算法
- 方法区的回收
- finalize():
四种不同强度的引用
1.强引用:直接new 不会被回收
2.软引用 SoftReference 在内存不够的情况下回收
3.弱引用 WeakReference 一定会被回收,只能存活到下一次垃圾回收发生之前。
4.虚引用
垃圾收集算法
- 标记-清除:对象是否为活动对象并打标记
缺点:标记和清除过程效率不高,会产生大量不连续的内存碎片,导致无法给大对象分配内存。 - 标记-整理:所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
优点:不会产生内存碎片。不足:需要移动大量对象,处理效率低 - 复制:把内存划分为大小相等的两块,每次只使用其中一块。
- 现在的商业虚拟机用分代收集算法
新生代:复制算法
老生带:标记-清除或者标记-整理。
类的加载机制
类是在运行期间第一次使用动态加载的,而不是一次性加载所有类,因为如果一次性加载,那么会占用很多内存。
7个阶段:
加载(二进制字节流)-》验证(避免对虚拟机的伤害)-》准备-》解析-》初始化-》使用-》卸载