自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(174)
  • 收藏
  • 关注

原创 我所知道Netty之初识NIO与它的Buffer介绍

一、Java NIO (New IO )基本介绍Java NIO(New IO)也有人称之为 java non-blocking IO是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO APINIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO进行相关操作NIO将以更加高效的方式进行文件的读写操作。NIO可以理解为非阻塞IO,传统的IO的read和write只能阻塞执行,在BIO中可以看到当线程在读写IO期间不能干其他

2021-12-31 17:18:52 648

原创 我所知道Netty之BIO下的群聊

一、Java BIO模式下的端口转发思想之前的案例当中我们都是由客户端发送消息到服务端,由服务端接受消息进行消息处理但是实际开发当中我们可能有其他需求,比如说QQ消息并不是直接发给服务端就完事了,它希望消息给对方或者说做网游的时候这个消息怎么给其他玩家看到呢?这就涉及到端到端的通信,那端到端的通信也涉及到服务器的,以QQ为例子,它的消息发送到QQ的服务器,又由服务端转发到客户端,我们把这种称为端口转发思想现在我们有一个需求:需要实现一个客户端的消息可以发送给所有的客户端去接收(群聊实现)我们的

2021-12-30 11:12:57 582

原创 我所知道Netty之多多认识BIO

针对于BIO的多多认识、通过聊天室认识

2021-12-29 15:37:38 628

原创 我所知道Netty之初识BIO、NIO、AIO

针对于Netty的基础BIO、NIO、AIO

2021-12-29 10:43:25 1979

原创 我所知道并发编程之死锁

前言前篇文章在讲解线程安全的时候,有提到过为了保证每个线程都能正常执行共享资源操作,Java引入了锁机制虽然这样使多线程改善了系统的处理能力,然而也带来了新的问题,其中之一:死锁什么是死锁所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进死锁产生的条件以下将介绍死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁互斥条件进程要求对所分配的资源(如打印机〉进行排他性控制,即在一段时间内某资源仅为一个进程所

2021-05-30 15:52:39 153 1

原创 我所知道并发编程之线程安全问题

前言前几篇文章讲解了线程的生命周期,以及会进入不同的阶段与每个阶段做了什么事情那么接下来我们要介绍的是线程安全问题,那么什么是线程安全问题?什么是线程安全问题我们这里举例的是多个线程同时运行,并同一个实现了Runnable的接口的类程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。反之则是线程不安全的问题演示为了演示线程安全问题,我们采用多线程模拟多个窗口同时售卖影票public class Ticket implements Runnable

2021-05-30 11:09:21 450 6

原创 我所知道JVM虚拟机之类的加载器五(沙箱与自定义加载器)

前言本篇文章介绍一些什么是沙箱机制和自定义加载器有什么好处和怎么操作沙箱安全机制沙箱安全机制主要有以下特征保证程序安全保护Java原生的JDK代码Java安全模型的核心就是Java沙箱(sandbox)什么是沙箱?沙箱是一个限制程序运行的环境沙箱机制就是将]ava代码限定在虚拟机(JVN)特定的运行范围中,并且严格限制代码对本地系统资源访问通过这样的措施来保证对代码的有限隔离,防止对本地系统造成破坏。沙箱主要限制系统资源访问,那系统资源包括什么?CPU、内存、文件系统、网络不同级别

2021-05-28 11:10:20 194 4

原创 我所知道JVM虚拟机之类的加载器四(双亲委派)

前言本篇文章我们讲解双亲委派模型,以及面试中问到的是否准守,怎么破坏呢?定义和本质类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用双亲委派机制,这种机制能更好地保证Java平台的安全如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回。只有父类加载器无法完成此加载任务时,才自己去加载。由此可见我们的顺序是引导类加载器先加载,若加载不到,由扩展类加载器加载

2021-05-28 09:54:44 171 5

原创 我所知道JVM虚拟机之类的加载器三(ClassLoader)

前言前几篇文章讲解类的加载器分类,本篇文章我们就要测试不同的类加载器、以及分析源码测试不同的类加载器每个Class对象都会包含一个定义它的ClassLoader的一个引用获取ClassLoader有以下几种途径方法,如下:获取当前类的ClassLoader:clazz.getClassLoader()获取当前线程上下文的ClassLoader:Thread.currentThread().getContextClassLoader()获取系统的ClassLoader:ClassLoader.g

2021-05-26 16:01:49 133 2

原创 我所知道JVM虚拟机之类的加载器二(类的加载器分类)

前言本篇文章复习加载器,回顾回顾类的加载器分类JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoade)自定义类加载器(User-Defined classLoader)从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器结构主要是如下情况:除了顶层的启动类加载

2021-05-22 14:24:39 111 2

原创 我所知道JVM虚拟机之类的加载器一(概述)

前言前几篇文章讲解的类的生命周期,主要讲解加载、链接、初始化、卸载阶段对于加载阶段主要做的事情是:用类加载器将类二进制流的数据(5种方式)读到方法区,形成类模板数据(Java类模型),同时创建Java.lang.Class类的实例我们这里示例Order类,请看如下图所示那么在加载阶段使用到了类的加载器,其后的链接、初始化、卸载阶段是没有关系的接下来我们就对类加载器进行一个简单的概述类加载器的概述我们说类加载器是JVM执行类加载机制的前提,并且说所有的Class都是使用ClassLoader进

2021-05-21 11:22:07 102

原创 我所知道JVM虚拟机之类的生命周期四(unloading 卸载阶段)

前言前边几篇文章讲解了类的生命周期之加载,链接,初始化阶段,接下来我们要说说的是卸载阶段那么想要讲解卸载阶段,那么就要搞懂类、类加载器、类的实例之间的引用关系比如说此时有一个示例Sample类此时我们当Sample类被加载、链接和初始化后,它的生命周期就开始了。当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期注意:一个类何时结束生命周期,取决于代表它的Class对象何时结束生命

2021-05-20 10:40:41 244

原创 我所知道JVM虚拟机之类的生命周期三(lnitialization 初始化阶段)

前言从本篇开始我们进入到初始化阶段,这是类加载器的最后一个阶段,如果前面步骤都没有问题, 那么类就可以顺利的装在到系统到中。具体描述初始化阶段,简言之,为类的静态变量赋予正确的初始值,到了初始化阶段,才真正开始执行类中定义的Java程序代码初始化阶段的重要工作是执行类的初始化方法:<clinit>()方法该方法仅能由Java编译器生成并由JVM调用,程序开发者无法自定义一个同名的方法更无法直接在Java程序中调用该方法,虽然该方法也是由字节码指令所组成它是由类静态成员的赋值语句

2021-05-19 10:44:42 150

原创 我所知道JVM虚拟机之类的生命周期二(Linking链接阶段)

前言前篇文章讲解了过程一加载阶段,接下来我们仅接着讲解第二阶段是怎么样的?环节一:验证阶段(Verification)当类加载到系统后,就开始链接操作,验证是链接操作的第一步它的目的是保证加载的字节码是合法、合理并符合规范的验证的步骤比较复杂,实际要验证的项目也很繁多,大体上Java虚拟机需要做以下检查,如图所示整体说明:验证的内容则涵盖了类数据信息的格式验证、语义检查、字节码验证、符号引用验证等其中格式检查会和加载阶段一起执行验证通过之后,类加载器才会成功将类的二进制数据信息加载到

2021-05-10 17:36:24 260

原创 我所知道JVM虚拟机之类的生命周期一(LoadKing加载阶段)

前言前篇文章内容我们讲解了有关于虚拟机的布局结构、垃圾回收器、以及字节码分析等等那么从本篇开始我们就要仔细讲讲类加载器,对于程序来说不一定是一个类,有可能还是接口,枚举类或者注解等等。这些都属于Java中的结构,我们都需要加载进来,加载过程称为类加载器接下来我们就针对于类加载过程,以及更加详细的过程是怎么样的?类的生命周期概述在Java中数据类型分为:基本数据类型和引用数据类型基本数据类型:虚揶机预先定义引用数据类型:则需要进行类的加载类的加载包括指:类、接口、注解、枚举类等等都可以称为

2021-05-04 16:51:43 207 1

原创 我所知道JVM虚拟机之字节码指令集与解析九(同步控制指令)

同步控制指令java虚拟机支持两种同步结构:方法级的同步方法内部一段指令序列的同步这两种同步都是使用monitor指令来支持的方法级的同步方法级的同步:是隐式的,即无须通过字节码指令来控制,它实现在方法调用和返回操作之中虚拟机可以从方法常量池的方法表结构中的 ACC_SYNCHRONIZED 访问标志得知一个方法是否声明为同步方法当调用万法时调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否设置若设置了访问标志执行线程将先持有同步锁,然后执行方法。最后在方法完成(无论是

2021-05-02 16:27:53 159

原创 我所知道JVM虚拟机之字节码指令集与解析五(方法调用指令与方法返回指令)

一、方法调用指令说明简要介绍方法调用指令:invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic简要方法调用介绍invokevirtual指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),支持多态。这也是Java语言中最常见的方法分派方式。invokeinterface指令用于调用接口方法,它会在运行时搜索由特定对象所实现的这个接口方法,并找出适合的方法进行调用。invokespeci

2021-05-01 12:15:01 158 1

原创 我所知道JVM虚拟机之字节码指令集与解析三(类型转换指令)

前言本篇文章继续学习字节码指令集中的类型转换指令,看看具体指令是怎么操作数据类型转换?一、类型转换指令的概述类型转换指令可以将两种不同的数值类型进行相互转换这些转换操作一般用于实现用户代码中的显式类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。主要有以下两种类型转换:宽化类型转换与窄化类型转换二、类型转换指令的宽化类型转换Java虚拟机直接支持以下数值的宽化类型转换(widening numeric conversion,小范围类型向大范围类型的安全转

2021-05-01 12:07:35 155

原创 我所知道JVM虚拟机之字节码指令集与解析二(算数指令)

文章目录前言一、算数指令概述作用分类byte、short、char和booleanl类型说明运算时的溢出运算模式向最接近数舍入模式:向零舍入模式:NaN值使用二、算数指令的所有运算指令指令介绍三、算数指令的比较指令比较指令的说明举例比较参考文献前言前篇文章讲解了局部变量压栈指令、常量入栈指令以及出栈装入局部变量表指令,那么本篇文章接着讲解算数指令,让我们开始吧一、算数指令概述作用================================算术指令用于对两个操作数栈上的值进行某种特定运算,并

2021-05-01 12:00:01 180 3

原创 我所知道JVM虚拟机之字节码指令集与解析一(局部变量压栈、常量变量压栈、出栈局部变量表指令)

文章目录前言一、指令概述执行模型字节码与数据类型指令的分类二、加载与存储指令概述作用常见指令三、加载与存储指令的再谈操作数栈与局部变量表操作数栈(Operand Stacks)局部变量表(Local Variables)四、加载与存储指令的局部变量入栈指令五、、加载与存储指令的常量入栈指令const系列push系列指令ldc系列六、加载与存储指令的出栈指令参考资料前言前面我们讲解了Class文件的结构、以及采用不同的方式来解读Class文件第一种是采用字节码一行一行的解读、第二种是采用javap的

2021-05-01 11:57:26 259

原创 我所知道JVM虚拟机之Class文件结构三(JAVAP指令)

往期文章JVM——(1)为什么学习虚拟机JVM——(2)聊聊JVM虚拟机JVM——(3)类加载子系统JVM——(4)运行时数据区的概述与程序计数器(PC寄存器)JVM——(5)运行时数据区的虚拟机栈JVM——(6)运行时数据区的本地方法栈JVM——(7)运行时数据区的堆空间JVM——(8)运行时数据区的方法区JVM——(9)对象的实例化与访问定位JVM——(10)执行引擎JVM——(11)String Table(字符串常量池)JVM——(12)垃圾回收概述JVM——(13)垃圾回

2021-05-01 11:38:51 124

原创 我所知道JVM虚拟机之字节码指令集与解析八(异常处理指令)

一、异常处理的抛出异常指令概述:athrow指令在ava程序中显示抛出异常的操作(throw语句)都是由athrow指令来实现除了使用throw语句显示抛出异常情况之外,JVN规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。例如在之前介绍的整数运算时,当除数为零时虚拟机会在 idiv或ldiv指令中抛出ArithmeticException异常注意如下:正常情况下,操作数栈的压入弹出都是一条条指令完成的。唯一的例外情况是在抛异常时,Java虚拟机会清除操作数栈上的

2021-05-01 11:01:46 123 1

原创 我所知道JVM虚拟机之Class文件结构二(解读字节码)

解读字节码之旅接下来我们采用一个示例代码,编译成字节码文件进行解读解读public class Demo{private int num = 1;public int add(){num = num + 2;return num;}}我们将当前Demo类编译成字节码文件,并且使用notepad++和对应的插件打开翻译翻译,如下图image.png接下来我们把这些信息复制粘贴到一个text文档中,并在空格上进行,切割转为csv的格式image.pngimage.png由于一些csv

2021-04-29 22:35:19 200

原创 我所知道JVM虚拟机之字节码指令集与解析七(控制转移指令)

一、控制转移指令概述程序流程离不开条件控制,为了支持条件跳转,虚拟机提供了大量字节码指令,大体上可以分为比较指令、条件跳转指令、比较条件跳转指令、多条件分支跳转指令、无条件跳转指令等。前面我们也提到过有比较指令,指的是比较两个栈顶元素的大小,并将比较结果入栈比较指令有: dcmpg,dcmpl、fcmpg、fcmpl、lcmp与前面讲解的指令类似,首字符d表示double类型,f表示float,l...

2021-04-29 00:00:00 99

原创 我所知道JVM虚拟机之字节码指令集与解析六(操作数栈管理指令)

一、操作数栈管理指令的概述如同操作普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令可以直接用于操作操作数栈常见指令包括如下内容:将一个或两个元素从栈顶弹出,并且直接废弃,采用:pop、pop2指令将复制栈顶的一个或两个数值,并将复制值或双份的复制值重新压入栈顶,采用dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2指令将栈最顶端的两个Slot数值位置交换,采用:sw...

2021-04-27 00:00:00 312 1

原创 我所知道JVM虚拟机之字节码指令集与解析四(对象创建与访问指令)

一、对象创建与访问指令的概述Java是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的支持。有一系列指令专门用于对象操作,可进一步细分为创建指令、字段访问批令、数组操作指令、类型检查指令二、创建指令虽然类实例和数组都是对象,但ava虚拟机对类实例和数组的创建与操作使用了不同的字节码指令:创建类实例的指令:创建类实例的指令: new它接收一个操作数为指向Q量池的索引,表示要创建...

2021-04-23 00:00:00 128 1

原创 我所知道Reids之Windows系统搭建集群

前言公司项目有使用Reids进行缓存搭建,但是对于本机电脑并没有搭建对应的环境所以避免每次重复搭建环境,同时记录相应的步骤与一些坑。避免浪费时间与精力一、Reids环境搭建下载redis最新版本(版本必需要3.0以上)================================Redis cluster(redis集群)是在版本3.0后才支持的架构,和其他集群一样,都是为了解决单台服务器不够用...

2021-04-17 00:00:00 104

原创 我所知道JVM虚拟机之Class文件结构一(描述介绍)

前言前面众多文章有关讲解的都是些JVM的内存与垃圾回收器相关信息,那么对于本篇开始我们将把目光转移到Class文件与加载器身上去,去看看字节码文件里到底有些什么信息?是怎么加载到我们内存里?一、Class文件的概述字节码文件的跨平台性================================Java 语言:跨平台性(write one run anywhere)当Java源代码成功编译成字节...

2021-04-13 00:00:00 194

原创 我所知道JVM虚拟机之垃圾回收器详细篇

前言上篇文章对垃圾回收器进行了概述讲解,那么本篇开始将具体了解垃圾回收器一、GC的分类和性能指标垃圾回收器概述我们说垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本我们从不同角度分析垃圾收集器,可以将GC分为不同的类型Java不同版本新特性语法层面:Lambda表达式、switch、自动拆...

2021-04-10 00:00:00 167

原创 我所知道JVM虚拟机之垃圾回收相关概念的概述

前言从本篇开始我们正式讲解垃圾回收的相关知识了,让我们开始吧一、System.Gc的理解在默认情况下通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效)简单的意思说提醒JVM进行垃圾回收...

2021-03-26 00:00:00 121

原创 将博客搬至CSDN

小伙伴们,溜了。没办法,发布一篇文章就隐藏一篇。很难受找客服也得不到解决

2021-03-23 00:00:00 42

原创 我所知道JVM虚拟机之垃圾回收相关算法

前言上篇我们讲的是垃圾回收的概述,那么从本篇开始我们说的是垃圾回收的相关算法这些算法我们并不会手动的实现,但我们需要知道原理是什么,背景是什么,应用场景有什么我们没有必要底层去实现,并且本身算法也是很复杂要考虑的细节有很多我们一提到垃圾回收的算法GC,那么其实翻译成两个词:垃圾回收器、垃圾回收那么我们提到GC就是要垃圾回收,那我们需要知道哪些是垃圾结构(对象),将它清理那么怎么找到这些垃圾呢?找到...

2021-03-22 00:00:00 117

原创 我所知道JVM虚拟机之垃圾回收概述

前言从本篇开始,我们正式开始接触JVM的垃圾回收相关知识,本篇文章先进行概述与介绍一、回顾JVM的几个部分我们希望通过学习JVM达到的目的是让系统在业务越来越复杂的情况下使性能更加的优化效率高所以我们一般要将上层代码进行优化、底层在系统层面优化那么当我们进行JVM虚拟机优化的时候,就需要对性能进行监控在性能监控前提的是懂整个数据在Java虚拟机的分配与策略:内存的分配与回收那么要想明白内存的分配与...

2021-03-18 00:00:00 80

原创 我所知道JVM虚拟机之Spring Table(字符串常量池)

前言我们在实际开发当中使用String非常的广泛,那么对使用String类其实有很多角度可以去学习理解那么本篇文章,我们从使用String的层次到开始了解分析String的实现、性能等等一、String的基本特性对于String我们称为字符串,使用一对 “” 引号起来表示那么平常我们的使用有不同的定义方式如下:String s1 = "xiaomingtongxue" ; 称呼为字面量的定义方式...

2021-03-17 00:00:00 320

原创 我所知道JVM虚拟机之执行引擎

前言从本篇开始我们就要进入执行引擎的学习一、执行引擎概述我们说执行引擎是Java虚拟机核心的组成部分之一其实“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式JVM的主...

2021-03-15 00:00:00 142

原创 我所知道JVM虚拟机之对象的实例化与访问定位

前言本篇补充的对象的实例化的创建方式、创建步骤等等详细说明暂且可以看看一些大厂面试前的引入面试题 美团:对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:二面:java对象头里有什么一、对象的实例化接下来我们就从对象的创建方式开始说起,常见的创建方式、步骤到底有哪些并且是个什么东西我们对创建对象的方式这几种进行描述讲解一下:new:最常见的方式单例类中调用getInstance的静态...

2021-03-14 00:00:00 105

原创 我所知道JVM虚拟机之运行时数据区的方法区

前言从本篇开始我们就要进入运行时数据区的方法区学习一、栈、堆、方法区的交互关系那么接下来我们从线程共享与否的角度来看运行时数据区看看是怎么样的?下面就是看看栈、堆、方法区的交互关系是怎么样的?从简单的代码角度出发,当前声明的变量对象是person,类型则是Person类。针对于这个类型我们需要将它加载到方法区,我们new 的对象放入堆空间当中接下来我们从栈堆方法区的内存结构来看看是怎么样的?二、方...

2021-03-12 00:00:00 121

原创 我所知道JVM虚拟机之运行时数据区的堆空间

前言从本篇开始我们就要进入运行时数据区的堆空间学习一、堆的核心描述《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area from which memory for all class instances and arrays is allocated)从实际使用角度看:“几乎”所有的对象...

2021-03-10 00:00:00 114

原创 我所知道JVM虚拟机之运行时数据区的本地方法栈

前言上篇文章介绍了运行时数据区的PC寄存器、虚拟机栈,这篇讲的本地方法栈一、本地方法在讲解运行时数据区里的本地方法栈时,先穿插一个内容讲解本地方法库(红色框框)什么是本地方法?================================简单地讲:一个Native Method就 是一个Java调用非Java代码的接口。该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其...

2021-03-08 00:00:00 87

原创 我所知道JVM虚拟机之运行时数据区的虚拟机栈

前言上篇文章介绍了运行时数据区的概述、以及PC寄存器,这篇文章介绍的是虚拟机栈一、虚拟机栈的概述虚拟机栈出现的背景================================我们知道Java虚拟机是基于栈的一种设计架构,优点是跨平台指令集小编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令因为跨平台性所以不能设计为基于寄存器的(设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对...

2021-03-08 00:00:00 120

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除