自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis 缓存问题及解决

在原有的失效时间基础上增加一个随机值(比如1到10分钟)这样每个缓存的过期时间都不重复了,也就降低了缓存集体失效的概率。:在写入数据库数据时,使用布隆过滤器做个标记,然后在用户请求发现缓存没有值时,查询布隆过滤器快速判断数据是否存在。当大量缓存在同一时间过期,如果此时有大量的用户请求,瞬间所有的请求都被下放到数据库,数据库就崩掉了。对于热点数据,当缓存失效的一瞬间,所有的请求都被下放到数据库去请求更新缓存,数据库被压垮。当数据既不在缓存中,也不在数据库中,导致请求访问缓存没数据,访问数据库也没数据,即。

2024-06-27 19:07:36 276

原创 Reactor模型:网络线程模型演进

这是传统的JAVA网络编程方案所采用的线程模型。即有一个主循环,socket.accept阻塞等待,当建立连接后,创建新的线程/从线程池中取一个,把该socket连接交由新线程全权处理。这种方案优点即实现简单,缺点则是方案的伸缩性受到线程数的限制。// 循环监听// 阻塞监听客户端请求System.out.println(client.getRemoteSocketAddress() + "客户端连接成功!");// 将该客户端请求通过线程池放入HandlMsg线程中进行处理。

2024-06-25 20:35:32 1048

原创 NIO(三) Selector使用(NIO综合)

比如在第一次的selector对某个Channel的read和write操作感兴趣,在第一次执行select()时,该通道的read操作就绪,此时该通道对应的键中的ready集合存有read元素,在第二次执行select()时,该通道的write操作也就绪了,此时该通道对应的ready集合中将同时有read和write元素。1,检查已取消键集合(执行过selectionKey.cancel会添加进来),如果该集合不为空,则清空该集合里的键,同时该集合中每个键也将从已注册键集合和已选择键集合中移除。

2024-06-21 16:25:16 1118

原创 JAVA NIO(二) Buffer和Channel

一个Socket连接使用一个Channel来表示,以前直接操作Socket文件描述符来对读写缓冲区操作,比如读数据到用户空间的一个byte数组,NIO中Channel对这个过程作了封装,其中用户空间的byte数组就类比Buffer。Buffer写数据时,换句话说,就是可以通过byte、char,short,int,long,float 或 double类型来操作缓冲区中的字节。3,Buffer本质上是一块可以读写的内存,被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

2024-06-21 16:10:43 770

原创 Java NIO(一) 概述

Java NIO 由以下几个核心部分组成:ChannelBufferSelector。

2024-06-21 16:02:59 291

原创 Linux 五种IO模型

原生Socket在创建的时候也可以指定为阻塞或非阻塞模式(区别只在第一个等待数据的阶段,第二个阶段调用recv拷贝数据都是一样的)。注意区分系统调用(如select、epoll)的阻塞和socket本身的阻塞,一般来说使用select、epoll是需要。多路复用有两个会阻塞的阶段:第一阶段阻塞在select、epoll等系统调用,第二阶段阻塞在数据拷贝;阻塞、非阻塞是对于等待数据可读、可写时,是否死等,即看第一阶段;阻塞IO、非阻塞IO、多路复用都属于同步IO,区别于异步IO。

2024-06-20 13:48:33 465

原创 Socket 原理和思考

Socket用于网络进程间通信,当然单机上不同进程间也行。Socket位于五层网络模型中的应用层和传输层之间,是一种抽象层,也是一组接口,把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,应用层也能更便捷在网络间进行数据传输。

2024-06-20 01:04:16 1343

原创 Java 集合类汇总

put() 先hash找到桶index,然后顺着链表找key是否存在,存在则新value覆盖,不存在则创建一个entry放在该桶最前边(链表头,resize() 重哈希的计算方式大大简化,仅通过计算高出来的一位是1还是0进行拆分,不仅计算方式简单,而且还把之前的冲突分散到其他的桶里。顺序访问高效,随机访问效率低效,随机访问get(i)先二分,再从前往后或从后往前找;双向链表,可以被当作堆栈和双端队列,适合频繁更新场景,不存在容量不足;put() 如果是链表结构,步骤同1.7,只不过是插入到链表尾部(

2024-06-16 10:44:50 382

原创 JVM 一些常见问题Q&A

当有GC请求时,所有进入到safepoint的Java线程会在一个Thread_Lock锁阻塞,直到当JVM操作完成后,VM释放Thread_Lock,阻塞的Java线程才能继续运行。CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);

2024-06-12 18:38:10 1401

原创 Java 单例模式

考虑线程安全的单例模式。

2024-06-12 18:14:33 84

原创 Java 泛型

一,3种泛型方式:泛型类、泛型接口、泛型方法一,3种泛型方式:泛型类、泛型接口、泛型方法静态方法要使用泛型的话,必须将静态方法也定义成泛型方法泛型方法中添加上下边界的时候,必须在权限声明与返回值之间的<T>上添加上下边界,即在泛型声明的时候添加。

2024-06-12 18:11:13 2582

原创 JUC AQS(AbstractQueuedSynchronizer)源码

AQS是JUC中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现,AQS是独占锁和共享锁的公共父类。

2024-06-11 16:27:49 943

原创 Java并发 线程的中断

在while(true)中不断的执行任务,当线程处于阻塞状态时,调用线程的interrupt()产生InterruptedException中断。当线程由于被调用了sleep()、wait()、join()等方法而进入阻塞状态,若此时调用线程的interrupt()将线程的中断标记设为true。强行终止是很危险的事情,优雅的方法就是,给那个线程一个中断信号, 让它自己决定该怎么办,这就是中断。()上,给线程中断后,不会抛出异常,线程唤醒继续执行,且线程中断标志为true。

2024-06-11 12:12:31 904

原创 JVM 常量池汇总

TODO(20240522):这里的意思好像是,类加载后符号引用只是从之前在class静态常量池里的一个东西,变成了运行时常量池里占具体内存的直接引用,但对堆区生成的class对象和方法区的类数据结构,以及符号引用和直接引用的具体表现很模糊。class文件常量池是一个class文件对应一个常量池,而运行时常量池只有一个,多个class文件常量池中的相同字符串只会对应运行时常量池中的一个字符串。String的字面量被导入JVM的运行时常量池时,并不会马上试图在字符串常量池加入对应的String对象,而是。

2024-06-07 17:50:35 865

原创 JVM (四)GC过程

为了保证引用更新的正确性,Java将暂停所有其他的线程,这种情况被称为“Stop-The-World”,导致系统全局停顿,会对系统性能存在影响。每次对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。程序计数器、虚拟机栈、本地方法栈都是随线程生灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,2,eden区满了触发minor gc,eden存活的对象被复制到from区(年龄+1),不存活的对象被回收;

2024-06-05 16:50:00 2592

原创 JVM (二)类加载

比如应用是通过网络来传输 Java类的字节码,为保证安全性,这些字节码经过了加密处理,这时系统类加载器就无法对其进行加载,这样则需要自定义类加载器来实现。当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,预加载时遇到错误,类加载器须在程序首次主动使用该类时才报告错误(没使用就不会报错)类加载几个阶段按顺序开始,而不是按顺序进行或完成,通常都会交叉进行;

2024-06-05 16:47:10 810

原创 JVM (一)内存模型

是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,甚至有的虚拟机(譬如Sun HotSpot)直接就把本地方法栈和虚拟机栈合二为一。

2024-06-05 16:34:46 784

原创 JVM(三) 垃圾收集器

使用G1收集器时,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔阂了,它们都是一部分(可以不连续)Region的集合。缘故:新生代GC和老年代的GC是各自分开独立进行的,只有Minor GC时才会使用根搜索算法,标记新生代对象是否可达,也就是说虽然一些对象已经不可达,但在Minor GC发生前不会被标记为不可达,CMS也无法辨认哪些对象存活,只能全堆扫描(新生代+老年代)。

2024-05-23 11:52:23 957 1

转载 区分JS中的undefined,null,"",0和false

在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个”空值”或”假值”,比如对象类型的空值null,.NET Framework中数据库字段的空值DBNull,boolean类型的假值false等等。在JavaScript中也有很多种的”空值”和”假值”,那么它们都有什么共同点和不同点呢?其实标题里面我已经列出了JavaScript中所有的”空值”和”假值”,除了boolean值本身就是tr

2015-03-23 11:45:16 319

转载 JS cookie操作

<html><head><script type="text/javascript">function getCookie(c_name){if (document.cookie.length>0) { c_start=document.cookie.indexOf(c_name + "=")//此处的=号不能忘了,避免color和colorful的情况if (c_start!=-

2015-03-22 11:10:44 341

转载 js setTimeout和setInterval

JS中typeof() 判断 ‘undefined’经常会在js里用到数组,比如 多个名字相同的input,若是动态生成的, 提交时就需要判断其是否是数组. 错误用法: if(document.mylist.length != "undefined" ) {} 正确用法:if( typeof(document.mylist.length) != "undefined" ) {} 或 if( !i

2015-03-20 11:00:56 266

原创 js typeof() 判断 'undefined'

JS中typeof() !== ‘undefined’是什么意思经常会在js里用到数组,比如 多个名字相同的input,若是动态生成的, 提交时就需要判断其是否是数组. 错误用法: if(document.mylist.length != "undefined" ) {} 正确用法:if( typeof(document.mylist.length) != "undefined" ) {} 或

2015-03-20 09:59:52 2338

转载 js null和undefined区别

在JavaScript开发中,被人问到:null与undefined到底有啥区别?一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理。 总所周知: null == undefined 但是: null !== undefined 那么这两者到底有啥区别呢? null是一个对象,但是为空。因为是对象,所以 typeof null 返回 ‘

2015-03-20 09:31:34 284

转载 js 浏览器检测

浏览器检测<div id="example"></div><script>txt = "<p>Browser CodeName: " + navigator.appCodeName + "</p>";txt+= "<p>Browser Name: " + navigator.appName + "</p>";txt+= "<p>Browser Version: " + navigator.app

2015-03-20 09:13:07 230

转载 js中setTimeOut()的返回值

setTimeout()方法的返回值是一个唯一的数值,这个数值有什么用呢?如果你想要终止setTimeout()方法的执行,那就必须使用 clearTimeout()方法来终止,而使用这个方法的时候,系统必须知道你到底要终止的是哪一个setTimeout()方法(因为你可能同时调用了好几个 setTimeout()方法),这样clearTimeout()方法就需要一个参数,这个参数就是setTim

2015-03-19 09:40:39 15304

原创 js document.write()

document.write()可以在<script>中直接输出,但若在<script>函数中输出会覆盖整个文档!

2015-03-16 11:35:08 396

转载 js中===和==的区别

===操作符:要是两个值类型不同,返回false 要是两个值都是number类型,并且数值相同,返回true 要是两个值都是stirng,并且两个值的String内容相同,返回true 要是两个值都是true或者都是false,返回true 要是两个值都是指向相同的Object,Arraya或者function,返回true 要是两个值都是null或者都是undefined,返回

2015-03-16 11:01:27 327

原创 如何使用样式

如何使用样式当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化。有以下三种方式来插入样式表:外部样式表当样式需要被应用到很多页面的时候,外部样式表将是理想的选择。使用外部样式表,你就可以通过更改一个文件来改变整个站点的外观。<head><link rel="stylesheet" type="text/css" href="mystyle.css"></head>内部样式表当单个

2015-03-12 11:25:50 175

原创 HTML基础

•<html> 与 </html> 之间的文本描述网页•<body> 与 </body> 之间的文本是可见的页面内容•<h1> 与 </h1> 之间的文本被显示为标题•<p> 与 </p> 之间的文本被显示为段落

2015-03-11 15:20:52 185

原创 JavaScript基础

外部的 JavaScript外部 JavaScript 文件的文件扩展名是 .js。如需使用外部文件,请在<script> 标签的 "src" 属性中设置该 .js <script type="text/javascript" src="/js/myScript.js"></script>提示:外部脚本不能包含<script> 标签。

2015-03-11 10:42:34 226

原创 Git学习笔记

如何使用.gitignore在需要创建 .gitignore 文件的文件夹, 右键选择Git Bash 进入命令行,进入项目所在目录。输入 touch .gitignore 在文件夹就生成了一个“.gitignore”文件。然后在”.gitignore” 文件里输入你要忽略的文件夹及其文件就可以了。然后用编辑器打开这个文件进行编辑就行了。如果你很牛,熟悉linux下的vi编辑的命令,也可以用

2015-03-08 14:43:49 224

原创 XML学习笔记

XML 标签对大小写敏感实体引用在 XML 中,一些字符拥有特殊的意义。if salary < 1000 then 在 XML 中,有 5 个预定义的实体引用: 注释:在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。在 XML 中,空格会被保留HTML 会把多个连续的空格字符裁减(合并)为一个: 在 XML 中,文档中的空格不会被删

2015-03-08 13:41:34 213

空空如也

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

TA关注的人

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