摘要:
Java 内存模型(Java Memory Model,JMM)名字看上去和 Java 内存结构(JVM 运行时内存结构)差不多,但这两者并不是一回事。JMM 并不像 JVM 内存结构一样是真实存在的,它只是一个抽象的概念。 Java 的线程间通过共享内存(Java堆和方法区)进行通信,在通信过程中 阅读全文
摘要:
垃圾收集器为垃圾收集算法的具体实现,是执行垃圾收集算法的,是守护线程。 HotSpot 虚拟机采用分代收集(JVM 规范并未对堆区进行划分),将堆分为年轻代和老年代,垃圾收集器也按照这样区分。不过已有通用垃圾收集器出现。 一、新生代垃圾收集器 Serial 垃圾收集器(单线程) 在垃圾收集过程中停止 阅读全文
摘要:
程序计数器、虚拟机栈、本地方法栈随线程而生,随线程而灭。 栈帧随着方法的开始而入栈,随着方法的结束而出栈。 这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。 对于 Java 堆和方法区,只有在程序运行期间才能知道会创 阅读全文
摘要:
一、sun.misc.Launcher (ExtClassLoader 与 AppClassLoader 的创建) public Launcher() { Launcher.ExtClassLoader var1; try { var1 = Launcher.ExtClassLoader.getEx 阅读全文
摘要:
类的生命周期中的第一步,就是要被 JVM 加载进内存,类加载器就是来干这件事。 一、类加载器种类 系统提供了 3 种类加载器: 1.启动类加载器(Bootstrap ClassLoader) 由 C 和 C++ 编写,是在 JVM 启动后初始化的。可在这里查看到源码(OpenJDK):https:/ 阅读全文
摘要:
由于 select 没有选中事件(onchange 事件在内容改变时才会触发,选择同一个条目不会触发),只好用其他控件来实现。 <!doctype html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Select</title> < 阅读全文
摘要:
类从被加载到虚拟机内存开始,到卸载出内存为止。 解析阶段在某些情况下可以在初始化后再开始,这是为了支持 Java 语言的运行时绑定。 一、类加载时机 JVM 规范没有强制约束类加载过程的第一阶段(加载)什么时候开始,但对于“初始化”阶段,有着严格的规定。 1.1.有且仅有 5 种情况必须立即对类进行 阅读全文
摘要:
Java 虚拟机定义了在程序执行期间使用的各种运行时数据区域。 其中一些数据区域所有线程共享,在 Java 虚拟机(JVM)启动时创建,仅在 Java 虚拟机退出时销毁。 还有一些数据区域是每个线程的。线程数据区域是在线程启动时创建,线程结束时销毁。 一、运行时数据区划分(JDK8) 1、The p 阅读全文
摘要:
一、Lambad @FunctionalInterface interface Calculator { int add(int a, int b); default int add(long a, int b) { return (int) a + b; } } public static voi 阅读全文
摘要:
一、 使用 while(true) 和 sleep 实现 new Thread(){ @Override public void run() { while (true) { System.out.println("Hello!"); try { Thread.sleep(1000); } catc 阅读全文
摘要:
3.InnoDB space file 布局的基础知识: InnoDB 如何构建 space file 及其包含的 page InnoDB 的数据存储模型使用 space,在 MySQL 中通常称为 tablespace,在 InnoDB 中有时称为 file space。在操作系统层面,一个 sp 阅读全文
摘要:
一、sleep() 与 wait() 两者都会让当前线程进入等待状态。唤醒后都需要等待 CPU 资源,不一定会立即执行。若在等待期间被调用此线程的的 interrupt() 方法,将会产生 InterruptedException 异常。 wait() 是 Object 类的方法,会释放对象锁,并让 阅读全文
摘要:
一、Serializable 要序列化对象需要实现 Serializable 接口 // lombok 插件,省去 get,set 方法,构造器方法 @Data @AllArgsConstructor public class Person implements Serializable { pri 阅读全文
摘要:
如果一个对象的状态在构造后不能改变,则该对象被认为是不可变的。例如 String。 不可变对象在并发应用程序中特别有用。由于它们不能改变状态,因此它们不会被线程干扰破坏或在不一致状态下被观察到。 定义一个普通同步类(可变对象) package com.example.Immutable; publi 阅读全文
摘要:
通常,创建线程的执行单元有两种,一种是直接继承 Thread,另外一种就是实现 Runnable 接口。 但这两种都有一个问题就是无法有返回值,且子线程在执行过程中无法抛出异常。想线程有返回值,可以使用 Callable 来创建执行单元。 Runnable 一个接口,没有返回值 @Functiona 阅读全文