1.1 jar包和war包的区别

jar文件格式以zip文件格式为基础,不仅用于压缩和发布。而且用于封装库、插件和组件,并可被像编译器和 JVM 这样的工具直接使用。
简单来说,jar包就是别人已经写好的一些类,然后对这些类进行打包。可以将这些jar包引入到你的项目中,可以直接使用这些jar包中的类和属性,这些jar包一般放在lib目录下。
war是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。

1.2 一个tomcat部署多个war

  1. 一个tomcat中部署的多个app,虽然同处一个JVM里,但是由于无法相互调用,所以也可以认为是分布式的。<br />即使启动多个应用,也是跑在同一个进程里。

1.3 不能互相调用是因为被类加载器隔离开的。


Tomcat 的类加载器层次是:
Bootstrap
|
System
|
Common
/
Webapp1 Webapp2 …
每个应用的中的类分别是由Webapp1、Webapp2类加载器加载的,所以是相互不可见的。

类加载器的规则有三
1. 一致性规则:类加载器不能多次加载同一个类
2. 委托规则:在加载一个类之前,类加载器总参考父类加载器
3. 可见性规则:类只能看到由其类加载器的委托加载的其他类,委托是类的加载器及其所有父类加载器的递归集

2.1 强软弱虚

  1. 强引用:强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
  2. 软引用:软引用用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了SoftReference类来实现软引用。
  3. 弱引用:弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2之后,提供了WeakReference类来实现弱引用。
  4. 虚引用:虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2之后,提供了PhantomReference类来实现虚引用。

创建
SoftReference> softReference = new SoftReference>(new HashMap());
使用
Map map = softReference.get();
if (map == null) {
softReference = new SoftReference>(
map = new HashMap());

  1. if (map == null) {
  2. softReference = new SoftReference<Map<String, String>>(
  3. map = new HashMap<String, String>());

都可以跟队列联合使用,在被清除之前把引用加入到队列中,这样程序员就能通过队列判断该对象是否被删。

3.1怎么dump分析?

4.1 web应用使用多线程和不适用多线程的区别?

5.1 cgroup

cgoup subsystem和css_set
https://blog.csdn.net/readlnh/article/details/89003192
https://blog.csdn.net/wudongxu/article/details/8486859
https://zhuanlan.zhihu.com/p/102372680
https://www.cnblogs.com/menkeyi/p/10941843.html
内核oomkillerhttps://segmentfault.com/a/1190000008125359
租户是一个cgroup 那么线程是否是一个进程呢? 有pid, task包含pid,也就是线程当成进程来处理。

java线程的底层linux实现https://blog.csdn.net/u013568373/article/details/93474642

6.1 serverless

微服务之容器化和无状态化
无状态 -> 容器化 -> 微服务化 (其中包含数据库的水平扩展)参考
经典rpc dubbo链接
多机房 链接 单元化链接 逻辑机房链接

7.1 杂

rpc是基于netty框架的通行方式
netty是一个java通信框架
认识netty:https://www.jianshu.com/p/b9f3f6a16911
spihttps://zhuanlan.zhihu.com/p/28909673

AIG 是某个应用为了支撑某些业务而隔离出来一组资源,且这组资源对应的应用基线允许部分个性化。AIG 作为服务器的标签,会打在 POD 的 Lable 上。

jmaphttps://cloud.tencent.com/developer/article/1452072

lambda表达式:http://blog.oneapm.com/apm-tech/226.html

qps、tps: https://blog.csdn.net/qq_39416311/article/details/84892625

自适应限流(类比tcp拥塞控制)

drm需求https://yuque.antfin.com/eo9mcp/odso4r/ne6cbh

线程池和线程工厂https://blog.csdn.net/xiaojiahao_kevin/article/details/51735518

3、soa理解(soa不常用容器相对于微服务) zookeeper(选举算法、分布式锁)
soa的发展 与微服务的区别:https://www.zhihu.com/question/42061683
把业务代码封装成可复用的模块部署到服务器上,与微服务框架的区别就是 缺乏服务治理。
soap风格,rpc风格,rest风格

4、正向代理代理的对象是客户端,反向代理代理的对象是服务端
正向代理隐藏真实客户端,反向代理隐藏真实服务端
nginx 反向代理,upstream 负载均衡

classloader类加载:https://blog.csdn.net/briblue/article/details/54973413
首先父加载器 != 父类
loadclass的业务逻辑:findloadedclass -》 调父加载器loadclass -》父类不行就findclass
findclass的逻辑:踏实工作 通过file类、outstream、ByteArrayinputStream类来加载类
自定义重写findclass
如果要打破的话还要重写loadclass 通过systemclassload

sofa boot 每个模块的功能,jvm服务 和 rpc不同应用之间的服务

hystrix熔断降级 — 线程池 原理

osgi java动态化模块系统 https://zhuanlan.zhihu.com/p/28634229
推荐使用log日志输出调试信息而不要使用System.out.println()方法,主要是因为println()使用了同步锁,会影响程序的并发性能和系统的吞吐量。
slf4j api初始化方法 用classloader加载其他包的StaticLoggerBinder,然后新建loggerfactory和ogger
搞懂classloader.getSystemResources的实现方法https://blog.csdn.net/zhangshk_/article/details/82704010

spring getSingloton https://blog.csdn.net/lqleo323/article/details/50561670

dubbo https://www.cnblogs.com/lfs2640666960/p/12293029.html

spring切面编程https://www.cnblogs.com/joy99/p/10941543.html
java 动态代理 https://blog.csdn.net/yaomingyang/article/details/80981004
https://blog.csdn.net/albenxie/article/details/72783301