Skip to content

Commit e53b63d

Browse files
committed
Java基础 + GA
1 parent eeb99f8 commit e53b63d

File tree

8 files changed

+16
-46
lines changed

8 files changed

+16
-46
lines changed

MD/Java基础-JVM原理.md

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,11 @@ JVM在内存新生代Eden Space中开辟了一小块线程私有的区域TLAB(
5555
5. 初始化(执行类构造器、类变量赋值、静态语句块)
5656

5757
#### 类加载器
58-
启动类加载器:是虚拟机自身的一部分,它负责将 <JAVA_HOME>/lib路径下的核心类库
59-
扩展类加载器:它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用标准扩展类加载器
60-
系统类加载器:它负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库
58+
启动类加载器:用C++语言实现,是虚拟机自身的一部分,它负责将 <JAVA_HOME>/lib路径下的核心类库,无法被Java程序直接引用
59+
扩展类加载器:用Java语言实现,它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用
60+
系统类加载器:用Java语言实现,它负责加载系统类路径ClassPath指定路径下的类库,开发者可以直接使用
6161

62+
#### 双亲委派
6263
定义:如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是**双亲委派模式**
6364

6465
优点:采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次防止恶意覆盖Java核心API。
@@ -70,7 +71,7 @@ JVM在内存新生代Eden Space中开辟了一小块线程私有的区域TLAB(
7071
3. 为了实现代码热替换,OSGi是为了实现自己的类加载逻辑,用平级查找的逻辑替换掉了向下传递的逻辑。但其实可以不破坏双亲委派逻辑而是自定义类加载器来达到代码热替换。比如[这篇文章](https://www.cnblogs.com/pfxiong/p/4070462.html)
7172

7273
### 内存分配(堆上的内存分配)
73-
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/j2.jpg)
74+
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/堆的内存分配.png)
7475
#### 新生代
7576
##### 进入条件
7677
优先选择在新生代的Eden区被分配。
@@ -106,36 +107,6 @@ GC Roots包括:虚拟机栈中引用的对象、方法区中类静态属性引
106107
2. 老年代空间不足(通过Minor GC后进入老年代的大小大于老年代的可用内存)
107108
3. 方法区空间不足
108109

109-
## [Java内存模型](https://mp.weixin.qq.com/s/ME_rVwhstQ7FGLPVcfpugQ)
110-
定义:JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性
111-
112-
实现:volatile、synchronized、final、concurrent包等。其实这些就是Java内存模型封装了底层的实现后提供给程序员使用的一些关键字
113-
114-
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/j12.jpg)
115-
116-
主内存:所有变量都保存在主内存中
117-
工作内存:每个线程的独立内存,保存了该线程使用到的变量的主内存副本拷贝,线程对变量的操作必须在工作内存中进行
118-
119-
每个线程都有自己的本地内存共享副本,如果A线程要更新主内存还要让B线程获取更新后的变量,那么需要:
120-
121-
1. 将本地内存A中更新共享变量
122-
2. 将更新的共享变量刷新到主内存中
123-
3. 线程B从主内存更新最新的共享变量
124-
125-
## [happens-before](https://www.cnblogs.com/chenssy/p/6393321.html)
126-
我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见,但是我们可以指定某些规则,这规则就是happens-before。特别关注在多线程之间的内存可见性。
127-
128-
它是判断数据是否存在竞争、线程是否安全的主要依据,依靠这个原则,我们解决在并发环境下两操作之间是否可能存在冲突的所有问题。
129-
130-
1. 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;
131-
2. 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作;
132-
3. volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
133-
4. 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;
134-
5. 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;
135-
6. 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
136-
7. 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
137-
8. 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;
138-
139110
## 垃圾收集器
140111
### 串行收集器
141112
串行收集器Serial是最古老的收集器,只使用一个线程去回收,可能会产生较长的停顿
@@ -175,6 +146,5 @@ STW总会发生,不管是新生代还是老年代,比如CMS在初始标记
175146

176147
那么为什么一定要STW?因为在定位堆中的对象时JVM会记录下对所有对象的引用,如果在定位对象过程中,有新的对象被分配或者刚记录下的对象突然变得无法访问,就会导致一些问题,比如部分对象无法被回收,更严重的是如果GC期间分配的一个GC Root对象引用了准备被回收的对象,那么该对象就会被错误地回收。
177148

178-
## JVM调优
179-
http://www.wangtianyi.top/blog/2018/07/25/jvmdiao-you-ru-men-(yi-):ji-chu-zhi-shi/
180-
http://www.wangtianyi.top/blog/2018/07/27/jvmdiao-you-ru-men-(er-):shi-zhan-diao-you-parallelshou-ji-qi/
149+
## [JVM调优](http://www.wangtianyi.top/blog/2018/07/27/jvmdiao-you-ru-men-(er-):shi-zhan-diao-you-parallelshou-ji-qi/?utm_source=github&utm_medium=github)
150+

MD/Java基础-多线程.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,5 @@ new Thread弊端:
100100
* 有界队列。当使用有限的 maximumPoolSizes 时,有界队列(如ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
101101

102102
### 并发包工具类
103-
[http://www.wangtianyi.top/blog/2018/05/01/javagao-bing-fa-xi-lie-si-:juc/](http://www.wangtianyi.top/blog/2018/05/01/javagao-bing-fa-xi-lie-si-:juc/)
103+
[http://www.wangtianyi.top/blog/2018/05/01/javagao-bing-fa-xi-lie-si-:juc/](http://www.wangtianyi.top/blog/2018/05/01/javagao-bing-fa-xi-lie-si-:juc/?utm_source=github&utm_medium=github)
104104
[https://blog.csdn.net/mzh1992/article/details/60957351](https://blog.csdn.net/mzh1992/article/details/60957351)

MD/搜索引擎.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ OkHttp:是一个专注于性能和易用性的 HTTP 客户端。OkHttp 会使
3535
### 多线程爬虫如何实现
3636
使用Executors.newFixedThreadPool(),因为我爬虫线程基本固定不会需要销毁重建,并且可以控制线程最大数量,方便日后根据机器性能调整。
3737

38-
如果问到线程池的原理,请参[这里](http://www.wangtianyi.top/blog/2018/05/08/javagao-bing-fa-wu-xian-cheng-chi/)
38+
如果问到线程池的原理,请参[这里](http://www.wangtianyi.top/blog/2018/05/08/javagao-bing-fa-wu-xian-cheng-chi/?utm_source=github&utm_medium=github)
3939

4040
### 抵抗反爬虫策略
4141
#### 动态页面的加载

MD/通用基础-设计模式.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
一般情况下直接使用饿汉式就好了,如果明确要求要懒加载会倾向于使用静态内部类,如果涉及到反序列化创建对象时会试着使用枚举的方式来实现单例。
1111

1212
## 管道-过滤器模式
13-
[http://www.wangtianyi.top/blog/2017/10/08/shi-yao-shi-hou-neng-yong-shang-she-ji-mo-shi/](http://www.wangtianyi.top/blog/2017/10/08/shi-yao-shi-hou-neng-yong-shang-she-ji-mo-shi/)
13+
[http://www.wangtianyi.top/blog/2017/10/08/shi-yao-shi-hou-neng-yong-shang-she-ji-mo-shi/](http://www.wangtianyi.top/blog/2017/10/08/shi-yao-shi-hou-neng-yong-shang-she-ji-mo-shi/?utm_source=github&utm_medium=github)
1414

1515
## 装饰器模式
1616
在保持原有功能接口不变的基础上动态扩展功能的模式。

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ PS:除开知识点,一定要准备好以下套路:
2525
* [TCP & HTTP](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/通用基础-TCP&HTTP.md)
2626
* [排序算法](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/通用基础-排序算法.md)
2727
* [常用的几个设计模式](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/通用基础-设计模式.md)
28-
* [从URL到看到网页的过程](http://www.wangtianyi.top/blog/2017/10/22/cong-urlkai-shi-,ding-wei-shi-jie/)
28+
* [从URL到看到网页的过程](http://www.wangtianyi.top/blog/2017/10/22/cong-urlkai-shi-,ding-wei-shi-jie/?utm_source=github&utm_medium=github)
2929
### 分布式
3030
* [CAP理论](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/分布式-CAP理论.md)
3131
* [](https://www.jianshu.com/p/c2b4aa7a12f1)
@@ -35,10 +35,10 @@ PS:除开知识点,一定要准备好以下套路:
3535
* [四层、七层负载均衡的区别](https://www.jianshu.com/p/fa937b8e6712)
3636
* [一致性算法](https://github.com/crossoverJie/JCSprout/blob/master/MD/Consistent-Hash.md)
3737
### 微服务
38-
* [微服务介绍](http://www.wangtianyi.top/blog/2017/04/16/microservies-1-introduction-to-microservies/)
39-
* [服务发现原理](http://www.wangtianyi.top/blog/2017/05/15/zai-wei-fu-wu-jia-gou-zhong-de-fu-wu-fa-xian-ji-zhi/)
38+
* [微服务介绍](http://www.wangtianyi.top/blog/2017/04/16/microservies-1-introduction-to-microservies/?utm_source=github&utm_medium=github)
39+
* [服务发现原理](http://www.wangtianyi.top/blog/2017/05/15/zai-wei-fu-wu-jia-gou-zhong-de-fu-wu-fa-xian-ji-zhi/?utm_source=github&utm_medium=github)
4040
* [服务发现Consul](http://sjyuan.cc/service-registration-and-discovery/)
41-
* [API网关原理](http://www.wangtianyi.top/blog/2017/04/22/yi-microservies-2-building-microservices-using-an-api-gateway/)
41+
* [API网关原理](http://www.wangtianyi.top/blog/2017/04/22/yi-microservies-2-building-microservices-using-an-api-gateway/?utm_source=github&utm_medium=github)
4242
* [服务配置中心](http://sjyuan.cc/service-config-server/)
4343
* [服务容错保护](http://sjyuan.cc/service-fault-tolerant-protected-with-hytrix/)
4444
### 算法
@@ -52,10 +52,10 @@ PS:除开知识点,一定要准备好以下套路:
5252
* [动态规划-连续子数组最大和](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/算法-动态规划-连续子数组最大和.md)
5353
* [数据结构-LRU淘汰算法](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/算法-数据结构-LRU淘汰算法.md)
5454
### 问题排查
55-
* [Java生产环境下问题排查](http://www.wangtianyi.top/blog/2018/07/20/javasheng-chan-huan-jing-xia-wen-ti-pai-cha/)
55+
* [Java生产环境下问题排查](http://www.wangtianyi.top/blog/2018/07/20/javasheng-chan-huan-jing-xia-wen-ti-pai-cha/?utm_source=github&utm_medium=github)
5656
### 项目举例
5757
* [秒杀架构](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/秒杀架构.md)
5858
* [搜索引擎](https://github.com/xbox1994/2018-Java-Interview/blob/master/MD/搜索引擎.md)
5959
### 系统设计
60-
* [从面试者角度设计一个系统设计题](http://www.wangtianyi.top/blog/2018/08/31/xi-tong-she-ji-mian-shi-ti-:zong-he-kao-cha-mian-shi-zhe-de-da-zhao/)
60+
* [从面试者角度设计一个系统设计题](http://www.wangtianyi.top/blog/2018/08/31/xi-tong-she-ji-mian-shi-ti-:zong-he-kao-cha-mian-shi-zhe-de-da-zhao/?utm_source=github&utm_medium=github)
6161
* [系统设计题答题套路](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E4%B8%80%E4%B8%AA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E7%9A%84%E9%9D%A2%E8%AF%95%E9%A2%98)

images/j12.jpg

-184 KB
Binary file not shown.

images/j2.jpg

-10.6 KB
Binary file not shown.

images/堆的内存分配.png

28.4 KB
Loading

0 commit comments

Comments
 (0)