未验证 提交 f540c552 编写于 作者: Y yixin 提交者: GitHub

Merge pull request #2 from CyC2018/master

1
# 算法
> **算法(第 4 版)**
[豆瓣](https://book.douban.com/subject/19952400/) 9.4 分,873 人评分。
使用 Java 实现,但是不会涉及很多 Java 高级语法,因此也适合其它语言使用者学习。适合当做算法入门书籍,涉及常用数据结构和算法,建议认真学习。
Coursera 上有配套视频课程可学习:[Algorithms](https://www.coursera.org/learn/algorithms-part1),如果还没到注册时间的话,也是可以点进去观看视频,只是没有作业和证书。
> **数据结构**
[豆瓣](https://book.douban.com/subject/25859528/) 9.4 分,139 分。
C++ 实现,可以结合配套视频观看:[清华大学 数据结构](https://www.xuetangx.com/courses/course-v1:TsinghuaX+30240184+sp/about)
> **剑指 Offer 题解**
[豆瓣](https://book.douban.com/subject/6966465/) 8.3 分,572 人评分。
基本涵盖了面试中出现的高频算法题,刷这本书的性价比很高。
原书使用 C++ 实现,官方提供的第二版源代码仓库为:[CodingInterviewChinese2](https://github.com/zhedahht/CodingInterviewChinese2)
推荐阅读 [剑指 Offer 题解](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/%E5%89%91%E6%8C%87%20offer%20%E9%A2%98%E8%A7%A3.md),使用 Java 实现,有相关的解题思路,对于其它语言使用者来说不会有很大的阅读障碍。
该书的刷题网站推荐 [牛客网](https://www.nowcoder.com/ta/coding-interviews)
> **Leetcode**
[Leetcode](https://leetcode.com/problemset/algorithms/)
剑指 Offer 上的题目基本能在 Leetcode 上找到,而且更全面,所以有时间的话推荐先刷 Leetcode 再刷剑指 Offer。差不多刷 200~300 题就足够应对大多数公司的面试算法题。题目不在多,而在于归纳总结,推荐阅读 [Leetcode 题解](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode%20%E9%A2%98%E8%A7%A3.md),每个题型都做了简单总结。当然如果你觉得我总结的不好,Github 上有多类似的项目。
最开始推荐按 Acceptance 逆序来刷,不会的题目可以先看看 Discuss 上的高票答案,先学习别人是怎么做的。推荐使用英文版,因为英文版讨论区的优质答案比较多,中文版大多数是搬运。
> **程序员代码面试指南:IT 名企算法与数据结构题目最优解**
[豆瓣](https://book.douban.com/subject/26638586/) 8.9 分,82 人评分。
左程云的算法书,除了算法题之外,还有一些海量数据分析的题目很值得看。适合当做 Leetcode 的辅助书籍,对一些题目讲解的不错。如果觉得书本不错的话,也可以看下他的算法课程:[直通 BAT — 求职算法精品课](https://www.nowcoder.com/courses/semester/algorithm)
> **学习算法思想 修炼编程内功**
[慕课网](https://coding.imooc.com/class/71.html)
liuyubo 的在线视频课程,主要是 Leetcode 的题目,如果觉得 Leetcode 刷的有障碍,可以考虑看这个视频,画图和讲解都很用心。
> **挑战程序设计竞赛**
[豆瓣](https://book.douban.com/subject/24749842/) 9.0 分,203 人评分。
一些大厂可能会问到一些简单 ACM 题目,所以这本书也值得看一部分内容,比如线段树、网络流等。
# 计算机网络
> **计算机网络 自顶向下方法**
[豆瓣](https://book.douban.com/subject/26176870/) 8.9 分,297 人评分。
适合入门,推荐阅读前面四章内容。
> **计算机网络**
[豆瓣](https://book.douban.com/subject/24740558/) 8.0 分,142 人评分。
大部分学校的教材,内容还是很不错的,可以当做上一本书的辅助书籍,结合着看。
> **TCP/IP 详解 卷 1:协议**
[豆瓣](https://book.douban.com/subject/1088054/) 9.2 分,1963 人评分。
TCP/IP 是网络中最重要的一部分,也是面试中常问的,所以这本书很值得看。
> **UNIX 网络编程 卷 1:套接字联网 API**
[豆瓣](https://book.douban.com/subject/1500149/) 9.5 分,915 人评分。
这本书(UNP)和 UNIX 环境高级编程(APUE)被称为腾讯的敲门砖,应该说 C++ 岗位的同学都应该学习一下,Java 或者其它岗位的同学倒是没那么高的要求。不过这两本是大部头,从头看到尾是不现实的,适合当做工具书,碰到问题的时候再去查找书中的内容。然后对于面试中经常问到的重点知识,也适合看看这本书的内容,而不是背网上所谓的面试答案。
> **Socket**
[我的笔记](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Socket.md) 对常见的 Socket 问题做了总结,如果觉得阅读 UNP 太慢的话可以看看这个。
> **图解 HTTP**
[豆瓣](https://book.douban.com/subject/25863515/) 8.1 分,1669 人评分。
HTTP 也是网络中非常重要的部分,这本书很容易看懂,也推荐看我总结的 [笔记](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/HTTP.md)
# 操作系统
> **计算机操作系统**
[我的笔记](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.md) 把操作系统的一些基本概念和原理都做了总结,基本没有底层的一些细节。适合作为入门资料,很快就能看完。
> **现代操作系统**
[豆瓣](https://book.douban.com/subject/3852290/) 8.9 分,656 人评分。
推荐重点阅读一下 进程与线程、死锁、存储管理 章节。
> **深入理解计算机系统**
[豆瓣](https://book.douban.com/subject/5333562/) 9.7 分,2211 人评分。
没看完这本书不敢说自己计算机基础扎实,可以当做计算机导论来看,涉及方方面面的内容。很佩服作者能把这些内容写的这么通俗易懂,阅读这本书真是一种享受。不过不适合短期内提升,要是急着应付面试的话可以先挑一些内容看看。
> **UNIX 环境高级编程**
[豆瓣](https://book.douban.com/subject/1788421/) 9.4 分,2187 人评分。
和 UNP 类似,都是 C++ 岗位必备书籍。
> **Linux 多线程服务端编程**
[豆瓣](https://book.douban.com/subject/20471211/) 8.8 分,394 人评分。
也是推荐 C++ 岗位同学阅读。
> **Unix/Linux 编程实践教程**
[豆瓣](https://book.douban.com/subject/1219329/) 9.2 分,369 人评分。
涉及 Unix 系统编程,并且教你如何实现的常用命令,适合当做 C++ 岗位的实践书籍,在写个人项目之前建议先看一下这本书。
> **鸟哥的 Linux 私房菜**
[豆瓣](https://book.douban.com/subject/4889838/) 9.1 分,2604 人评分。
适合当做入门书籍,通俗易懂,不过太过通俗有点啰嗦了。后台岗位对 Linux 的基本使用还是要有一定了解,再重点看看文件系统的实现原理,还有一些 Shell 命令。
> **The Linux Command Line**
[豆瓣](https://book.douban.com/subject/6806862/) 9.3 分,290 人评分。
比鸟哥的书简洁很多,有 [中文版](http://billie66.github.io/TLCL/book/) 可以阅读。
# 数据库
> **MySQL 必知必会**
[豆瓣](https://book.douban.com/subject/3354490/) 8.4 分,904 人评分。
学习数据库最好先学一下 SQL 语句,而这本书主要讲解这方面内容。
> **Leetcode-Database**
学完 SQL 之后最到 [Leetcode](https://leetcode.com/problemset/database/) 上实践一下, 面试有时候也会考察手写 SQL 语句。可以结合着 [我的笔记](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode-Database%20%E9%A2%98%E8%A7%A3.md) 刷题。
> **数据库系统原理**
[我的笔记](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E5%8E%9F%E7%90%86.md) 对一些基本原理做了简单总结,适合入门。
> **MySQL**
[我的笔记](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/MySQL.md) 对常见 的 MySQL 问题做了总结,适合入门。
> **高性能 MySQL**
[豆瓣](https://book.douban.com/subject/23008813/) 9.3 分,408 人评分。
MySQL 是关系型数据库,这本书对 MySQL 做了很好的讲解,后台岗位的话运维相关的内容可以不看。
> **MySQL 技术内幕**
[豆瓣](https://book.douban.com/subject/24708143/) 8.7 分,185 人评分。
这本书其实更适合后台岗位的同学看,对 InnoDB 存储引擎的原理做了很好的讲解。
> **Redis 设计与实现**
[豆瓣](https://book.douban.com/subject/25900156/) 8.5 分,608 人评分。
Redis 作为内存型键值对非关系型数据库,主要作为缓存使用。这本书对 Redis 实现原理做了讲解,推荐阅读字典、跳跃表、过期机制、持久化、事件、复制、Sentinel 、集群、发布与订阅、事务。当然有时间的话推荐都认真阅读以下。
> **Redis 实战**
[豆瓣](https://book.douban.com/subject/26612779/) 8.1 分,264 人评分。
这本书偏实践,上本书偏实现原理,两本书最好结合着看。
> **大规模分布式存储系统**
[豆瓣](https://book.douban.com/subject/25723658/) 7.9 分,370 人评分。
涉及分布式场景下的一些存储系统,分布式非常重要。
# 设计模式
> **Head First 设计模式**
[豆瓣](https://book.douban.com/subject/2243615/) 9.2 分,2660 人评分。
很好的一本设计模式入门书籍,可以把常见的几种设计模式看看,比如单例模式、几个工厂模式、观察者模式、MVC。
> **设计模式**
[我的笔记](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md) 简单实现了每种设计模式,如果觉得看 Head First 设计模式 太慢,可以看看我的实现。
# 系统设计
> **大型网站技术架构**
[豆瓣](https://book.douban.com/subject/25723064/) 7.9 分,1295 人评分。
非常好的一本架构入门书籍,方方面面都讲解得通俗易懂。
> **从 Paxos 到 Zookeeper**
[豆瓣](https://book.douban.com/subject/26292004/) 7.8 分,284 人评分。
前面几章讲解了分布式的基本原理,很适合作为分布式的入门书籍。
> **微服务设计**
[豆瓣](https://book.douban.com/subject/26772677/) 8.2 分,481 人评分。
> **其它**
- [[system-design-primer\][Github]](https://github.com/donnemartin/system-design-primer)
- [[Leetcode / Interview Questions\][题集]](https://leetcode.com/discuss/interview-question/?orderBy=most_votes)
- [[系统设计面试题精选\][Gitbook]](https://soulmachine.gitbooks.io/system-design/content/cn/)
- [[海量数据面试题\]](https://samanthachen.github.io/2016/08/01/%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E9%9D%A2%E8%AF%95%E9%A2%98/)
- [[前端经典面试题: 从输入 URL 到页面加载发生了什么?\][具体问题]](https://segmentfault.com/a/1190000006879700)
- [[秒杀系统架构分析与实战\][具体问题]](https://my.oschina.net/xianggao/blog/524943)
- [[微信二维码登录原理\][具体问题]](https://zhuanlan.zhihu.com/p/22325152?refer=bittiger)
- [[Create a TinyURL System\][具体问题]](http://blog.gainlo.co/index.php/2016/03/08/system-design-interview-question-create-tinyurl-system/)
- [[Design a Key-Value Store (Part I)\][具体问题]](http://blog.gainlo.co/index.php/2016/06/14/design-a-key-value-store-part-i/)
- [[坦率地讲 服务熔断 & 服务降级\][知识点]](http://lexuslee.me/2018/02/01/2018-01-18-Service-fallback/)
- [[理解 HTTP 幂等性\][知识点]](https://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html)
- [[接口限流算法\][知识点]](https://blog.csdn.net/ljj821061514/article/details/52512943)
- [[微服务学习资料汇总\][知识点]](https://www.infoq.cn/article/2014%2F07%2Fmicroservice-learning-resources)
- [[理解 RESTful 架构\][知识点]](http://www.ruanyifeng.com/blog/2011/09/restful.html)
- [[MapReduce 算法\][知识点]](https://github.com/xuelangZF/CS_Offer/blob/master/Others/Hadoop_Spark.md)
\ No newline at end of file
......@@ -3,13 +3,14 @@
| :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:|
| 算法[:pencil2:](#pencil2-算法) | 操作系统[:computer:](#computer-操作系统)|网络[:cloud:](#cloud-网络) | 面向对象[:couple:](#couple-面向对象) |数据库[:floppy_disk:](#floppy_disk-数据库)| Java [:coffee:](#coffee-java)| 系统设计[:bulb:](#bulb-系统设计)| 工具[:hammer:](#hammer-工具)| 编码实践[:speak_no_evil:](#speak_no_evil-编码实践)| 后记[:memo:](#memo-后记) | -->
| Ⅰ | Ⅱ | Ⅲ | Ⅳ | Ⅴ |
<!-- | Ⅰ | Ⅱ | Ⅲ | Ⅳ | Ⅴ |
| :--------: | :---------: | :---------: | :---------: | :---------: |
| &emsp;&emsp;&emsp;算法&emsp;&emsp;&emsp;<br>[:pencil2:](#pencil2-算法) | &emsp;&emsp;&emsp;操作系统&emsp;&emsp;&emsp;<br>[:computer:](#computer-操作系统) | &emsp;&emsp;&emsp;&emsp;网络&emsp;&emsp;&emsp;&emsp;<br>[:cloud:](#cloud-网络) | &emsp;&emsp;&emsp;面向对象&emsp;&emsp;&emsp;<br>[:couple:](#couple-面向对象) | &emsp;&emsp;&emsp;数据库&emsp;&emsp;<br>[:floppy_disk:](#floppy_disk-数据库)|
| Ⅵ | Ⅶ | Ⅷ | Ⅸ | Ⅹ |
|:---------:| :---------: | :-------: | :-------:| :------:|
| &emsp;&emsp;&emsp;Java&emsp;&emsp;&emsp;<br>[:coffee:](#coffee-java) | &emsp;&emsp;&emsp;系统设计&emsp;&emsp;&emsp;<br>[:bulb:](#bulb-系统设计) | &emsp;&emsp;&emsp;&emsp;工具&emsp;&emsp;&emsp;&emsp;<br>[:hammer:](#hammer-工具) | &emsp;&emsp;&emsp;编码实践&emsp;&emsp;&emsp;<br>[:speak_no_evil:](#speak_no_evil-编码实践) | &emsp;&emsp;&emsp;后记 &emsp;&emsp;&emsp;<br>[:memo:](#memo-后记) |
-->
<br>
......@@ -19,6 +20,8 @@
<a href="https://cyc2018.github.io/CS-Notes"> <img src="https://img.shields.io/badge/>-read-4ab8a1.svg"></a> <a href="https://xiaozhuanlan.com/CyC2018"> <img src="https://img.shields.io/badge/_-more-4ab8a1.svg"></a>
</div>
<br/>
### :pencil2: 算法
- [剑指 Offer 题解](https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/剑指%20offer%20题解.md)
......@@ -92,19 +95,25 @@
如果想要提交一个仓库现在还没有的全新内容,可以先将相应的文档放到 other 目录下。
#### 交流群
面向用户:正在找工作,以及已经工作并且想持续学习的小伙伴。
你能得到什么:这是一个实时学习交流平台,这个平台旨在建立一个一起努力和成长的氛围。在这里你可以提问在学习或求职过程中遇到的疑惑,能够得到群主以及不同人的回答以及建议。也会带你走进不止于技术的程序世界。
#### 面试进阶指南
<img src="https://github.com/CyC2018/CS-Notes/raw/master/other/group1.png" width="200px">
零基础不知道如何复习?想要冲刺大厂不知道如何突破?本专栏将会提供学习路线与学习资料,并且针对核心面试考点进行讲解。
#### 面试专栏
[🍉](https://xiaozhuanlan.com/CyC2018)
考虑到本仓库的内容已经非常多了,但是笔者又想写一些面试相关的内容,很难将这些内容添加到仓库中,因此新开了一个专门针对面试的专栏。该专栏不仅会新增一些面试必备知识,也会对本仓库已有内容做梳理,使得这些内容更适合作为面试资料。
#### 交流群
[🍉](https://xiaozhuanlan.com/CyC2018)
为大家提供一个学习交流平台,在这里你可以自由地和笔者以及其他人进行技术上的交流。
[💬](other/Group.md)
#### 知识星球
想要向笔者提问关于学习和求职方面的建议?来知识星球,你的每个提问我都会认真回答。
[🎓](other/Planet.md)
#### 内推信息
......
## ✏️ 算法
> [剑指 Offer 题解](notes/剑指%20offer%20题解.md) </br>
......@@ -54,4 +55,4 @@
## ✒️ 专栏
> [后端技术面试指南](https://xiaozhuanlan.com/CyC2018)
> [后端面试进阶指南](https://xiaozhuanlan.com/CyC2018)
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、解决的问题](#一解决的问题)
* [二、与虚拟机的比较](#二与虚拟机的比较)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [集中式与分布式](#集中式与分布式)
* [中心服务器](#中心服务器)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一 、基础概念](#一-基础概念)
* [URI](#uri)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、概览](#一概览)
* [二、磁盘操作](#二磁盘操作)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、数据类型](#一数据类型)
* [包装类型](#包装类型)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、概览](#一概览)
* [Collection](#collection)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、线程状态转换](#一线程状态转换)
* [新建(New)](#新建new)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、运行时数据区域](#一运行时数据区域)
* [程序计数器](#程序计数器)
......@@ -65,7 +66,7 @@ java -Xss512M HackTheJava
所有对象都在这里分配内存,是垃圾收集的主要区域("GC 堆")。
现代的垃圾收集器基本都是采用分代收集算法,其主要的思想是针对不同类型的对象采取不同的垃圾回收算法可以将堆分成两块:
现代的垃圾收集器基本都是采用分代收集算法,其主要的思想是针对不同类型的对象采取不同的垃圾回收算法可以将堆分成两块:
- 新生代(Young Generation)
- 老年代(Old Generation)
......@@ -86,21 +87,19 @@ java -Xms1M -Xmx2M HackTheJava
对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载,但是一般比较难实现。
HotSpot 虚拟机把它当成永久代来进行垃圾回收。但很难确定永久代的大小,因为它受到很多因素影响,并且每次 Full GC 之后永久代的大小都会改变,所以经常会抛出 OutOfMemoryError 异常。为了更容易管理方法区,从 JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,而不是虚拟机内存中。
HotSpot 虚拟机把它当成永久代来进行垃圾回收。但很难确定永久代的大小,因为它受到很多因素影响,并且每次 Full GC 之后永久代的大小都会改变,所以经常会抛出 OutOfMemoryError 异常。为了更容易管理方法区,从 JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,而不是虚拟机内存中。
## 运行时常量池
运行时常量池是方法区的一部分。
Class 文件中的常量池(编译器生成的各种字面量和符号引用)会在类加载后被放入这个区域。
Class 文件中的常量池(编译器生成的字面量和符号引用)会在类加载后被放入这个区域。
除了在编译期生成的常量,还允许动态生成,例如 String 类的 intern()。
## 直接内存
在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存(Native 堆),然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。
这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。
在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。
# 二、垃圾收集
......@@ -112,11 +111,9 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用
### 1. 引用计数算法
给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。
两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。
为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。
正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。
两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。
```java
public class ReferenceCountingGC {
......@@ -151,19 +148,17 @@ Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC
主要是对常量池的回收和对类的卸载。
在大量使用反射、动态代理、CGLib 等 ByteCode 框架、动态生成 JSP 以及 OSGi 这类频繁自定义 ClassLoader 的场景都需要虚拟机具备类卸载功能,以保证不会出现内存溢出
为了避免内存溢出,在大量使用反射、动态代理的场景都需要虚拟机具备类卸载功能
类的卸载条件很多,需要满足以下三个条件,并且满足了也不一定会被卸载:
类的卸载条件很多,需要满足以下三个条件,但是满足了也不一定会被卸载:
- 该类所有的实例都已经被回收,也就是堆中不存在该类的任何实例。
- 该类所有的实例都已经被回收,此时堆中不存在该类的任何实例。
- 加载该类的 ClassLoader 已经被回收。
- 该类对应的 Class 对象没有在任何地方被引用,也就无法在任何地方通过反射访问该类方法。
可以通过 -Xnoclassgc 参数来控制是否对类进行卸载。
### 4. finalize()
finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。但是 try-finally 等方式可以做的更好,并且该方法运行代价高昂,不确定性大,无法保证各个对象的调用顺序,因此最好不要使用。
finalize() 类似 C++ 的析构函数,用于关闭外部资源。但是 try-finally 等方式可以做的更好,并且该方法运行代价很高,不确定性大,无法保证各个对象的调用顺序,因此最好不要使用。
当一个对象可被回收时,如果需要执行该对象的 finalize() 方法,那么就有可能在该方法中让对象重新被引用,从而实现自救。自救只能进行一次,如果回收的对象之前调用了 finalize() 方法自救,后面回收时不会调用 finalize() 方法。
......@@ -209,9 +204,9 @@ obj = null;
### 4. 虚引用
又称为幽灵引用或者幻影引用。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象。
又称为幽灵引用或者幻影引用,一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象。
为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收时收到一个系统通知。
为一个对象设置虚引用的唯一目的是能在这个对象被回收时收到一个系统通知。
使用 PhantomReference 来实现虚引用。
......@@ -248,9 +243,9 @@ obj = null;
主要不足是只使用了内存的一半。
现在的商业虚拟机都采用这种收集算法来回收新生代,但是并不是将新生代划分为大小相等的两块,而是分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 空间和其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象一次性复制到另一块 Survivor 空间上,最后清理 Eden 和使用过的那一块 Survivor。
现在的商业虚拟机都采用这种收集算法回收新生代,但是并不是划分为大小相等的两块,而是一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 空间和其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象全部复制到另一块 Survivor 空间上,最后清理 Eden 和使用过的那一块 Survivor。
HotSpot 虚拟机的 Eden 和 Survivor 的大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 空间就不够用了,此时需要依赖于老年代进行分配担保,也就是借用老年代的空间存储放不下的对象。
HotSpot 虚拟机的 Eden 和 Survivor 的大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 空间就不够用了,此时需要依赖于老年代进行空间分配担保,也就是借用老年代的空间存储放不下的对象。
### 4. 分代收集
......@@ -280,7 +275,7 @@ Serial 翻译为串行,也就是说它以串行的方式执行。
它的优点是简单高效,对于单个 CPU 环境来说,由于没有线程交互的开销,因此拥有最高的单线程收集效率。
它是 Client 模式下的默认新生代收集器,因为在该应用场景下,分配给虚拟机管理的内存一般来说不会很大。Serial 收集器收集几十兆甚至一两百兆的新生代停顿时间可以控制在一百多毫秒以内,只要不是太频繁,这点停顿是可以接受的。
它是 Client 模式下的默认新生代收集器,因为在该应用场景下内存一般来说不会很大。Serial 收集器收集几十兆甚至一两百兆的新生代停顿时间可以控制在一百多毫秒以内,只要不是太频繁,这点停顿是可以接受的。
### 2. ParNew 收集器
......@@ -288,7 +283,7 @@ Serial 翻译为串行,也就是说它以串行的方式执行。
它是 Serial 收集器的多线程版本。
是 Server 模式下的虚拟机首选新生代收集器,除了性能原因外,主要是因为除了 Serial 收集器,只有它能与 CMS 收集器配合工作。
是 Server 模式下首选的新生代收集器,除了性能原因外,主要是因为除了 Serial 收集器,只有它能与 CMS 收集器配合工作。
默认开启的线程数量与 CPU 数量相同,可以使用 -XX:ParallelGCThreads 参数来设置线程数。
......@@ -296,7 +291,7 @@ Serial 翻译为串行,也就是说它以串行的方式执行。
与 ParNew 一样是多线程收集器。
其它收集器关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而它的目标是达到一个可控制的吞吐量,它被称为“吞吐量优先”收集器。这里的吞吐量指 CPU 用于运行用户代码的时间占总时间的比值。
其它收集器目标是尽可能缩短垃圾收集时用户线程的停顿时间,而它的目标是达到一个可控制的吞吐量,因此它被称为“吞吐量优先”收集器。这里的吞吐量指 CPU 用于运行用户程序的时间占总时间的比值。
停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。而高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [算法思想](#算法思想)
* [双指针](#双指针)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [595. Big Countries](#595-big-countries)
* [627. Swap Salary](#627-swap-salary)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、常用操作以及概念](#一常用操作以及概念)
* [快捷键](#快捷键)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、索引](#一索引)
* [B+ Tree 原理](#b-tree-原理)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、概述](#一概述)
* [二、数据类型](#二数据类型)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、基础](#一基础)
* [二、创建表](#二创建表)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、I/O 模型](#一io-模型)
* [阻塞式 I/O](#阻塞式-io)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、可读性的重要性](#一可读性的重要性)
* [二、用名字表达代码含义](#二用名字表达代码含义)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
<!-- GFM-TOC -->
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、分布式锁](#一分布式锁)
* [数据库的唯一索引](#数据库的唯一索引)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [1. 前言](#1-前言)
* [2. 实现 Singleton](#2-实现-singleton)
......@@ -1196,11 +1197,12 @@ public ListNode FindKthToTail(ListNode head, int k) {
## 解题思路
使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 y6 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。
使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 z1 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。
在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。
<div align="center"> <img src="pics/70fa1f83-dae7-456d-b94b-ce28963b2ba1.png" width="500"/> </div><br>
<div align="center"> <img src="pics/d5d3b7ae-2712-412e-98f1-633ce6ec5955.png" width="500"/> </div><br>
```java
public ListNode EntryNodeOfLoop(ListNode pHead) {
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、跨站脚本攻击](#一跨站脚本攻击)
* [二、跨站请求伪造](#二跨站请求伪造)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、事务](#一事务)
* [概念](#概念)
......@@ -578,4 +579,4 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
- [The basics of the InnoDB undo logging and history system](https://blog.jcole.us/2014/04/16/the-basics-of-the-innodb-undo-logging-and-history-system/)
- [MySQL locking for the busy web developer](https://www.brightbox.com/blog/2013/10/31/on-mysql-locks/)
- [浅入浅出 MySQL 和 InnoDB](https://draveness.me/mysql-innodb)
- [Innodb 中的事务隔离级别和锁的关系](https://tech.meituan.com/innodb-lock.html)
- [Innodb 中的事务隔离级别和锁的关系](https://tech.meituan.com/2014/08/20/innodb-lock.html)
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、构建工具的作用](#一构建工具的作用)
* [二、Java 主流构建工具](#二java-主流构建工具)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、概述](#一概述)
* [二、匹配单个字符](#二匹配单个字符)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、消息模型](#一消息模型)
* [点对点](#点对点)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、前言](#一前言)
* [二、算法分析](#二算法分析)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、性能](#一性能)
* [二、伸缩性](#二伸缩性)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、缓存特征](#一缓存特征)
* [二、LRU](#二lru)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、概述](#一概述)
* [基本特征](#基本特征)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、概述](#一概述)
* [网络的网络](#网络的网络)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、概述](#一概述)
* [二、创建型](#二创建型)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、负载均衡](#一负载均衡)
* [负载均衡算法](#负载均衡算法)
......
[🎉 面试进阶专栏已上线](https://xiaozhuanlan.com/CyC2018)
<!-- GFM-TOC -->
* [一、三大特性](#一三大特性)
* [封装](#封装)
......
</br> <div align="center"><img src="group.png" width="300px"></div> </br>
</br>
<div align="center">
<img src="https://github.com/CyC2018/CS-Notes/raw/master/other/group1.png" width="300px"></br>
<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=93df4b54d965e6c649fe49fe109b2d656609aacc5ec49b4ef4071ae6db1d43c0">QQ 群</a>
</div>
创建交流群的主要目的是为了给大家提供一个交流平台,方便大家在学习的过程中互相讨论。
这个交流群不是一个笔者的问题回答群,我更希望大家能够愿意积极回答,我相信提问和回答的过程都可以提高大家对知识的掌握程度。
至于交流群和 Issue 有什么区别,主要是两方面:一是交流群实时性高一些,二是交流群会更活跃一些。
另外,Issue 主要是用来发布一些项目中的错误和一些改进建议,当然也可以发布一些可以讨论的问题。
交流群可以讨论的内容比较广,例如在阅读本项目过程中不理解的地方可以在交流群中寻求别人的帮助、新技术的讨论、招聘信息、学习和工作的感受等等。
交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。
# 👩‍💻 面向用户
该星球主要面向正在找工作,以及已经工作并且想持续学习的小伙伴。
# 🍉 你能得到什么
该星球为大家提供一个高质量的学习交流平台,这个平台旨在建立一个一起努力和成长的氛围。在这里你可以提问在学习或求职过程中遇到的疑惑,能够得到星主以及不同人的回答以及建议。
# ⭐️ 加入方式
可以用微信直接扫下面的二维码直接加入,或者订阅专栏 https://xiaozhuanlan.com/CyC2018 ,加星主微信 zhengyochuan,备注 “你的姓名 + 订阅专栏加星球”。
<img src="https://github.com/CyC2018/CS-Notes/raw/master/other/planet1.png" width="200px">
# 🔎 预览
<img src="planet2.jpg" width="400px">
<img src="planet3.jpg" width="400px">
# 交流群
# 面试进阶指南
面向用户:正在找工作,以及已经工作并且想持续学习的小伙伴
零基础不知道如何复习?想要冲刺大厂不知道如何突破?本专栏将会提供学习路线与学习资料,并且针对核心面试考点进行讲解
你能得到什么:这是一个实时学习交流平台,这个平台旨在建立一个一起努力和成长的氛围。在这里你可以提问在学习或求职过程中遇到的疑惑,能够得到群主以及不同人的回答以及建议。也会带你走进不止于技术的程序世界。
[🍉](https://xiaozhuanlan.com/CyC2018)
<img src="https://github.com/CyC2018/CS-Notes/raw/master/other/group1.png" width="200px">
# 知识星球
# 面试专栏
想要向笔者提问关于学习和求职方面的建议?来知识星球,你的每个提问我都会认真回答。
考虑到本仓库的内容已经非常多了,但是笔者又想写一些面试相关的内容,很难将这些内容添加到仓库中,因此新开了一个专门针对面试的专栏。该专栏不仅会新增一些面试必备知识,也会对本仓库已有内容做梳理,使得这些内容更适合作为面试资料。
[🎓](other/Planet.md)
[🍉](https://xiaozhuanlan.com/CyC2018)
# 交流群
为大家提供一个学习交流平台,在这里你可以自由地和笔者以及其他人进行技术上的交流。
[💬](other/Group.md)
# 内推信息
[🔎](https://github.com/CyC2018/Job-Recommend)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册