计算机基础知识复习8.14

发布于:2024-08-16 ⋅ 阅读:(60) ⋅ 点赞:(0)

子线程抛异常主线程能否catch

在不做任何处理的情况下,主线程不能catch

解决方式:

子线程使用try catch来捕获异常

为线程设置未捕获异常处理器UncaughtExceptionHandler

通过future的get方法捕获异常

JVM相关参数

显示指定堆内存-Xms和-Xmx指定最小堆和最大堆

显示指定新生代内存 -XX:NewSize,-XX:MaxNewSize指定新生代最小内存和最大内存

显示指定元空间大小-XX:MetaspaceSize=N 设置Metaspace的初始大小,-XX:MaxMetaspaceSize=N设置Metaspace的最大大小

显示指定垃圾回收算法 -XX:+UserG1GC/-XX:+UserConcMarkSweepGC

记录GC日志记录:-XX:+PrintGCDetails打印基本GC信息

TreeMap和HashMap的区别

TreeMap实现了NavigableMap和SortedMap接口,相比于HashMap多了对集合中的元素根据键排序的能力以及对集合内元素的搜索能力

Bean是线程安全的吗

spring框架的bean是否线程安全,取决于其作用域和状态,常见作用域分为prototype和singleton,几乎所有场景都用singleton

prototype作用域下,每次获取都会创建一个新的bean实例,不存在资源竞争问题,不存在线程安全问题,对于singleton,IOC容器只有唯一的bean实例,可能存在资源竞争,如果bean有状态的话,就存在线程安全问题,对于有状态单例bean的线程安全问题,可以在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中

JVM内存结构

程序计数器 Java虚拟机栈 本地方法栈 堆区 方法区

程序计数器:是一块很小的内存空间,是线程私有的,是当前线程正在执行的那条字节码指令的地址。他的作用是在多线程环境下,程序计数器记录当前线程执行的位置,从而当线程切换回来时,就知道上次线程执行到哪了

Java虚拟机栈会为每一个即将运行的java方法创建一块叫做栈帧的区域,用于存放该方法运行过程中的一些信息:局部变量表,操作数栈,动态链接,方法出口信息

本地方法栈是为了JVM运行Native方法准备的空间,很多native方法都是用c语言实现的

堆区:存放对象的内存空间,线程共享,所有线程都访问同一个堆

Fail-Fast机制

fail-fast机制是一种快速失败的策略,用于在集合迭代期间检测到其他线程对集合的结构进行修改,当fail-fast机制检测到并发修改时,会立即抛出concurrentModificationException异常,防止迭代继续执行,这样可以避免在不确定状态下进行迭代,保持数据的一致性。

Fail-fast机制通过在ArrayList内部维护一个modCount变量来实现,modCount记录了对ArrayList的结构进行修改的次数,在每次迭代开始时,会将modCount的值保存在一个局部变量expectedModCount中,然后在迭代过程,会再次检查modCount和expectedModCount是否相等,如果不相等,就说明有其他线程对ArrayList进行了修改,就会立即抛出ConcurrentModificationException异常

ArrayList相关

ArrayList初始化数组默认长度为10

ArrayList扩容为原来的1.5倍,扩容后是用新的数组,不是线程安全的

Java空对象引用占用内存吗

需要占用4或者8字节(取决于他是32位还是64位操作系统)

Linux查看端口的命令

lsof -i:端口号

netstat -tunlp |grep 端口号

TCP和UDP可以同时绑定相同的端口吗

在数据链路层中,通过mac地址来寻找局域网的主机,在网络层中,通过ip地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口来寻址,来识别同一计算机中同时通信的不同应用程序。所以,在传输层的端口号的作用,是为了区分同一主机上不同应用程序的数据包。传输层有两个传输协议分别是TCP和UDP,在内核中是两个完全独立的软件模块。当主机收到数据包后,可以在IP包头的协议号字段知道包是TCP/UDP,所以可以根据这个信息确定送给哪个模块处理,送给TCP/UDP模块的报文根据端口号确定送给哪个应用程序处理

TCP如何保证传输的可靠性

TCP实现可靠传输的方式, 可以通过序列号与确认应答。在TCP中,当发送端的数据到达接受主机时,接收端主机会返回一个确认应答消息,表示已收到消息

使用滑动窗口来告诉发送端自己还有多少缓冲区可以接受数据,于是发送端就可以根据接收端的处理能力来发送数据,而不会导致接受端处理不过来

引入拥塞控制,即只要发送方没有在规定时间内接受到ACK应答报文,也就发生了超时重传,就会认为网络出现了拥塞。只有在网络中没有出现拥塞时,拥塞窗口就会增大,网络中出现了拥塞,拥塞窗口就会减少

引入流量控制,控制发送方的发送速率不要太快,利用滑动窗口就可以实现发送方的流量控制

参考资料:
Java 面试指南 | JavaGuide

小林coding