Skip to content

Commit 8877467

Browse files
author
WangTianyi
committed
update
1 parent 58a04b9 commit 8877467

File tree

1 file changed

+40
-7
lines changed

1 file changed

+40
-7
lines changed

README.md

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@ JVM本身是介于JAVA编译器和操作系统之间的程序,这个程序提
2323
* JDK1.4 加入了新的 NIO 机制,目的是防止 Java 堆 和 Native 堆之间往复的数据复制带来的性能损耗,此后 NIO 可以使用 Native 的方式直接在 Native 堆分配内存。
2424
* 直接内存区域是全局共享的内存区域。
2525

26+
### Java对象不都是分配在堆上
27+
废话,还有线程使用的虚拟机栈上的啊,在方法体中声明的变量以及创建的对象,将直接从该线程所使用的栈中分配空间。
28+
#### 逃逸分析
29+
逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量引用。正常的方法调用中,方法体中创建的对象将在执行完毕之后,将回收其中创建的对象;故由于无法回收,即成为逃逸。
30+
31+
逃逸分析可以分析出某个对象是否永远只在某个方法、线程的范围内,并没有“逃逸”出这个范围,逃逸分析的一个结果就是对于某些未逃逸对象可以直接在栈上分配,由于该对象一定是局部的,所以栈上分配不会有问题。
32+
33+
#### TLAB
34+
JVM在内存新生代Eden Space中开辟了一小块线程私有的区域TLAB(Thread-local allocation buffer)。在Java程序中很多对象都是小对象且用过即丢,它们不存在线程共享也适合被快速GC,所以对于小对象通常JVM会优先分配在TLAB上,并且TLAB上的分配由于是线程私有所以没有锁开销。因此在实践中分配多个小对象的效率通常比分配一个大对象的效率要高。
35+
也就是说,Java中每个线程都会有自己的缓冲区称作TLAB,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。
36+
2637
### 类加载机制
2738
#### 初始化时机
2839
new、静态字段或方法被使用、反射、父类、main函数调用
@@ -35,6 +46,16 @@ new、静态字段或方法被使用、反射、父类、main函数调用
3546
4. 解析(将常量池的符号引用替换为直接引用)
3647
5. 初始化(执行类构造器-类变量赋值和静态块的过程)
3748

49+
#### 类加载器
50+
启动类加载器:是虚拟机自身的一部分,它负责将 <JAVA_HOME>/lib路径下的核心类库
51+
扩展类加载器:它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用标准扩展类加载器
52+
系统类加载器:它负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库
53+
54+
如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是**双亲委派模式**
55+
56+
采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次防止恶意覆盖Java核心API。
57+
58+
3859
### 内存分配(堆上的内存分配)
3960
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/j2.jpg)
4061
#### 新生代
@@ -208,6 +229,13 @@ Java IO包中就使用了该模式,InputStream有太多的实现类如FileInpu
208229
### 什么是Spring
209230
Spring是个包含一系列功能的合集,如快速开发的Spring Boot,支持微服务的Spring Cloud,支持认证与鉴权的Spring Security,Web框架Spring MVC。IOC与AOP依然是核心。
210231

232+
### Spring MVC流程
233+
234+
1. 发送请求——>DispatcherServlet拦截器拿到交给HandlerMapping
235+
2. 依次调用配置的拦截器,最后找到配置好的业务代码Handler并执行业务方法
236+
3. 包装成ModelAndView返回给ViewResolver解析器渲染页面
237+
238+
211239
### IOC(DI)
212240
控制反转:原来是自己主动去new一个对象去用,现在是由容器工具配置文件创建实例让自己用,以前是自己去找妹子亲近,现在是有中介帮你找妹子,让你去挑选,说白了就是用面向接口编程和配置文件减少对象间的耦合,同时解决硬编码的问题(XML)
213241

@@ -287,17 +315,22 @@ HttpURLConnection:本身的 API 不够友好,所提供的功能也有限
287315
HttpClient:功能强大
288316
OkHttp:是一个专注于性能和易用性的 HTTP 客户端。OkHttp 会使用连接池来复用连接以提高效率。OkHttp 提供了对 GZIP 的默认支持来降低传输内容的大小。OkHttp 也提供了对 HTTP 响应的缓存机制,可以避免不必要的网络请求。当网络出现问题时,OkHttp 会自动重试一个主机的多个 IP 地址。
289317

290-
### 动态页面的加载
291-
318+
### 抵抗反爬虫策略
319+
#### 动态页面的加载
292320
phantomjs + selenium + java
293321

294-
### 如何抓取需要登录的页面
322+
#### 如何抓取需要登录的页面
295323
模拟登录之后将sessionId保存到request header的cookie中
296324

297-
### 如何解决IP限制问题
298-
1. 买个支持ADSL的拨号服务器,便宜的一个月80,然后在上面搭建代理服务器,用爬虫连上去
299-
2. 自己探索不同网站的访问频率限制规则
300-
3. 寻找网站访问频率访问限制漏洞
325+
#### 如何解决IP限制问题
326+
买个支持ADSL的拨号服务器,便宜的一个月80,然后在上面搭建代理服务器,用爬虫连上去
327+
328+
329+
#### 每分钟访问频率
330+
寻找网站访问频率访问限制漏洞,自己探索不同网站的访问频率限制规则
331+
332+
#### 验证码
333+
图像识别
301334

302335
### 存储查询大量的数据
303336

0 commit comments

Comments
 (0)