客户端的优势就是竞争相比后端小一些,如果有同学感觉投大厂后端没什么机会,对后端也不是太固执的话,也一直期望在互联网公司发展的话,其实投大厂客户端开发也是一个曲线进大厂的方式,只要进大厂,客户端开发薪资也是能达到 35w-45w,还是很香的。
字节客户端(一面通过)
1. 协程是什么?有什么好处?
协程是一种用户态的轻量级线程,其调度完全由用户程序控制,而不需要内核的参与。协程拥有自己的寄存器上下文和栈,但与其他协程共享堆内存。
协程的优势:
-
极高的性能:协程的切换开销非常小,因为只需要保存和恢复协程的上下文,而无需进行内核级的上下文切换,能够轻松创建数十万个协程,极大地提升了并发处理能力。
-
避免线程开销:无需进行线程创建、销毁和上下文切换,降低了系统资源的消耗,单个线程可运行多个协程,特别适合 I/O 密集型任务。
-
简化异步编程:协程使用同步的编码方式来实现异步操作,使代码更易于理解和维护,以顺序的方式编写异步代码,避免了回调地狱的问题。
对比项 | 协程 | 线程 |
---|---|---|
调度方式 | 协作式(由程序自身控制) |
抢占式(由操作系统控制) |
上下文切换开销 | 极低(用户空间) |
较高(内核空间) |
内存占用 | 很小(通常为 KB 级别) |
较大(通常为 MB 级别) |
并发数量 | 可达到数万至数百万 |
通常为数百至数千 |
数据共享 | 共享同一线程内的变量 |
需要通过同步机制共享 |
2. jvm内存模型介绍一下
根据 JDK 8 规范,JVM 运行时内存共分为虚拟机栈、堆、元空间、程序计数器、本地方法栈五个部分。还有一部分内存叫直接内存,属于操作系统的本地内存,也是可以直接操作的。
JVM的内存结构主要分为以下几个部分:
-
程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法,计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域,生命周期与线程相同。
-
Java 虚拟机栈:每个线程都有自己独立的 Java 虚拟机栈,生命周期与线程相同。每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。可能会抛出 StackOverflowError 和 OutOfMemoryError 异常。
-
本地方法栈:与 Java 虚拟机栈类似,主要为虚拟机使用到的 Native 方法服务,在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。本地方法执行时也会创建栈帧,同样可能出现 StackOverflowError 和 OutOfMemoryError 两种错误。
-
Java 堆:是 JVM 中最大的一块内存区域,被所有线程共享,在虚拟机启动时创建,用于存放对象实例。从内存回收角度,堆被划分为新生代和老年代,新生代又分为 Eden 区和两个 Survivor 区(From Survivor 和 To Survivor)。如果在堆中没有内存完成实例分配,并且堆也无法扩展时会抛出 OutOfMemoryError 异常。
-
方法区(元空间):在 JDK 1.8 及以后的版本中,方法区被元空间取代,使用本地内存。用于存储已被虚拟机加载的类信息、常量、静态变量等数据。虽然方法区被描述为堆的逻辑部分,但有 “非堆” 的别名。方法区可以选择不实现垃圾收集,内存不足时会抛出 OutOfMemoryError 异常。
-
运行时常量池:是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,具有动态性,运行时也可将新的常量放入池中。当无法申请到足够内存时,会抛出 OutOfMemoryError 异常。
-
直接内存:不属于 JVM 运行时数据区的一部分,通过 NIO 类引入,是一种堆外内存,可以显著提高 I/O 性能。直接内存的使用受到本机总内存的限制,若分配不当,可能导致 OutOfMemoryError 异常。
3. java的 4 个引用有什么区别?
引用类型主要分为强软弱虚四种:
-
强引用指的就是代码中普遍存在的赋值方式,比如A a = new A()这种。强引用关联的对象,永远不会被GC回收。
-
软引用可以用SoftReference来描述,指的是那些有用但是不是必须要的对象。系统在发生内存溢出前会对这类引用的对象进行回收。
-
弱引用可以用WeakReference来描述,他的强度比软引用更低一点,弱引用的对象下一次GC的时候一定会被回收,而不管内存是否足够。
-
虚引用也被称作幻影引用,是最弱的引用关系,可以用PhantomReference来描述,他必须和ReferenceQueue一起使用,同样的当发生GC的时候,虚引用也会被回收。可以用虚引用来管理堆外内存。