Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Ineweyer committed Mar 27, 2019
1 parent 29eaf12 commit 059aee3
Show file tree
Hide file tree
Showing 7 changed files with 287 additions and 87 deletions.
25 changes: 24 additions & 1 deletion java/IO.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ NIO是一种非阻塞的I/O模型,面向缓冲,基于通道的I/O操作方
#### 2.2.3 原生NIO的问题

- JDK 的 NIO 底层由 epoll 实现,该实现饱受诟病的**空轮询 bug 会导致 cpu 飙升 100%**
- 项目庞大之后,自行实现的 NIO 很容易出现各类 bug,**维护成本较高**,上面这一坨代码我都不能保证没有 bug
- 项目庞大之后,自行实现的 NIO 很容易出现各类 bug,**维护成本较高**

于是乎,大家更喜欢使用Netty

Expand Down Expand Up @@ -322,6 +322,29 @@ AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异

AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。(除了 AIO 其他的 IO 类型都是同步的,这一点可以从底层IO线程模型解释,推荐一篇文章:[《漫话:如何给女朋友解释什么是Linux的五种IO模型?》](https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484746&idx=1&sn=c0a7f9129d780786cabfcac0a8aa6bb7&source=41#wechat_redirect)

### 2.4 IO多路复用select、poll、epoll(操作系统级别)

1.java网络编程使用IO,每一个链接都需要一个单独的线程(对java来说是线程)服务,没有通信时线程阻塞;

2.select模式,一个线程可以为多个链接服务(多路复用);

- a.所有链接都没有数据传输时,线程将其管理的所有连接(文件描述符)交给操作系统(描述符从用户空间复制到内核空间),由操作系统监控;进程阻塞;
- b.当其中有一个连接有数据传输时,操作系统通知线程(描述符从内核空间复制到用户空间) c.线程遍历所有连接(文件描述符)找到需要处理的连接;
- **主要缺点:**
- a.单个线程能监控的连接(文件描述符)有限为1024;
- b.需要维护一个存放描述符的数据结构,内核与用户空间复制开销大;
- c.遍历描述符时线性扫描;
- 3.poll
- a.相比于select,取消了1024限制,但其他缺点仍然存在;
- 4.epoll
- a.取消1024限制;
- b.只将需要通信的连接返回给线程;
- c.目前只有linux支持

[IO & NIO、select & poll & epoll](https://www.jianshu.com/p/8ff13a73f070?utm_campaign)

[select、poll、epoll之间的区别总结整理](https://www.cnblogs.com/Anker/p/3265058.html)

## 3. IO

### 3.1 基本IO分类
Expand Down
18 changes: 13 additions & 5 deletions java/JVM.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

-Xms 初始内存

-Xmm 最大可用内存
-Xmx 最大可用堆内存

-Xmn 年轻代内存大小

Expand Down Expand Up @@ -89,8 +89,8 @@ HotSpot中这个方法区常被称为“永久代”,本质上两者不等价

![Java对象的创å"ºè¿‡ç¨‹](https://camo.githubusercontent.com/e99480df412dd718430d78094143a5485c908fa7/68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f382f32322f313635363165353961343133353836393f773d39353026683d32373926663d706e6726733d3238353239)

1. 类加载检查:遇到new指令时,检查指令参数能否在常量池中定位到这个类的符号引用,并且检查类是否已经被加载、解析、和初始化过。如果没有则必须执行相应的类加载过程。
2. 分配对象:。分配方式有**指针碰撞****空闲列表**,选择哪种方式由Java堆是否规整决定,而java堆是否规整又由采用的垃圾收集器是否带有压缩功能决定。
1. 类加载检查:遇到new指令时,检查指令参数能否在常量池中定位到这个类的符号引用,并且检查类是否已经被加载、准备、解析、和初始化过。如果没有则必须执行相应的类加载过程。
2. 分配内存。分配方式有**指针碰撞****空闲列表**,选择哪种方式由Java堆是否规整决定,而java堆是否规整又由采用的垃圾收集器是否带有压缩功能决定。

![img](https://camo.githubusercontent.com/65fc0c035f1f70081f4dcdd113c3b2c7aa931a2a/68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f382f32322f313635363165353961343061326333643f773d3134323626683d33333326663d706e6726733d3236333436)

Expand Down Expand Up @@ -143,6 +143,14 @@ System.out.println(str1==str2);//false

尽量避免多个字符串的拼接,因为这样会重新创建对象。如果需要改变使用StringBuilder或者StringBuffer。



**intern**

[几张图轻松理解String.intern()](<https://blog.csdn.net/soonfly/article/details/70147205>)

> 原来在常量池中找不到时,复制一个副本放到常量池,1.7后则是将在堆上的地址引用复制到常量池。
### 3.2 8种基本类型的包装类和常量池

- **Java 基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。**
Expand Down Expand Up @@ -395,7 +403,7 @@ Parrllel Scavenge收集器的老年代版本,适用于注重吞吐率和CPU资

必须对类进行初始化的五种情况:

- 使用**new**关键字实例化对象的时候、读取或设置一个类的静态字段的时候,已经调用一个类的静态方法的时候。
- **new、getstatic、putstatic、invokestatic**使用new关键字实例化对象的时候、读取或设置一个类的静态字段的时候,已经调用一个类的静态方法的时候。
- 使用java.lang.reflect包的方法对类进行**反射调用**的时候,如果类没有初始化,则需要先触发其初始化。
-**初始化**一个类的时候,如果发现其父类没有被初始化就会先初始化它的**父类**
- 当虚拟机启动的时候,用户需要指定一个要执行的**主类**(就是包含main()方法的那个类),虚拟机会先**初始化这个类**
Expand All @@ -407,7 +415,7 @@ Parrllel Scavenge收集器的老年代版本,适用于注重吞吐率和CPU资
- 通过数组定义引用类,不会触发此类的初始化
- 常量在编译阶段会存入调用类的常量池中,本质上没有直接引用定义常量的类,不会触发定义常量类的初始化。

### 6.2 加载的过程
### 6.2 类加载的过程

加载、验证、准备、解析和初始化。

Expand Down
Loading

0 comments on commit 059aee3

Please sign in to comment.