two

发布时间 2023-10-09 21:34:59作者: 朱呀朱~

four

  • TCP / IP 三握手四挥手:

    • A 是客户端(渣女),B 是服务端(备胎还是舔狗)

    • 三次握手(来往的都是信息,最后 B 知道 A 收信息没问题、自己发的也没问题,才开始正式交往):

      • A — 交否 —> B
      • A <— 交吧 — B
      • A —好的嘞—> B
      • 开始数据的传输
    • 建立连接的 “ 连接 ”:客户端和服务端保存的关于对方的信息,如 ip 地址、端口号等,存放在 TCP 头部

    • 四次挥手(因为 A 单方面提出后,B 可能正在筹钱过程中,作为舔狗的觉悟,他虽然收到了离的要求,但钱还是要筹完给渣女):

      • A —你个舔狗,咱离吧—> B
      • A <—离就离,但我还没给你筹完钱— B // 回复确认报文
      • A <—筹好了,钱给你,再见吧— B // 此时 B 才备完、传发完数据
      • A —再见—> B
      • 两人正式形同陌路
    • 终止时,第四次挥手 A 端经过 2MSL ( 最长报文段寿命两倍时长 ) 后才释放 TCP 连接,而 B 是收到后立马释放,所以 B 比 A 结束连接的事件要早一些

five

  • OSI 七层 ( 虽详细,但复杂不实用 )
    • 应用层
    • 表示层
    • 会话层
    • 运输层
    • 网络层
    • 数据链路层
    • 物理层
  • 五层协议结构 ( 介绍网络原理而设计的 )
    • 应用层 —— HTTP 等应用层协议
    • 运输层 —— TCP、UDP
    • 网络层 —— IP
    • 数据链路层
    • 物理层
  • TCP / IP 协议 ( 实际应用的 )
    • 应用层 —— HTTP 等应用层协议
      • 我们平时接触到的
    • 运输层 —— TCP、UDP
      • 为应用层提供网络支持
    • 网络层 —— IP
      • 数据实际传输
      • IP 地址 32 bit 位,为分四段 ( 每段 8 位 )
      • 一个个匹配不科学:借用子网掩码将 IP 地址分为网络号和主机号
      • 网络号 ( 标识是属于哪个子网的 ):IP 地址按位与子网掩码
      • 主机号 ( 标识同一子网下的不同主机 ):IP 地址按位与子网掩码取反
    • 网络接口层
      • 单凭 IP 在以太网走不通,所以需要在这里加上 MAC 头,封装成数据帧,在以太网、WiFi 这样的底层网络上发送原始数据包

six ( 127-136 )

  • 说明 Java 内存分配
    • 主要是五个:堆、栈、寄存器、静态域、常量池
      1. 寄存器:我们无法控制,最快的
      2. 栈:基本类型的变量和对象的引用变量 ( 堆内存空间的访问地址 ),速度快 ( 仅次于寄存器 ),可以共享
      3. 堆:存放 new 创建的对象和数组,由 java 虚拟机自动垃圾回收器管理,存取速度慢
      4. 静态域:static 定义的静态成员 ( 永远不会置入 Java 对象 )
      5. 常量池:编译时被确定并保存在 .class 文件中的 final 常量值、string 和一些文本修饰的符号引用 ( 因为永不改变,所以严格保护 )
    • 内存分配发生在什么时候
      1. 对象的创建
      2. 数组的创建
      3. 方法的调用 ( 在方法调用时,会为方法的局部变量分配内存空间。当方法被调用时,会在栈中创建一个新的栈帧,其中包含了方法的局部变量和操作数栈。方法执行完毕后,栈帧会被销毁,释放相关的内存 )
      4. 自动装箱、拆箱
      5. 字符串的创建
  • Java 堆的结构是什么样子的
    • JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在 JVM 启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收
    • 堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象 ( 如新生代中的死亡对象就会被较快回收 )。⼀直到垃圾收集器把这些对象回收掉之前,他们会⼀直占据堆内存空间
    • 新生代 — 对象的生命周期较短,垃圾回收频繁 ( 经过多次回收后仍然存活的对象最终会被晋升到老年代 )
    • 永久代 — Java 8 及以后的版本中已经被元空间所取代 ( 脱离了堆 ),存储类的元数据信息 ( 元数据就是描述数据的数据,也可以理解为数据的附加信息或属性,如:数据库元数据就是表、列、索引等 )
    • 老年代 — 存储经过多次垃圾回收后仍然存活的对象 ( 存活的时间较长,所以内存空间相对较大 )
  • GC 是什么,为什么要有 GC
    • 垃圾收集的意思 ( Gabage Collection )
    • 内存处理是编程⼈员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象,是否超过作用域从而达到自动回收内存的目的,Java 语⾔没有提供释放已分配内存的显示操作方法
  • Java 中会存在内存泄漏吗,请简单描述
    • 会,内存泄漏指的是程序中分配的内存资源没有被正确释放,导致这些资源永远无法被回收,程序不再使用却一直占据在内存中
    • 常见的内存泄漏:
      • 对象引用未被释放:一个对象被分配了内存,但之后不再被程序使用,而对该对象的引用没有被释放,那么垃圾回收器无法识别这个对象为垃圾,从而无法回收它占用的内存
      • 集合类未正确管理:没有正确地管理元素的添加和删除,就可能导致集合中的对象无法被垃圾回收,即使它们不再需要
      • 资源未释放:如文件句柄、数据库连接、网络连接等,需要手动关闭和释放却忘记关闭了
      • 循环引用:两个或多个对象之间存在循环引用,即彼此持有对方的引用,那么它们将无法被垃圾回收,即使它们不再被程序使用
    • 内存泄漏可能会导致程序的内存占用逐渐增加,最终导致应用程序变得非常缓慢或崩溃。为了避免内存泄漏,程序员应该定期检查代码 ( 用一些工具技术 ),确保不再需要的对象和资源被正确释放,所以仍然需要程序员负责管理一些资源和对象的生命周期
  • System.gc() 和 Runtime.gc() 会做什么事情
    • 提示 JVM 要进⾏垃圾回收。但是,⽴即开始还是延迟进行垃圾回收是取决于 JVM
  • 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存
    • 不会,但在下⼀个垃圾回收周期中,这个对象将是可被回收的
    • jvm 自带的,无法手动干预
    • 垃圾回收机制的原理,周期
  • 什么是类加载器,类加载器有哪些
    • 启动类加载器:用来加载 java 核心类库,⽆法被 java 程序直接引用
    • 扩展类加载器:用来加载 Java 的扩展库。Java 虚拟机的实现会
      提供⼀个扩展库⽬录。该类加载器在此⽬录⾥⾯查找并加载 Java 类
    • 系统类加载器:它根据 Java 应用的类路径 ( classpath ) 来加载 Java 类。⼀般来说,Java 应用的类都是由它来完成加载的
    • 用户自定义类加载器,通过继承 java.lang.ClassLoader 类的方式实现
  • 类加载器双亲委派模型机制
    • 当⼀个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载