操作数栈、FullGC、防火墙交换机路由器
运行时数据区域
程序计数器
当前线程锁执行的字节码的行号指示器。不会oom。每个线程有一个独立的程序计数器,因为JVM的多线程会轮流切换、分配处理器执行时间,需要在线程切换后恢复到正确的位置。
虚拟机栈
线程私有,每个方法被执行时,都会同步创建一个栈帧。虚拟机栈中有局部变量表,存放了编译期可知的JVM基本类型数据,对象引用和returnAddress(执行了一条字节码指令的地址,方法正常退出或异常退出的定义)。
可能出现两种异常:
- 栈深度大于虚拟机允许的深度:StackOverflow
- 如果虚拟机栈容量可以动态扩展,扩展时若无法申请到足够的内存会抛出OutOfMemoryError异常
操作数栈
java虚拟机栈中的一个用于计算的临时数据存储区。
原来那个美团的面试官想问的是这个。
具体:操作数栈(Operand Stack),图也太糊了。
bipush 15:将15放入操作数栈
istore_1:弹操作数栈放入局部变量表
bipush 8:将8放入操作数栈
istore_2:弹操作数栈放入局部变量表
iload_1:从局部变量表索引位置读取数据
iload_2
iadd
isotre_3
在操作数栈里相加,然后弹栈放入局部变量表。
FullGC
如果机器CPU负载过高,或者系统处理请求慢,要考虑到可能是FullGC的问题。
常见原因
FullGC触发条件是老年代空间不足,也就是大量对象频繁进入老年代,并且老年代空间释放不掉。
- 系统并发高,执行时间过长,yong gc频繁,gc后存活对象太多,survivor放不下就进入老年代,老年代迅速堆满。
- 一次性加载过多对象到内存。
- 内存溢出,老年代有大量释放不掉的对象。
- 元数据区加载了太多类,也会fullGC
- 堆外内存使用不当
- 手动system.gc()
定位思路
如果有监控,通过图形监控,没有就gc日志。
- 观察年轻代gc的情况,多久执行一次,gc后存活多少,survivor多大。调整内存分配比例。
- 观察老年代内存情况,多久执行一次,耗时多少,回收多少内存。如果fullgc后效果不好,可能是内存溢出,要dump排查。
- 元空间可能加载了太多东西。
- 根据代码管理工具查找最近修改的代码。
网络知识
防火墙
一种安全设备,通常部署在网络边界,保护一个网络区域免受另一个网络区域的攻击。
有软件防火墙和硬件防火墙之分。
早期网络用的是第一种,因为以前广域网协议五花八门,防火墙有的不支持,只能最外层接路由器。只要在出口部署NAT,路由器以下都可以用私网IP。
NAT实现方法之一:端口
缺点例如:不能公网访问内部网络服务;一些程序是A口发,B口收的。。
交换机
用于光电信号转发的网络设备,通常工作在数据链路层或网络层。交换机可以为网络上所有的设备提供一个中心连接点。
- 当交换机从某个端口收到一个数据包时,会先读取包头里面的源MAC地址,将MAC地址和端口对应起来添加到交换机内存里的MAC地址表。
- 再读取包头中的目的MAC地址,对照和哪个端口对应,如果有,直接把数据包复制到对应的端口上,如果没有,将这个数据帧作为广播帧发送到所有端口,对应的MAC地址会自动接收这个数据帧。
- 同时,交换机也会将接收这个数据帧的端口和MAC地址对应起来记录到地址表里。
路由器
接入互联网。
路由器用于连接多个逻辑上分开的网络(一个单独的网络或者一个再往)。当数据从一个子网传输到另一个子网,通过路由器完成。路由器判断网络地址和选择最佳传输路径。
路由器会检查数据包的源IP地址和目的IP地址,在IP路由表里查找数据包的目的地,将数据包路由到另一个路由器或者交换机上,知道到达目的IP。