Java
文章平均质量分 86
Silseven
这个作者很懒,什么都没留下…
展开
-
Java并发编程——锁(干货满满)
锁synchronizedLock接口队列同步器可重入锁(ReentrantLock)本文参考了黑马JUC并发编程Java并发编程的艺术深入理解java虚拟机synchronized在讲锁之前,先回顾一下synchronized的知识在java中,最基本的互斥同步就是synchronized关键字。这是一种块结构(Block Structured)的同步语法。其经过Javac编译后,会分别形成monitorenter和monitorexit两个字节码指令。两者都需要一个reference类型的原创 2021-10-12 16:40:35 · 361 阅读 · 0 评论 -
Java并发编程——线程状态与线程方法
线程状态与线程方法NEWRUNNABLENEW当线程刚被创建时且还没有调用start()方法时,线程就处于NEW状态。System.out.println(s.getState());s.start();System.out.println(s.getState());NEWRUNNABLE我们顺便也复习一下线程创建的几种方式:通过继承Thread,并实现其run方法可以通过子类普通的继承: public class threadTest extends Thread{ @原创 2021-09-22 15:35:50 · 94 阅读 · 0 评论 -
线程安全与锁优化(2)——锁优化
线程安全与锁优化(1)——锁优化自旋锁与自适应自旋锁消除接上篇文章:线程安全与锁优化(1)写在最前,本篇文章基本上来源于 《深入理解Java虚拟机》 并发部分 的提炼,并附带自己的理解,主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。自旋锁与自适应自旋自旋锁互斥同步在性能上的影响主要来源于阻塞,即挂起线程和恢复线程的操作都转入内核态实现。然而,大多数情况下,共享数据的锁定只会持续很短的一段时间,为了这段时间进行大开销的工作并不值原创 2021-09-22 14:13:36 · 154 阅读 · 0 评论 -
MySQL实战45讲 笔记(4)
深入浅出索引(上)索引的常见模型写在最前,本篇文章来源于对MySQL实战45讲的笔记,主要是为了帮助自己理解。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。本文并非对文章的直接复制,并且肯定有理解不到位的情况,如果希望系统地学习,还是要去官网支持原作者。注意:最好拥有一定的MySQL基础再来看本系列文章,可以去b站搜索动力节点的mysql基础教程,或者翻看我做的走进MySQL系列(笔记做的并不是特别详尽,仅作为参考)索引的常见模型一句简单的话来说,索引的出现就是为了原创 2021-09-21 15:56:34 · 207 阅读 · 0 评论 -
JVM深入理解(6)——垃圾回收(6)
G1垃圾回收器*G1回收器:区域化分代式特点适用场景Region回收细节理解垃圾回收之前记忆集三色标记法增量更新(Incremental Update)原始快照(SATB)写屏障TAMS(Top at Mark Start)G1回收过程由于G1垃圾回收器比较复杂,所以单拉出一篇来细讲。本文参考了诸多文章:G1垃圾回收器详解G1 垃圾回收器JVM(四) G1 收集器工作原理介绍三色标记法与读写屏障G1垃圾收集器详解以及b站尚硅谷的课程。G1回收器:区域化分代式既然已经有了强大GC,为什么发原创 2021-09-20 10:57:18 · 244 阅读 · 0 评论 -
再剖析java基础——内部类
内部类成员内部类局部内部类匿名内部类静态内部类写在前面,本文有部分内容引用自***java核心技术***成员内部类内部类就是构建于一个类里面的类。内部类的特点:不仅可以访问自身的数据域,还可以引用其外部类的变量(包括私有变量)public class outerClass { private int privateNum=0; public int publicNum=1; public class innerClass{ int number;原创 2021-09-17 20:06:40 · 67 阅读 · 0 评论 -
JVM深入理解(6)——引用
引用*介绍强引用(StrongReference)软引用(SoftReference)- 内存不足即回收代码示例弱引用(WeakReference)- 发现即回收虚引用(PhantomReference)终结器引用(FinalReference)写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。介绍JDK1.2后,java对引用的概念进行了扩充,分为强引用、软原创 2021-09-11 22:06:26 · 151 阅读 · 0 评论 -
JVM深入理解(6)——垃圾回收(4)
垃圾回收相关概念概述* System.gc()的理解内存溢出与内存泄漏内存溢出(OOM)内存泄漏(Memory Leak)Stop The World垃圾回收的并行与并发并发并行对比写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。System.gc()的理解通过System.gc()或Runtime.getRuntime().gc()的调用,会显式触发Fu原创 2021-09-11 12:10:46 · 88 阅读 · 0 评论 -
JVM深入理解(6)——垃圾回收(3)
垃圾回收算法(2)* 写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。...原创 2021-09-10 16:40:17 · 78 阅读 · 0 评论 -
JVM深入理解(6)——垃圾回收(2)
垃圾回收算法* 标记阶段对象存活判断标记方法一:引用计数算法标记方法一:可达性分析算法(根搜索算法、追踪性垃圾收集)对象的finalization生存还是死亡?写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。两阶段:标记阶段–>清除阶段标记阶段对象存活判断在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存原创 2021-09-09 20:31:55 · 73 阅读 · 0 评论 -
JVM深入理解(3)——运行时数据区(6)
方法区栈、堆、方法区的交互关系方法区的基本理解Hotspot中方法区演进方法区大小与OOM如何解决OOM?方法区内部结构方法区使用举例写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。栈、堆、方法区的交互关系左上角理解:类的结构Person加载到方法区new出来的对象放在堆空间中person变量存放在栈帧中的局部变量表中局部变量表中的引用指向堆中的具原创 2021-09-08 19:22:56 · 69 阅读 · 0 评论 -
JVM深入理解(6)——垃圾回收(1)
垃圾回收概述* 什么是垃圾常见面试题为什么需要GCJava内存自动管理写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。什么是垃圾关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然原创 2021-09-08 13:36:51 · 93 阅读 · 0 评论 -
JVM深入理解(5)——字符串常量池
字符串常量池* String基本特性String的内存分配字符串拼接操作代码示例写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。String基本特性两种定义方式使用字面量直接赋值new生成对象声明为 final 不可被继承JDK1.8及之前用char[]数组存储。JDK1.9之后使用byte[]数组容器存储。为什么要改?1.8及原创 2021-09-08 12:35:00 · 274 阅读 · 0 评论 -
JVM深入理解(4)——执行引擎(2)
JIT编译器问题如何选择?方法调用计数器热度衰减回边计数器问题既然已经内置了JIT编译器,为什么还使用解释器来拖累执行性能呢?程序启动后,解释器可以马上执行,省去编译时间。即响应速度快。编译器需要将代码编译为本地代码,需要一定执行时间,但编译完成后,执行效率高。在此模式下,当Java虚拟器启动时,解释器可以首先发挥作用,而不必等待即时编译器全部编译完成后再执行,这样可以省去许多不必要的编译时间。随着时间的推移,编译器发挥作用,把越来越多的代码编译成本地代码,获得更高的执行效率。同时,解释执行在编原创 2021-09-06 16:56:56 · 68 阅读 · 0 评论 -
JVM深入理解(4)——执行引擎(1)
执行引擎概述概述java代码编译和执行的过程机器码、指令、汇编语言机器码指令汇编语言字节码解释器分类写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。概述执行引擎是jvm核心的组成部分之一虚拟机是相对于物理机的概念,两者都有代码执行能力。区别在于物理机的执行引擎直接建立在处理器、缓存、指令集和操作系统层面上,而虚拟机的执行引擎是由软件自行实现的。因此不受物原创 2021-09-06 16:12:46 · 103 阅读 · 0 评论 -
JVM深入理解——直接内存
直接内存简介问题写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。简介为什么要讲它?JDK8以后,使用元空间,元空间使用的就是本地(直接)内存。直接内存不是运行时数据区的一部分,也不是JVM规范中定义的内存区域。它是在Java堆外,直接向系统申请内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内原创 2021-09-06 14:46:10 · 249 阅读 · 0 评论 -
对象实例化内存布局与访问定位
对象实例化内存布局与访问定位常见面试题对象的实例化创建对象的方式创建对象的步骤对象的内存布局对象头实例数据对齐填充图示表示对象的访问定位写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。常见面试题对象的实例化创建对象的方式new: 直接new;静态方法返回;Class的newInstance()方法: 反射的方式,只能调用空参的构造器,权限必须为p原创 2021-09-05 20:54:50 · 102 阅读 · 0 评论 -
JVM深入理解(3)——运行时数据区(5)
堆概述内存细分内存大小与OOM年轻代与老年代对象分配过程GC接上篇文章虚拟机栈继续讲解。写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。概述一个JVM实例仅存在一个堆内存。在JVM启动时就被创建,空间大小也被确定了,是JVM管理的最大内存空间。(大小可以调节)JVM规范:堆可以处于物理上不连续的内存空间中,但逻辑上是连续的(链表?)所有线程共享jav原创 2021-09-03 17:14:40 · 93 阅读 · 0 评论 -
JVM深入理解(3)——运行时数据区(4)
本地方法介绍什么是本地方法?为什么使用?本地方法栈接上篇文章虚拟机栈继续讲解。写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。介绍什么是本地方法?native method就是java调用非java代码的接口,并非由java语言实现。定义本地方法时,用native修饰即可,而不需要用java代码写方法体。(native不能与abstract同用)为什原创 2021-08-30 17:22:24 · 65 阅读 · 0 评论 -
JVM深入理解(3)——运行时数据区(3)
虚拟机栈背景基本内容栈的存储单位栈运行原理栈帧的内部结构接上篇文章程序计数器继续讲解。写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。背景由于跨平台的设计,Java指令都是栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的。优点:跨平台、指令集小、编译器容易实现缺点:性能下滑、实现同样功能需要更多指令栈是运行时的单位,而堆是存储的单位即原创 2021-08-30 17:01:49 · 83 阅读 · 0 评论 -
栈帧——方法返回地址
方法返回地址介绍介绍存放调用该方法的pc寄存器的值无论通过哪种方式退出一个方法,都要回到该方法被调用的位置。正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。异常退出时,返回地址通过异常表来确认,栈帧一般不会保存此信息。当执行引擎遇到任意方法返回的字节码指令(return),会有返回值传递给上层的方法调用者。注:一个方法调用完成后使用哪一个返回指令需要根据方法返回值的实际类型而定。包括ireturn, lreturn, freturn, dreturn, a原创 2021-08-30 15:16:08 · 1411 阅读 · 0 评论 -
栈帧——动态链接
动态链接介绍代码说明介绍每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用就是为了支持当前方法的代码能够实现动态链接。在java源文件被编译到字节码文件中时,所有变量和方法引用都作为符号引用保存在class文件的常量池里。比如:描述一个方法调用了另外方法时,就是通过常量池中指向方法的符号引用来表示的。动态链接就是把符号引用转为调用方法的直接引用的过程代码说明在console中,调用javap -v xx.class解析任一字节码文件,我们可以得到一个常量池:我们查原创 2021-08-30 14:30:47 · 2712 阅读 · 0 评论 -
栈帧——操作数栈
操作数栈介绍代码说明介绍操作数栈也称表达式栈在方法执行过程中,根据字节码指令,往栈里写入数据或提取数据,即入栈/出栈。某些字节码指令把值压入操作数栈,其余指令将操作数取出栈。使用他们后再把结果压入栈。比如:执行复制、交换、求和等操作。操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中临时的存储空间。操作数栈是JVM执行引擎的一个工作区,当一个方法刚开始执行得时候,一个新的栈帧也会随之被创建出来,其操作数栈是空的。每一个操作数栈都会有一个明确的栈深度用于存储数值,最大深度在编译器就原创 2021-08-28 14:50:25 · 2870 阅读 · 1 评论 -
栈帧——局部变量表
局部变量表介绍关于Slot的理解介绍局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,包括:基本数据类型、对象引用,以及returnAddress。由于局部变量建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题。容量大小在编译期确定,保存在方法code属性的maxium local variables数据项中,方法运行期间不会改变。通过javap -v xx.class 查看:或者从jclasslib插件查看:方法嵌套的调用次数由栈和栈帧的大小决定。栈越原创 2021-08-27 17:08:15 · 583 阅读 · 0 评论 -
JVM深入理解(3)——运行时数据区(2)
程序计数器(PC寄存器)介绍举例说明两个面试常见问题介绍程序计数寄存器(Program Counter Register)中,寄存器的命名来源于CPU的寄存器,寄存器储存指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。并非是物理意义上的寄存器,而是对物理PC寄存器的一种抽象模拟。也称程序钩子。PC寄存器用来存储指向下一条指令的地址。即将要执行的指令代码。由执行引擎读取下一条指令。PC寄存器特征很小的内存空间,小到可以几乎忽略不计,运行速度最快。每个线程都有其私有的程序计数器,生命周原创 2021-08-27 13:19:10 · 62 阅读 · 0 评论 -
JVM深入理解(3)——运行时数据区(1)
JVM深入理解(3)——运行时数据区(1)Native关键字写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程和狂神的jvm入门篇的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。Native关键字凡是带了native关键字,就说明java的作用范围无法达到,会进入本地方法栈。并调用本地方法接口:Java Native Interface JNI。然后调用本地方法库JNI:扩展java的使用,融合不同编程语原创 2021-08-26 17:51:16 · 77 阅读 · 0 评论 -
JVM深入理解(2)——类加载子系统(3)
JVM深入理解(2)——类加载子系统(3)双亲委派机制*(面试考点)沙箱安全机制写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。双亲委派机制*(面试考点)JVM对class文件采用按需加载的方式,并采用双亲委派模式,即把请求交给父类处理。双亲委派模式:如果一个类加载器收到了类加载请求,并不会自己先去加载,而是委托给父类加载器执行;循环执行1,直到达到原创 2021-08-26 00:05:57 · 79 阅读 · 0 评论 -
JVM深入理解(2)——类加载子系统(2)
JVM深入理解(2)——类加载子系统(2)类加载器的分类启动类加载器扩展类加载器应用程序类加载器获取ClassLoader方式写在最前,本篇文章大部分来源于b站尚硅谷JVM全套教程的提炼,并附带自己的理解。主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。类加载器的分类JVM支持引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。其中JVM规范将所有派生于抽象类原创 2021-08-25 20:09:07 · 89 阅读 · 0 评论 -
线程安全与锁优化(1)——线程安全
线程安全与锁优化(1)——线程安全概述Java语言中的线程安全线程安全的实现方法互斥同步接上篇文章:Java内存模型与线程(3)写在最前,本篇文章大部分来源于 《深入理解Java虚拟机》 并发部分 的提炼,并附带自己的理解,主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。概述面向过程的编程思想:程序员将数据和过程分别作为独立的部分考虑,数据代表问题空间的客体,程序代码用于处理数据,站在计算机的角度抽象问题和解决问题。面向对象的编程思原创 2021-08-25 15:54:39 · 133 阅读 · 0 评论 -
JVM深入理解(2)——类加载子系统(1)
JVM深入理解(2)——类加载子系统(1)原创 2021-08-24 15:37:47 · 121 阅读 · 0 评论 -
JVM深入理解(1)——概述
JVM深入理解(1)——概述JVM:跨语言的平台虚拟机与Java虚拟机虚拟机Java虚拟机JVM的位置JVM的整体结构*Java代码执行流程JVM的生命周期启动执行退出写在最前,本篇文章大部分来源于 《深入理解Java虚拟机》 以及b站尚硅谷JVM全套教程的提炼,并附带自己的理解,主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。JVM:跨语言的平台Java虚拟机不关心内部程序是否由java语言编写,只要相应的编程语言编译出来的字节码文件原创 2021-08-23 14:53:53 · 207 阅读 · 1 评论 -
Java内存模型与线程(3)——Java与协程
Java内存模型与线程(3)——Java与协程接上篇文章:Java内存模型与线程(2)原创 2021-08-22 19:50:19 · 131 阅读 · 0 评论 -
Java内存模型与线程(2)——Java与线程
Java内存模型与线程(2)——Java与线程线程的实现接上篇文章:Java内存模型与线程(1)写在最前,本篇文章大部分来源于《深入理解Java虚拟机》 并发部分 的提炼,并附带自己的理解,主要是为了帮助自己理解,和用于复习。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。线程的实现线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源,又可以独立调度。目前线程是java中进行处理器资源调度的最基本单位。Ja原创 2021-08-22 16:22:11 · 77 阅读 · 0 评论