17.整理华为面经--2

微服务的优缺点

优点:

  • 微服务是松耦合的,无论是开发阶段还是部署阶段都是独立的
  • 局部修改容易,一个服务出现问题不会影响整个应用,而且多个相同的微服务可以进行负载均衡,提高性能和可靠性
  • 每个服务都很小,足够内聚,代码容易理解,团队更容易关注自己的工作成功,聚焦指定的业务功能或业务需求

缺点:

  • 微服务架构带来了过多的运维操作,需要团队具备一定的DevOps技巧
  • 分布式系统比起单体应用来说更加复杂且难以管理,因为分布部署跟踪问题难

redis的作用,缓存击穿,雪崩,穿透?

  • String类型用来做数据的缓存,分担数据库的压力
  • 由于其性能高的特点,一些数据量少,但是读写频繁的数据也可以不用mysql而使用redis来存储,比如购物车使用hash数据结构进行存储.
  • 分布式锁(redisson),对关键数据进行修改的时候加锁
  • 数据类型list可以做简单的消息队列功能
  • 数据类型set可以做共同关注功能,也可做全局去重
  • 数据类型zset可以做范围查找,排行榜应用,热度排序

缓存穿透:缓存和数据库中都没有的数据,而用户不断发起请求,该攻击会导致数据库压力过大

  • 接口层增加校验,对离谱的数据比如id<0的直接拦截
  • 从缓存取不到的数据,在数据库也没有取到,这是可以将key-value写成key-null,缓存有效时间可以设置短一些,这样就可以防止用户短时间内用同一个id暴力攻击

缓存击穿:缓存中有但是数据库没有的数据,突然这个数据过期了,这时候由于并发用户特别多,同时读缓存没读到数据,然后同时去数据库取数据引起的数据库压力瞬间增大

  • 设置热点数据永不过期
  • 加互斥锁,不让用户大量涌入数据库,在用户去数据库取数据的时候上锁,让别的线程等待固定时间后,让他们去redis中获取数据

缓存雪崩:一瞬间大量的数据到达过期时间,而且查询数据量巨大,引起数据库压力过大甚至宕机

  • 缓存数据过期时间设置随机,防止同一时间大量数据过期现象发生
  • 如果缓存数据库是分布式部署的,将热点数据均匀的分布在不同的缓存数据库中
  • 设置热点数据永不过期

线程和进程说一说

  • 进程是资源分配的最小单位,线程是程序执行(资源调度)的最小单位
  • 进程拥有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段等,这种操作非常昂贵,线程共享进程中的数据,使用相同的地址空间,因此cpu切换一个线程的花费要比进程小很多,同时创建一个线程的开销也小很多
  • 线程之间的通信更方便,同一进程下的线程共享全局变量,静态变量等数据
  • 多进程程序更加健硕,死掉一个进程不会对别的进程产生影响,但是多线程程序死掉一个线程整个进程就死掉了
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,且至少有一个线程,资源分配给进程,同一进程里的所有线程共享该进程的所有资源(代码,常量,全局变量,静态变量,堆存储),但是每个线程又拥有自己的栈段,又叫运行时段,用来存放所有的局部变量和临时变量,线程在执行过程中需要协作同步,不同的进程的线程则需要通过消息通信才能实现同步

守护线程和非守护线程说一说

守护线程--GC线程

非守护线程--用户线程

如果用户线程已经全部退出了,只剩下守护线程存在的话,虚拟机也就直接退出了,将线程转化成守护线程key使用Thread对象的setDaemon(true)来实现,该设置必须在start之前,也就是我们不能把正在运行的常规线程设置为守护线程.如果Daemon中产生了新的线程,那么它也是Daemon的,守护线程不能去访问固有资源,因为它会在任何时候被中断

你知道哪些设计原则

单一职责原则

接口隔离原则(实现类不应该实现它不需要的接口)

依赖倒转原则(面向接口编程,高层模块不应该依赖于底层模块,两者都应该依赖于其抽象)

里氏替换原则(子类可以扩展父类的功能,但不能改变父类原有的功能,尽量从抽象类继承,而不是从具体类继承)

开闭原则(对扩展开放,对修改关闭)

迪米特法则(一个类对自己依赖的类知道的越少越好,内部逻辑封装在内部,只对外提供接口.只与直接的朋友通信--在类中的成员属性,方法参数,方法返回值出现的其他类为直接的朋友,陌生的类不要以局部变量的形式出现在类的内部)

合成复用原则(不使用继承而是使用合成和聚合)

java中如何定位问题?CPU高和内存高怎么排查?

 CPU高/内存高过程类似

  • 先用top命令找出CPU占比最高的进程号
  • ps -ef或者jps -l进一步定位(其实和第一步的操作类似)
  • 定位到具体的线程ps -mp 进程号 -o THREAD,tid,time(-m表示显示所有线程 -p表示pid进程使用cpu的时间 -o参数后是用户的自定义格式)
  • 找到线程具体的编号后printf "%x\n" 线程ID将需要的线程ID转换为16进制的线程格式
  • jstack 进程ID|grep tid(线程ID,16进制,字母小写) -A60(打印出前60行)查看错误内容

jdk自带的工具你知道哪些

  • jconsole:可以图表化显示各种数据,可以远程连接监视远程服务器的虚拟机 输入命令jconsole 进程号就可以使用
  • jvisualvm:和jconsole类似,界面更美观一些
  • jinfo 可以输出并且修改运行时java的opts:查看2788的MaxPerm:jinfo -flag MaxPermSize 2788
  • jstat 监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计
  • jps 用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。
  • jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息

java常用的数据结构有哪些?

数组,链表,栈,队列,哈希表,树,图

Collection接口--List,Queue/Deque,Set

Map接口:HashMap,Hashtable,TreeMap,ConcurrentHashMap

JVM聊一聊?

链接1  链接2的第二题 链接三

你可能感兴趣的:(Java面试,华为,运维)