操作数栈、FullGC、防火墙交换机路由器


运行时数据区域

image-20220321144459548

程序计数器

当前线程锁执行的字节码的行号指示器。不会oom。每个线程有一个独立的程序计数器,因为JVM的多线程会轮流切换、分配处理器执行时间,需要在线程切换后恢复到正确的位置。

虚拟机栈

线程私有,每个方法被执行时,都会同步创建一个栈帧。虚拟机栈中有局部变量表,存放了编译期可知的JVM基本类型数据,对象引用和returnAddress(执行了一条字节码指令的地址,方法正常退出或异常退出的定义)。

可能出现两种异常:

  • 栈深度大于虚拟机允许的深度:StackOverflow
  • 如果虚拟机栈容量可以动态扩展,扩展时若无法申请到足够的内存会抛出OutOfMemoryError异常

image-20220321145622314

操作数栈

java虚拟机栈中的一个用于计算的临时数据存储区。

原来那个美团的面试官想问的是这个。

具体:操作数栈(Operand Stack),图也太糊了。

image-20220321151116325

bipush 15:将15放入操作数栈

istore_1:弹操作数栈放入局部变量表

image-20220321151206349

bipush 8:将8放入操作数栈

istore_2:弹操作数栈放入局部变量表

image-20220321151337461

iload_1:从局部变量表索引位置读取数据

iload_2

image-20220321151428837

iadd

isotre_3

image-20220321151601382

在操作数栈里相加,然后弹栈放入局部变量表。

FullGC

如果机器CPU负载过高,或者系统处理请求慢,要考虑到可能是FullGC的问题。

常见原因

FullGC触发条件是老年代空间不足,也就是大量对象频繁进入老年代,并且老年代空间释放不掉。

  • 系统并发高,执行时间过长,yong gc频繁,gc后存活对象太多,survivor放不下就进入老年代,老年代迅速堆满。
  • 一次性加载过多对象到内存。
  • 内存溢出,老年代有大量释放不掉的对象。
  • 元数据区加载了太多类,也会fullGC
  • 堆外内存使用不当
  • 手动system.gc()

定位思路

如果有监控,通过图形监控,没有就gc日志。

  • 观察年轻代gc的情况,多久执行一次,gc后存活多少,survivor多大。调整内存分配比例。
  • 观察老年代内存情况,多久执行一次,耗时多少,回收多少内存。如果fullgc后效果不好,可能是内存溢出,要dump排查。
  • 元空间可能加载了太多东西。
  • 根据代码管理工具查找最近修改的代码。

网络知识

image-20220321164136133

防火墙

一种安全设备,通常部署在网络边界,保护一个网络区域免受另一个网络区域的攻击。

有软件防火墙和硬件防火墙之分。

早期网络用的是第一种,因为以前广域网协议五花八门,防火墙有的不支持,只能最外层接路由器。只要在出口部署NAT,路由器以下都可以用私网IP。

NAT实现方法之一:端口

image-20220321170107892

缺点例如:不能公网访问内部网络服务;一些程序是A口发,B口收的。。

交换机

用于光电信号转发的网络设备,通常工作在数据链路层或网络层。交换机可以为网络上所有的设备提供一个中心连接点。

image-20220321163035556

  • 当交换机从某个端口收到一个数据包时,会先读取包头里面的源MAC地址,将MAC地址和端口对应起来添加到交换机内存里的MAC地址表。
  • 再读取包头中的目的MAC地址,对照和哪个端口对应,如果有,直接把数据包复制到对应的端口上,如果没有,将这个数据帧作为广播帧发送到所有端口,对应的MAC地址会自动接收这个数据帧。
  • 同时,交换机也会将接收这个数据帧的端口和MAC地址对应起来记录到地址表里。

路由器

接入互联网。

路由器用于连接多个逻辑上分开的网络(一个单独的网络或者一个再往)。当数据从一个子网传输到另一个子网,通过路由器完成。路由器判断网络地址和选择最佳传输路径。

image-20220321163703283

路由器会检查数据包的源IP地址和目的IP地址,在IP路由表里查找数据包的目的地,将数据包路由到另一个路由器或者交换机上,知道到达目的IP。