06 2021 档案
摘要:内存分配 对象优先在Eden区分配 大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时
阅读全文
摘要:经典收集器 虽然我们会对各个收集器进行比较,但并非为了挑选一个最好的收集器出来。垃圾收集器的技术在不断进步,但直到现在还没有最好的收集器出现,更加不存在“万能”的收集器,所以我们选择的只是对具体应用最合适的收集器。 图1-1展示了七种作用于不同分代的经典收集器,如果两个收集器之间存在连线,就说明它们
阅读全文
摘要:概述 给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。 这里说的数据包括但不限于异常堆栈、虚拟机运行日志、垃圾收集器日志、线程快照(threaddump/javacore文件)、 堆转储快照(heapdump/hprof文件)等。恰当地使用虚拟机故障处理、分
阅读全文
摘要:硬件的效率与一致性 “让计算机并发执行若干个运算任务”与“更充分地利用计算机处理器的效能”之间的因果关系,看起来理所当然,实际上它们之间的关系并没有想象中那么简单。处理器至少要与内存交互,如读取运算数据、存储运算结果等,这个I/O操作就是很难消除的(无法仅靠寄存器来完成所有运算任务)。由于计算机的存
阅读全文
摘要:线程安全 这里讨论的线程安全,将以多个线程之间存在共享数据访问为前提,Java语言中各种操作共享的数据可分为五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。我们通常意义上所讲的线程安全其实是相对线程安全,它需要保证对这个对象单次的操作是线程安全的,我们在调用的时候不需要进行额外的保障措
阅读全文
摘要:###Javac编译器 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器。 解析与填充符号表过程,包括: 词法、语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树。 填充符号表,产生符号地址和符号信息。 插入式注解处理器的注解处理过程。可以把插入
阅读全文
摘要:####类与类加载器 对于任意一个类,必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。同一个类,如果由两个不同的类加载器加载,那么这两个类便不相等。这里的相等包括代表类的Class 对象的equals()方法、isAssigna
阅读全文
摘要:概述 任何一个Class文件都对应着唯一的一个类或接口的定义信息,但类或接口并不一定都得定义在文件里(比如类或接口也可以动态生成,直接送入类加载器中)。Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,这使得整个Class文件中
阅读全文
摘要:概述 当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。 对象内存布局 在HotSpot
阅读全文
摘要:二叉树遍历 若将二叉树分为根节点,左子树,右子树三部分,则前中后序便对应根节点的访问次序。 1 前序遍历 先访问根节点,然后前序遍历左子树,再前序遍历右子树。 2 中序遍历 从根节点开始,先中序遍历左子树,然后访问根节点,再中序遍历右子树,整个访问次序为从左到右。 3 后序遍历 从根节点开始,从左到
阅读全文
摘要:###分代收集理论 当前JVM的GC,大多遵循分代收集理论进行设计,分代收集实质为一套符合大多数程序实际运行情况的经验法则,建立在两个分代假说上: 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。 强分代假说(Strong Generational
阅读全文
摘要:####JVM运行时内存区域 Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域用途各异,创建和销毁的时间也不尽相同。根据<<Java虚拟机规范>> 规定,Java虚拟机所管理的内存将包括以下几个运行时数据区域。 ####程序计数器 程序计算器是一块较小
阅读全文