自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java垃圾收集(GC)详解

1、简介 Java内存运行时区域分为堆(Heap)、方法区、虚拟机栈、本地方法栈和程序计数器,其中虚拟机栈、程序计数器和本地方法栈随线程而生、随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配所少内存基本上在类结构确定下来就是已知的(尽管在运行期会由即时编译器进行一些优化,但是在基于概念模型的讨论里,大体上可以认为是编译期可知的),这几个区域的内存分配和回收都具备确定性,因此对于这几个区域就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就..

2021-02-16 21:49:41 288 1

原创 JVM内存空间详解&实例分析

1、介绍 Java不需要开发人员来显示分配内存,而是由JVM来自动管理内存的分配和回收(垃圾回收GC),但由此带来的负面影响有可能是在不知不觉中浪费了很多内存或者造成内存泄漏。因此,作为开发人员而言,不能因为JVM自动内存管理机制就不掌握内存分配和回收的知识了。2、内存空间 分析JVM的内存结构,主要是分析JVM运行时数据区,具体划分成5个部分:方法区、堆、虚拟机栈、本地方法栈和程序计数器。2.1 方法区 方法区主要存放了需要加载的类的信息(名称、修饰符等)、...

2021-02-10 11:42:45 430

原创 Java并发编程:线程各种状态之间的转换

BLOCKED,WAITING,TIMED_WAITING的区别请看另外一篇帖子:https://blog.youkuaiyun.com/qq_41834553/article/details/1126261661、NEW←→RUNNABLE当调用t.start()方法时,会由NEW→RUNNABLE2、RUNNABLE←→WAITING当调用obj.wait()方法时,t线程会从RUNNABLE→WAITING当调用obj.notify()/obj.notifyall()/t.in...

2021-01-14 19:01:00 122

原创 Java并发编程:浅谈偏向锁、轻量级锁、自旋优化、锁膨胀、锁重入机制

一、介绍1、 我们知道,在java中可以通过Synchronized对对象加锁、其原理是通过对对象内部的一个叫做监视器(monitor)的来实现的,但是线程之间的切换是需要操作系统通过从用户态转成核心态来实现的,状态之间的转换需要比较长的时间,这就是为什么synchronized效率比较低的原因。Java从JDK6开始引入了“轻量级锁”和“偏向锁”来减少频繁的锁释放和锁获得所带来的性能上的消耗,所以在jdk6中,锁一共有4种状态:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。这些锁会随着...

2021-01-13 20:30:41 264

转载 为什么要模1000000007

刷力扣时,经常会遇到要模1000000007。

2023-02-18 20:26:51 281

转载 Java Map,List,Set,String[]之间的转换

1、Map和Listmap.values转list:Collection<Object> values = resultMap.values(); ArrayList<Object> resultList = new ArrayList(values);2、Map和Setmap转set(主要用于迭代遍历),注意是无序的map.keySet();map.entrySet();set转map就是遍历添加暂无提供简便方法3、List和Set

2022-01-18 13:46:14 3261

原创 java中抛出异常后代码继续执行的问题

昨天在工作中遇到一个问题:我需要调公司另外一个模块来获得数据,这个模块返回的是n*n矩阵式的数据,但由于我只需要这个矩阵中的某些数据,所以我在调用代码方法中把需要的数据整理成map并添加到list,然后返回给应用处理方法。在应用处理的代码中,我只对返回的list进行null和size!=0判断,并抛出可能的异常,但我并没有考虑到这个矩阵里面有的格子数据本身是null的情况,也就是说单个map的空指针异常导致了我的应用处理方法里面也会抛出异常,相当于处理模块没法用了,这就导致了刷出来的数据减少了90%。那

2022-01-13 13:43:13 13123

原创 优雅判空--Optional.ofNullable()方法

工作中经常会调外部接口、或者查询表等,如果对返回结果不进行空指针判断的话就会导致空指针异常。针对这种情况经常会使用if进行判断,比如示例一这样:示例一:private boolean isNotNull(Object param) { if (param == null) { return false; } else { return true; }}这还仅仅是针对某个对象进行判空操作,如果我们需要对某个对象的某个具体参数使用,使用前需

2022-01-06 17:13:45 19481 1

转载 全面理解java异常机制

在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制。本文将会从以下几个方面介绍java中的异常机制:异常机制的层次结构 异常的处理过程 抛出异常 捕获异常 异常机制的实现细节一、异常机制的层次结构在java程序设计语言中,所有的异常对象都是派生于Throwable类,一般情况下,如果java中内置的异常类不能满足需求,可以自定义异常类只需要继承与Throwable类即可,下面是java 中的异常层次结构:...

2022-01-04 17:15:38 171

原创 位运算符汇总整理

1、按位与 &规则:如果两个数相应的二进制都为1,则该位的按位与值为1,否则为0(全1为1)。举例:12&1412的二进制数是1 1 0 014的二进制数是1 1 1 012&14的结果为 1 1 0 0 = 122、按位或 |规则:如果两个数相应的二进制只要有一个为1,则该位的按位与值为1,否则为0(有1为1)。举例:12&1412的二进制数是1 1 0 014的二进制数是1 1 1 012&14的结果为 ...

2021-12-06 15:21:30 1043

转载 分布式系统GFS

正文 本文是典型分布式系统分析系列的第二篇,关注的是GFS,一个分布式文件存储系统。在前面介绍MapReduce的时候也提到,MapReduce的原始输入文件和最终输出都是存放在GFS上的,GFS保证了数据的可用性与可靠性,那么本文具体看看GFS是怎么做到的。 GFS(Google File System)是Google研发的可伸缩、高可用、高可靠的分布式文件系统,提供了类似POSIX的API,按层级目录来组织文件。在网络上,有很多对该轮文的翻译和解读,尤其是经典论文翻译...

2021-10-08 15:03:21 301

转载 雪花算法snowflake的原理和实现

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。给大家举个例子吧,比如下面那个 64 bit 的 long 型数字:第一..

2021-04-04 17:09:23 744

转载 Java String源码分析

什么是不可变对象?众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。区分对象和对象的引用对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = "AB...

2021-03-10 09:36:11 164

转载 数据库查询优化的12种方式

查询优化方式:1 硬件层的优化1 CPU:个数 / 核数 / 频率 / 线程数 / 一级 cache/ 二级 cache2 内存 :容量与 64-bits/ 带宽3 I/O:seek(>100 次 / 秒 )/read/write(>10–20MB/s)4 网络 :带宽 / 传输协议2存储引擎优化1 InnoDB :1) innodb_buffer_pool_size : caching data and indexes in memory ,可...

2021-03-05 15:46:22 3070

转载 MySQL的可重复读级别能解决幻读吗

引言之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测试复现这些问题。关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。但是对于幻读,我发现在可重复读的隔离级别下没有出现,当时想到难道是MySQL对幻读做了什么处理?测试:创建一张测试用的表dept:CREATE TABLE `dept` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAU

2021-03-05 14:34:27 163

转载 MySQL-InnoDB-MVCC多版本并发控制

前言最近正在啃《高性能MySQL》这本书, 当看到事务相关知识时,决定对该知识点稍微深入一下, 《高性能MySQL》中在介绍事务相关知识点时, 显然不是特别深入, 很多比较底层的知识点并没有太多的深入, 当然此处并不是要对本书做什么评判,言归正传, 这里主要先说一下本人在啃相关知识点时的曲折之路:首先是事务相关ACID特性, 之前已经有相关笔记进行过介绍, 这里不再重复; 接下来是高并发事务相关的问题, 像是脏读,不可重复读,幻读,更新丢失等问题之前也有相关笔记; 再下来就是MySQL应...

2021-03-04 15:07:07 231 1

转载 select、poll和epoll的区别

操作系统在处理io的时候,主要有两个阶段:等待数据传到io设备 io设备将数据复制到user space我们一般将上述过程简化理解为:等到数据传到kernel内核space kernel内核区域将数据复制到user space(理解为进程或者线程的缓冲区)  select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步

2021-03-01 18:48:14 437

转载 CopyOnWriteArrayList学习笔记

前言并发包中的并发List只有CopyOnWriteArrayList。CopyOnArrayList是一个线程安全的ArrayList,对其进行修改的操作都是在底层的一个复制的数组上进行的,也就是使用了写时复制策略。CopyOnWriteArrayList源码解析初始化public CopyOnWriteArrayList() { setArray(new Object[0]); }无参构造函数内部创建了一个大小为0的Object数组作为array的初始值。然后看下有参...

2021-03-01 14:50:21 168

转载 Java instanceof和getClass区别

在比较一个类是否和另一个类属于同一个类实例的时候,我们通常可以采用instanceof和getClass两种方法通过两者是否相等来判断,但是两者在判断上面是有差别的,下面从代码中看看区别:public class Test{ public static void testInstanceof(Object x) { System.out.println("x instanceof Parent: "+(x instanceof Parent)); ...

2021-02-26 10:33:58 168

转载 Java中Runnable和Thread的区别

在实际工作中,我们很可能习惯性地选择Runnable或Thread之一直接使用,根本没在意二者的区别,但在面试中很多自以为是的菜货面试官会经常而且非常严肃的问出:请你解释下Runnable或Thread的区别?尤其是新手就容易上当,不知如何回答,就胡乱编一通。鄙人今天告诉你们这二者本身就没有本质区别,就是接口和类的区别。问出这个问题的面试官本身就是个二流子!如果非要说区别,请看如下:Runnable的实现方式是实现其接口即可 Thread的实现方式是继承其类 Runnable接口支持多继承,但基本上

2021-02-18 21:32:10 905

转载 netty源码分析之writeAndFlush全解析

前言在前面的文章中,我们已经详细阐述了事件和异常传播在netty中的实现,(netty源码分析之pipeline(一),netty源码分析之pipeline(二)),其中有一类事件我们在实际编码中用得最多,那就是 write或者writeAndFlush,也就是我们今天的主要内容主要内容本文分以下几个部分阐述一个java对象最后是如何转变成字节流,写到socket缓冲区中去的pipeline中的标准链表结构 java对象编码过程 write:写队列 flush:刷新写队列 write

2021-02-18 15:57:20 1033

原创 Netty可靠性设计之Netty心跳机制

1、使用心跳机制的原因 在凌晨等业务低谷期,如果发生网络闪断、连接被Hnag住等网络问题时,由于没有业务消息,应用进程很难发现。等到了白天业务高峰期时,会发生大量的网络通信失败,严重的话还会导致一段时间进程内无法处理业务消息。为了解决这个问题,在网络空闲时采用心跳机制来检测链路的互通性,一旦发现网络故障,立即关闭链路,主动重连。2、设计思路(1)当网络处于空闲状态持续时间达到T(连续周期T没有读写消息)时,客户端只懂发送Ping心跳消息给服务端。(2)如果在下一个周期T到来时客户...

2021-02-16 18:09:07 472

转载 因特网,互联网,以太网,局域网的区别

先讲一下计算机网络(network),就是将一台以上的计算机互连起来,互连的计算机之间可以实现通信,实现信息共享,这就是网络。那么,什么是互联网,互联网的英文是 internet,它的意思是“网络的网络”,是一个通用名词,泛指有多个计算机网络互连而成的网络,这些网络之间的通信协议(即通信规则)是可以任意的。因特网,即 Internet,记住它与 internet 之间绝对不能使用等于号,因为 Internet 是一个专有名词,它是指当前全球最大的、开放的、有众多网络互相连接而成的特定的计算机网络,它

2021-02-14 19:07:52 2033

转载 Java NIO底层原理

1.1. JavaIO读写原理无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理.

2021-02-14 09:40:57 296 1

转载 虚拟内存与物理内存的联系与区别

操作系统有虚拟内存与物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题:因为我的物理内存时有限的,当有多个进程要执行的时候,都要给4G内存,很显然你内存小一点,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内

2021-02-12 21:13:47 232

转载 计算机内存和磁盘的关系

计算机内存和磁盘的关系前言上篇文章详细讲了计算机内存的物理结构,逻辑结构以及在内存的基础上理解几种常见的数据结构。但是,计算机系统出了内存之外,还有一个非常重要的硬件,那就是磁盘。他们都是用于计算机存储,但是内存是利用电流来实现存储,而磁盘是利用磁效应来实现存储,并且,从存储容量来看,内存是高速高价,而磁盘则是低速廉价。在计算机这个系统中,高速小容量的内存与低速高容量的磁盘进行协同作业。本文详解内存与磁盘之间的那些事儿。一、首先要明确一个前提我们知道计算机是利用CPU进行数据的运算的,但C.

2021-02-12 21:10:43 664

原创 JVM之对象的访问定位

在Java虚拟机中,对象类型的数据放在方法区,而对象实例的数据放在java堆中。如果要访问对象,一般有两种方式:一种是使用句柄,另一种是直接指针式地访问对象。一、句柄访问Java堆中会划分出一块内存来作为句柄池,而reference中存储的就是对象的句柄地址,而句柄中分别存放了对象实例数据和对象类型数据各自的地址信息。优点:对象发生变化的时候只需要修改句柄池中的指针而不需要修改reference。缺点:运行速度会受到影响(需要两次指针定位)。二、使用指针(HotSpot采用.

2021-02-12 19:37:45 180

原创 IDEA设置头注释,自定义作者author和日期date

步骤File→Settings→Editor→File and Code Templates→Includes→File Header→添加模板使用到的模板如下:/** * @Author: Sicauxjh * @Date: ${DATE} ${TIME} */实际效果:第一次添加上去,用户名会有波浪线的问题,比如:解决方法:将鼠标移到出现波浪线字符的位置,点击More actions或者按快捷键Alt+Enter然后点击Save 'xx..

2021-02-10 13:38:36 3017

原创 命令行中使用javap反编译class文件

由于自己在学习Java JVM相关知识的时候需要将java文件反编译成class文件进行性能分析,故将搜索到的方法整理如下:步骤:第一步:运行代码,生成.java文件第二步:在当前路径下打开cmd窗口在当前文件路径下直接输入cmd输入cmd回车第三步:使用javac Math.java将其编译可以看到,新生成了一个class文件第四步:在cmd中输入javap -c Math命令,将其字节码文件进行反汇编。可以看到如下画面:...

2021-02-10 11:59:59 3652 2

转载 Java中的 BIO,NIO,AIO 总结

BIO,NIO,AIO 总结Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。同步与异步 同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步:异步就是发起一个调用后,立刻得到被调..

2021-02-08 20:10:03 245 1

转载 Java中的<< 和 >> 和 >>> 详细分析

<<表示左移移,不分正负数,低位补0; 注:以下数据类型默认为byte-8位左移时不管正负,低位补0正数:r = 20 << 2  20的二进制补码:0001 0100  向左移动两位后:0101 0000       结果:r = 80负数:r = -20 << 2  -20 的二进制原码 :1001 0100  -20 的二进制反码:1110 1011  -20 的二进制补码 :1110 1100  左移两位后的补码:...

2021-02-03 21:00:30 206 1

转载 Redis之简单动态字符串SDS

1.用途Redis并未使用c语言的string,而是自己构建简单动态字符串(SDS,simple dynamic string)抽象类型表示字符串.​ c语言string只是用在不需要修改的地方,例如日志打印.其他地方基本都是SDS,例如:redis>RPUSH fruit "apple" "banana" "cherry"除了保存字符串值外,还用于缓冲区buffer:​ AOF中AOF缓冲区,客户端状态中输入缓冲区2.定义SDS:struct sdshdr{

2021-02-03 14:24:30 168

转载 Memcached和Redis之间的区别和选择

一、Memcached简介Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染

2021-02-01 19:26:40 231

转载 分布式系统中的CAP理论

一、什么是分布式系统拿一个最简单的例子,就比如说我们的图书管理系统。之前的系统包含了所有的功能,比如用户注册登录、管理员功能、图书借阅管理等。这叫做集中式系统。也就是一个人干了好几件事。后来随着功能的增多,用户量也越来越大。集中式系统维护太麻烦,拓展性也不好。于是就考虑着把这些功能分开。通俗的理解就是原本需要一个人干的事,现在分给n个人干,各自干各自的,最终取得和一个人干的效果一样。稍微正规一点的定义就是:一个业务分拆多个子业务,部署在不同的服务器上。 然后通过一定的通信协议,能够让这些子业务之

2021-02-01 14:31:16 175

转载 数据库之事务的四大特性&脏读、幻读、不可重复读的区别&事务的隔离级别

一、什么是事务事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);事务的四大特性:1 、原子性 (atomicity):强调事务的不可分割.事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做2 、一致性 (consistency):事务的执行的前后数据的完整性保持一致.事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库

2021-01-30 15:09:31 685

转载 DDL和DML区别

DML(Data Manipulation Language)数据操纵语言:适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.DDL(Data Definition Language)数据定义语言:适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create,Alter和Drop.一、DDL(数据定义语言,Data Definition Language)建库、建表、设置约束等:create..

2021-01-29 14:30:13 616

转载 二叉排序树(查找树)的平均查找长度

如图所示的二叉排序树查找成功的平均查找长度为:∑(本层高度*本层元素个数)/节点总数=(1*1+2*2+3*3+3*4)/9查找不成功的平均查找长度:∑(本层高度*本层补上的叶子个数)/补上的叶子总数=(2*1+3*3+4*6)/10...

2021-01-28 21:55:53 27296 3

转载 算法时间复杂度与空间复杂度

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,

2021-01-28 20:27:52 120

原创 JVM之类加载机制&双亲委派

1、介绍 类加载机制是指.class文件加载到JVM并形成Class对象的机制,在完成类加载后,应用就可以对Class对象进行实例化并调用。类加载机制可以在运行时动态加载外部的类和通过远程网络下载咋class文件等。除了有动态化的优点之外,JVM的类加载机制还有隔离运行的效果,使应用之间互不干扰。 JVM将类加载的过程划分为三个步骤:装载、链接和初始化。其中,装载和链接是将二进制的字节码转换为Class对象;初始化过程不是加载类时必须触发的,但是最迟必须在初次主动使用对象前执行,其所作的...

2021-01-25 22:14:12 130

转载 Java并发编程:BLOCKED,WAITING,TIMED_WAITING区别

一、介绍BLOCKED,WAITING和TIMED_WAITING是很重要的线程状态,但是经常对我们造成困扰。如果需要分析线程dump必须要对其有一定的理解。使用生活的例子,本文将每个状态变成了简单的例子。与正式的Java文档定义相比,任何让人费解的概念都可以用简单的例子来理解。如果用真实生活中的例子,就更好理解了。我想分享一些真实生活的例子来帮助理解这些线程状态。二、BLOCKEDJava文档官方定义BLOCKED状态是:“这种状态是指一个阻塞线程在等待monitor锁。”真实生.

2021-01-14 18:23:00 1014

空空如也

空空如也

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

TA关注的人

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