摘要:
1. 池化思想:线程池,字符串常量池,连接池 2. 线程池的优点: 提高线程利用率(利用创建好的线程反复去执行任务) 提高程序的响应速度(省去创建时间) 便于统一管理线程对象 可以控制最大并发数 3. 类比:银行柜台窗口 工作过程是先创建若干个线程,如果需要执行一个任务就派一个线程去执行,如果都在执 阅读全文
摘要:
1. 内存模型概念 (1)内存模型(Java Memory Model)和内存结构(堆栈那些)不是一个层面的概念,JMM 定义了一套在多线程读写共享数据(成员变量,静态变量等,而不是局部变量这种线程私有的)时,对数据的可见性、有序性、和原子性的规则和保障。 (2)JMM规定了所有的变量都存储在主内存 阅读全文
摘要:
1. 逃逸分析 概念:判断新建的对象是否逃逸,可以使用 -XX:-DoEscapeAnalysis 关闭逃逸分析。 逃逸分析利用的是JVM分层编译,JVM的执行状态分为五个层次: 即时编译器比起解释器多了Code Cache,下次遇到相同的代码直接执行不需要再编译,所以执行后面重复代码会更快。 2. 阅读全文
摘要:
1. 类加载流程 2. 加载 类加载过程的第⼀步,主要完成下⾯3件事情: (1)通过全类名获取定义此类的⼆进制字节流 (2)将字节流所代表的静态存储结构转换为方法区的运行时数据结构(本质是C++的instanceKlass作为元数据来描述Java类) (3)在内存中⽣成⼀个代表该类的 Class 对 阅读全文
摘要:
一. 特点 1. 常量池中的字符串仅是符号,第一次用到时才变为对象 2. 利用串池的机制,来避免重复创建字符串对象 3. 字符串变量拼接的原理是 StringBuilder(1.8),StringBuilder的toString()方法实际上是new出来的String 4. 字符串常量拼接的原理是编 阅读全文
摘要:
Stack就是继承Vector的,而我们常常用Deque替代Stack(Deque可以当栈也可以当队列) 不使用Vector及子类原因如下: 1. 因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer 2. Vector空间满了之后,扩容是一倍,而ArrayList仅仅 阅读全文
摘要:
1. lower_bound() 用于在指定区域内查找大于等于目标值的第一个元素(实质是二分法查找) auto it = lower_bound(f.begin(), f.end(), num); 2. upper_bound() 查找的是第一个大于目标值的元素 int *p = upper_bou 阅读全文
摘要:
1. 如何判断垃圾可以回收 (1)引用计数算法:引用时,计数+1,引用失效,计数-1,零时回收;缺点是遇到互相引用导致都不为零 (2)可达性分析算法(Java用):扫描堆中的对象,沿着GC Root对象为起点的引用链看能否找到该对象,如果能则其仍然存活,不能则判定为可回收的对象。 可作为GC Roo 阅读全文
摘要:
1. 直接内存(Direct Memory)是一个数据缓冲区,属于操作系统内存,不由jvm管理 2. 特点:常用于NIO(ByteBuffer分配的就是直接内存),分配回收成本较高,但读写性能高 3. 正常文件读写过程:磁盘文件 -> 系统缓冲区 -> java缓冲区(new Byte[]) 直接内 阅读全文
摘要:
1. 基本概念 线程的引入是为了增加并发度,线程成为了程序执行流的最小单位,也是基本的CPU执行单元 进程是除CPU之外的系统资源的分配单元,一个进程里可以并发多个线程 2. 它们的区别 进程具有独立的地址空间,而线程没有; 进程切换运行环境时,系统开销大,而一个进程内的线程间切换系统开销小; 线程 阅读全文