摘要:
前言: 关于 JVM 垃圾回收机制面试中主要涉及这三个考题: JVM 中有哪些垃圾回收算法?它们各自有什么优劣? CMS 垃圾回收器是怎么工作的?有哪些阶段? 服务卡顿的元凶到底是谁? 虽然 Java 不用“手动管理”内存回收,代码写起来很顺畅。但是你有没有想过,这些内存是怎么被回收的?其实,JVM 阅读全文
摘要:
堆(heap)是一个巨大的对象池。在这个对象池中管理着数量巨大的对象实例。而池中对象的引用层次,有的是很深的。一个被频繁调用的接口,每秒生成对象的速度,也是非常可观的。对象之间的关系,形成了一张巨大的网。虽然 Java 一直在营造一种无限内存的氛围,但对象不能只增不减,所以需要垃圾回收。 那 JVM 阅读全文
摘要:
屏幕适配一直是困扰 Android 开发工程师的一大问题,但是随着近几年各种屏幕适配方案的诞生,以及谷歌各种适配控件的推出,屏幕适配也显得越来越容易,这节课我们就来总结一下关于屏幕适配的那些技巧。 ConstraintLayout 很多工程师不太喜欢使用 ConstraintLayout,感觉 Co 阅读全文
摘要:
不管工作几年的 Android 工程师,或多或少都听说过 Window 的概念,并且隐隐约约感觉它在 Activity 与 View 之间应该发挥着某种连接的作用。但是如果需要说出这 3 者之间的关系,多数工程师不知道从何下手。 Activity 的 setContentView Activity 阅读全文
摘要:
我们来看一下 startActivity 过程的具体流程。在手机桌面应用中点击某一个 icon 之后,实际上最终就是通过 startActivity 去打开某一个 Activity 页面。我们知道 Android 中的一个 App 就相当于一个进程,所以 startActivity 操作中还需要判断 阅读全文
摘要:
JVM 通过加载 .class 文件,能够将其中的字节码解析成操作系统机器码。那这些文件是怎么加载进来的呢?又有哪些约定?接下来我们就详细介绍 JVM 的类加载机制,同时介绍三个实际的应用场景。 我们首先看几个面试题。 我们能够通过一定的手段,覆盖 HashMap 类的实现么? 有哪些地方打破了 J 阅读全文
摘要:
首先,第一个问题:JVM的内存区域是怎么高效划分的?这也是一个高频的面试题。很多同学可能通过死记硬背的方式来应对这个问题,这样不仅对知识没有融会贯通在面试中还很容易忘记答案。 为什么要问到 JVM 的内存区域划分呢?因为 Java 引以为豪的就是它的自动内存管理机制。相比于 C++的手动内存管理、复 阅读全文
摘要:
Java 程序到底是如何执行的? JVM 和操作系统的关系 工程师就相当于铸剑的剑师,JVM 便是剑炉。 JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操 阅读全文
摘要:
动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。那么如何实现动态代理?JDK Proxy 和 CGLib 有什么区别? 动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的 阅读全文
摘要:
使用克隆可以为我们快速地构建出一个已有对象的副本,那么什么是浅克隆和深克隆?如何实现克隆? 浅克隆(Shadow Clone)是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变量为引用对象,则此引用对象的地址是 阅读全文
摘要:
在并发编程中有两个重要的概念:线程和锁,多线程是一把双刃剑,它在提高程序性能的同时,也带来了编码的复杂性,对开发者的要求也提高了一个档次。而锁的出现就是为了保障多线程在同时操作一组资源时的数据一致性,当我们给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。那么如何手 阅读全文
摘要:
在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。 那么 阅读全文
摘要:
线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。但如果要说线程池的话一定离不开 ThreadPoolExecutor。线程池不允许使用 Executor 阅读全文
摘要:
线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,也因此被称为轻量级的进程。 线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中 阅读全文
摘要:
HashMap 底层是如何实现的?在 JDK 1.8 中它都做了哪些优化? 在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,它的组成结构如下图所示: 数组中的元素我们称 阅读全文
摘要:
以主流的 JDK 版本 1.8 来说,String 内部实际存储结构为 char 数组,源码如下: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 用于存 阅读全文
摘要:
一、上篇文章提到自定义processor中用到AutoService 文章中我们用到了AutoService, 使用@AutoService(Processor.class),编译后 二、javapoet常用api JavaPoet是square推出的开源java代码生成框架,提供Java Api生 阅读全文