摘要:
生命不息,折腾不止! 该公众号的内容大部分为平时学习积累所整理的笔记,包括但不限于源码、原理、经验等。 如果感兴趣,也可以访问clawhub的博客主站 "https://clawhub.club" 阅读全文
摘要:
1、JAVA内存区域与内存溢出 1.1、概述 Java中JVM提供了内存管理机制,Java虚拟机在执行Java程序的过程中会把内分分为不同的数据区,如图: 1.2、程序计数器 程序计数器是当前线程所执行的字节码的行号指示器,作用就是根据计数器的值获取下一条要执行的字节码指令。当执行的是java方法, 阅读全文
摘要:
1、线程池常用接口介绍 1.1、Executor 执行提交的Runnable任务。其中的execute方法在将来的某个时候执行给定的任务,该任务可以在新线程、池化线程或调用线程中执行,具体由Executor的实现者决定。 1.2、ExecutorService ExecutorService继承自E 阅读全文
摘要:
1、自定义注解 @target 说明了Annotation所修饰的对象范围: constructor、method、field、package、type等等。 @retention 定义了该Annotation被保留的时间长短, source(源文件保留)、class( class保留)、runti 阅读全文
摘要:
1、内存模型 1.1、堆 1. 堆是所有线程共享的,主要存放对象实例和数组。 2. 新生代和老年代的比例是1:2。 3. 新生代中三个区域的比例是 8 : 1 : 1。 1.1.1、新生代 对象分配在eden区中,当eden区满时会触发minor gc,将eden区中存活的对象,复制到survivo 阅读全文
摘要:
1、转发与重定向的区别 1. 转发是服务器请求资源,服务器直接访问目标地址url,把响应内容返回给浏览器。 重定向根据服务器返回的状态码重新请求地址。 2. 转发是服务器行为,重定向是客户端行为。 3. 转发显示的url不变而重定向显示新的url。 4. 转发页面和转发到的页面共享request的信 阅读全文
摘要:
1、类加载过程 1.1、加载 查找和导入class文件。 1.2、链接 验证 检验载入的class文件的正确性,完整性。 准备 给类的静态变量分配存储空间,会赋对象类型的默认值。 解析 将class常量池中的符号引用转换成直接引用。 符号引用和直接引用的区别: 符号引用:java编译阶段不知道所引用 阅读全文
摘要:
1、锁状态 锁的状态只能升级不能降级。 无锁 没有锁对资源进行锁定,所有线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。其他修改失败的线程会不断重试,直到修改成功,如CAS原理和应用是无锁的实现。 偏向锁 偏向锁是指一段同步代码一直被一个线程访问,那个该线程会自动获取锁,降低获取锁的代价 阅读全文
摘要:
1、五种阻塞队列介绍 ArrayBlockingQueue 有界队列,底层使用数组实现,并发控制使用ReentrantLock控制,不管是插入操作还是读取操作,都需要获取锁之后才能执行。 LinkedBlockingQueue 底层基于单向链表实现,既可以当做有界队列,也可以当做无界队列使用。使用两 阅读全文
摘要:
1、ArrayList的扩容机制 1. 每次扩容是原来容量的1.5倍,通过移位的方法实现。 2. 使用copyOf的方式进行扩容。 扩容算法是首先获取到扩容前容器的大小。然后通过oldCapacity (oldCapacity 1) 来计算扩容后的容器大小newCapacity。这里用到了 右移运算 阅读全文
摘要:
本次整理的内容如下: 1、进程与线程的区别 进程是一个可执行的程序,是系统资源分配的基本单位;线程是进程内相对独立的可执行单元,是操作系统进行任务调度的基本单位。 2、进程间的通信方式 2.1、操作系统内核缓冲区 由于每个进程都有独立的内存空间,进程之间的数据交换需要通过操作系统内核。需要在操作系统 阅读全文