自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 资源 (1)
  • 收藏
  • 关注

原创 Java 内存模型 JMM (Java Memory Model)

Java 内存模型 JMM (Java Memory Model)要搞懂并发编程必须搞懂 JMM.JMM 屏蔽了不同操作系统中的内存差异性.定义了线程和主内存之前的抽象关系。线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存存储了该线程以读/写共享变量的副本。本地内存是 JMM 的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。JMM 抽象示意图如下:从上图来看,线程A 和 B 操作的共享变量都是本地内存中的副本,如果想要互相看到对方

2020-09-19 11:25:33 181

原创 GC 为什么要挂起用户线程? 什么愁什么怨?

GC 为什么要挂起用户线程? 什么愁什么怨?前言JVM 系列文章的第一篇。敬请期待后续。故障描述某年某月某日 上午,线上发生故障,经过排查,发现某核心服务 Dubbo 接口超时。故障根源查看该服务监控指标,发现该服务 FullGC 次数过于频繁,简直要上天了。那也难怪接口会超时了。那么为啥 FullGC 次数太多会造成接口超时呢?因为 GC 停顿。 FullGC 时会产生GC停...

2020-01-12 22:35:29 763

原创 Java学习笔记 (三十二) LinkedList 学习笔记(jdk1.8)

LinkedList 学习笔记(jdk1.8)LinkedList 学习笔记(jdk1.8)

2019-03-19 23:17:04 237

原创 Java学习笔记 (三十一) ArrayList 学习笔记

ArrayList 学习笔记(jdk1.8)ArrayList 学习笔记(jdk1.8)

2019-03-19 23:15:20 166

原创 JVM 学习笔记 (八) 内存分配策略

对象的内存是在堆上分配的(但也有可能经过 JIT 编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在 Eden 区上,如果启动了本地线程分配缓冲,将按线程优先在 TLAB (TLAB 是 Eden 区中的一个区域)上分配。少数情况下也可能直接分配在老年代中,分配的具体规则取决于使用的是哪一种垃圾收集器组合,以及相关JVM参数的设置。对象的内存分配规则并不是一成不变的,下面给出了几种最普遍...

2019-01-14 00:20:04 131

原创 JVM 常用参数

记录一下我遇到过的使用过的 一些JVM 参数。堆内存设置-Xms // 设置初始堆大小,eg: -Xms20M 设置初始堆大小为20M-Xmx // 设置堆最大的大小 eg: -Xmx20M 设置堆最大为20M 可与-Xms配合使用-Xmn //设置年轻代内存 大小 eg: -Xmn10M 设置年轻代内存为10M打印日志-verbose:class //打印类加...

2019-01-13 00:08:21 156

原创 JVM 学习笔记 (七) HotSpot的算法实现

HotSpot的算法实现枚举根节点从可达性分析中从 GC Roots 节点找引用链这个操作为例。GC Roots 节点主要在全局性的引用(常量或者类静态属性) 与执行上下文(栈帧中的本地变量表)中,如果逐个检查这里面引用,那么必然会消耗很多时间。另外,可达性分析对执行时间的敏感体现在 GC 停顿上。什么是 GC 停顿GC 进行时必须停顿所有java执行线程 (Stop The World...

2019-01-10 23:40:34 209

原创 JVM 学习笔记 (六) 垃圾收集器(Garbage Collector)

垃圾收集器垃圾收集器是内存管理工具,也就是垃圾回收的具体实现。Serial 收集器Serial 垃圾收集器是最基本的垃圾收集器,它是单线程的收集器。单线程的意思是,它进行垃圾回收时必须暂停其他所有的工作线程,直到它收集结束。在服务器环境中使用它体验感很不好,想一下用户访问网站。。结果垃圾收集一下暂停一下。。。。但它是虚拟机运行在Client模式下的默认新生代收集器,因为桌面应用新生代内存...

2019-01-08 23:08:30 542

原创 JVM 学习笔记 (五) 垃圾回收算法

标记—清除算法标记—清除(Mark—Sweep)是最基础的收集算法。算法分为标记、清除两个阶段:标记首先标记出所有需要回收的对象。清除标记完成后统一回收所有需要标记的对象。标记过程就是判定对象是否应该回收的过程。这个算法有两个不足之处:效率问题,标记和清除两个过程的效率都不高。空间问题,标记清除之后会产生大量不连续的内存碎片,内存碎片太多可能会导致在分配较大对象时,无法...

2019-01-07 22:58:43 129

原创 Java学习笔记 (三十) finalize()方法

在可达性分析算法中不可达的对象,并不是一定要回收的。真正判定一个不可达对象要回收,至少要经历两次标记过程。第一次标记如果对象在进行可达性分析之后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记并且进行一次筛选。筛选的条件是此对象是否需要执行 finalize() 方法。当对象没有覆写 finalize() 方法,或者 finalize() 方法已经被虚拟机调用过,这两种情况...

2019-01-06 22:31:04 310

原创 Java学习笔记 (二十九) java中的四种引用

为了更好的管理内存,有利于垃圾回收.JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种。强引用(Strong Reference)如下: List list=new ArrayList(); Map ma...

2019-01-06 18:41:58 150 2

原创 JVM 学习笔记 (四) 判断对象是否要回收

判断对象是否要被回收Java堆里存放着几乎所有的对象实例,垃圾收集器在回收对象前,第一件事就是确认这个对象是否还在被使用。判断对象是否要被回收的算法有两种,引用计数算法和可达性分析算法。

2019-01-04 23:56:54 161

原创 JVM 学习笔记 (三) 访问对象的方式

Java程序通过栈上的reference 数据来访问堆上的具体对象。对象访问方式是取决于虚拟机实现而定,主流访问方式有使用句柄和直接指针两种。使用句柄访问Java堆中会划分出一块内存作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体信息。使用句柄访问对象的优势就是reference 中存储的是稳定的句柄地址,在对象被移动(垃圾收集时...

2019-01-03 23:04:04 148

原创 JVM 学习笔记 (二) 对象的内存布局

对象在内存中可以分为3块区域:对象头(Header)、实例数据(Instance Data)、和对齐填充(Padding)。对象头(Header)对象头包括两部分信息,Mark Word 和 类型指针。Mark Word存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。这部分数据长度在32位和64位的虚拟机(未开启压缩指针)中分别为32...

2019-01-03 00:08:06 149

原创 JVM 学习笔记 (一) 对象的创建过程

在Java里,创建对象只需要new 关键字即可。那么JVM是怎么去创建对象的呢?当JVM 遇上new 关键字?JVM 遇上new 指令时第一步 类加载检查首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个类是否已经被加载。如果没有加载,就去加载类。简述一下:在常量池中定位类的符号引用,检查类是否被加载初始化 如果没有被加载就会去加载初始化类第二步 ...

2018-12-30 23:35:45 153

原创 Java学习笔记 (二十八) IO 知识总结

学习IO 知识一段时间,对java中的IO 有了一个初步的了解,先总结一下学习的知识点。后面有空时在继续完善。欢迎走过路过的朋友指点交流一下。Java学习笔记 (十八) 什么是IO流Java学习笔记 (十九) Java中的IO流Java学习笔记 (二十) FileInputStream 和 FileOutputStreamJava学习笔记 (二十一) 使用 try-with-resourc...

2018-12-30 18:34:48 162

原创 Java学习笔记 (二十七) 使用NIO写文件

创建NIO Path 对象Path对象是对 文件 或者目录的路径的引用. Path 类似于 FIle ,可以引用文件系统的绝对路径或者相对路径。Path 创建对象可以使用 工厂类 java.nio.files.Paths ,它有一个静态的get()方法。如下: //创建 相对路径文件的引用Path path1=Paths.get("love.txt");//创建绝对路径文件的引用Pa...

2018-12-28 23:19:57 565

原创 Java学习笔记 (二十六) 使用NIO读取文件

在一个文件大小的缓冲区中读取文件代码如下: public static void main(String[] args) throws Exception { try ( RandomAccessFile raf = new RandomAccessFile("love.txt", "r"); //获取 该文件通...

2018-12-27 22:49:50 205

原创 Java学习笔记 (二十五) 初步了解NIO

什么是NIO ?jdk 1.4之后,Java中新增了 java.nio包,Java NIO提供了与标准IO API不同的IO工作方式。NIO 的几个概念缓冲区 Buffer缓冲区是一个容器,存放特定原始类型(char、byte、int、long、float等)的固定大小的数据。缓冲区具有内容、位置、限制和容量。通道 ChannelChannel 是一个通道,网络数据通过Channel ...

2018-12-26 22:55:03 121

原创 Java学习笔记 (二十四) 缓冲流

缓冲流 BufferedInputStream 和 BufferedOutputStream 以及 BufferedReader 和 BufferedWriter普通IO流每个读或写请求都由底层操作系统直接处理。这会大大降低程序的效率,因为每个这样的请求通常都会触发磁盘访问、网络活动或其他一些相对耗时的操作。缓冲I/O流可以减少这种开销。缓冲输入流从缓冲区的内存区域读取数据;只有当缓冲区为空...

2018-12-25 23:00:41 122

原创 Java学习笔记 (二十三) IO管道(Pipes)

Java IO 管道 Pipesjava中Pipes提供了线程之间通信的能力。Pipes可以是数据源,也可以是输出目标。不能使用管道与不同JVM(不同进程)中的线程进行通信。Java中的管道概念与Unix / Linux中的管道概念不同,Unix / Linux中的管道在不同地址空间中运行的两个进程可以通过管道进行通信。在Java中,通信双方必须在同一个进程中运行,并且应该是不同的线程。...

2018-12-24 22:54:55 357

原创 Java学习笔记 (二十二) RandomAccessFile

RandomAccessFileRandomAccessFile 该类的实例支持对文件的任意位置进行读写操作。 访问文件任意位置的行为类似于存储在文件系统中的大量字节数组。有一种游标,或指向隐含数组的索引,称为文件指针;输入操作从文件指针开始读取字节,并将文件指针向前推进,超过所读取的字节。如果文件是在读/写模式下创建的,那么输出操作也是可用的;输出操作从文件指针开始写入字节,并将文件指针向前推...

2018-12-24 00:32:36 198

原创 Java学习笔记 (二十一) 使用 try-with-resources语句关闭资源.

try-with-resourcestry-with-resources 可以自动关闭资源。非常方便。try 语句里面可以声明一个或者多个资源。资源指的是对象,必须在程序执行完后关闭,比如IO流 执行完后要关闭流。这个对象必须实现了java.lang.AutoCloseable接口。以前关闭流的方式:public static void main(String[] args) thro...

2018-12-22 22:32:39 1462

原创 Java学习笔记 (二十) FileInputStream 和 FileOutputStream

FileInputStreamFileInputStream类能够以字节流的形式读取文件内容。FileInputStream是InputStream类的子类。

2018-12-22 19:33:48 214

转载 千字文

千字文天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。寒来暑往,秋收冬藏。闰余成岁,律吕调阳。云腾致雨,露结为霜。金生丽水,玉出昆冈。剑号巨阙,珠称夜光。果珍李柰,菜重芥姜。海咸河淡,鳞潜羽翔。龙师火帝,鸟官人皇。始制文字,乃服衣裳。推位让国,有虞陶唐。吊民伐罪,周发殷汤。坐朝问道,垂拱平章。爱育黎首,臣伏戎羌。遐迩一体,率宾归王。鸣凤在竹...

2018-12-22 17:12:21 278

原创 Java学习笔记 (十九) Java中的IO流

Java中的IO流Java 中定义了两种类型的流,那就是字节流与字符流。字节流(Byte Stream)字节流按字节处理数据,对数据进行输入以及输出。字节流又分为输入流(InputStream)和输出流(OutputStream)InputStreamInputStream是一个抽象类,是所有字节输入流类的基类。它们的结构如下图所示:OutputStreamOutputStre...

2018-12-20 23:07:01 144

原创 Java学习笔记 (十八) 什么是IO流

什么是流在日常生活中,流就是 事物在两地之间的转移运动,比如人流,水流,车流…等等。什么是IO流呢计算机中的流就是连续的数据流,I/O流就是输入源和输出目标之间的数据流。输入流(InputStream)从数据源读取数据,如下图:将数据读取到程序输出流(OutputStream)将数据写入目标,如下图:将数据写入目标数据源和输出目标可以是任何保存、生成或使用数据的对象,包括磁盘文...

2018-12-19 21:58:40 244

原创 学习笔记 (一) 计算机中的数据存储

计算机中的数据存储计算机中存储和处理的信息以二值信号表示,这些二进制数字称为位(bit),这也是计算机信息存储中的最基本的 单位。一个位(bit)的值为0或者1.当然,单独的位(bit) 并没有什么用,然而,当把位(bit)组合在一起,再加上某种编码,我们就可以用位组表示字母、特殊符号、数字、文件、视频、音频。。。等等由于计算机是二进制的:21=222=2 * 2=423=2 * 2 ...

2018-12-18 23:23:04 219

原创 Java学习笔记 (十七) 深入了解枚举

上一篇,枚举。枚举是怎么实现的可以通过反编译代码查看具体实现。如下代码:public enum Season { SPRING,SUMMER,AUTUMN,WINTER;}反编译后,如下:可以看见,反编译的后的代码继承了 java.lang.Enum 类,同时被 final修饰。从这一点可以明白为什么枚举类不能继承别的类,以及为什么不能使用final关键字修饰,因为已...

2018-12-17 22:01:44 201

原创 Java学习笔记 (十六) 枚举

什么是枚举 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。 ----------------...

2018-12-16 21:42:57 196

原创 CentOS 安装 MySQL数据库

使用MySQL yum Repository 快速安装MySQL数据库下载yum repository// centos6 下载yum repositorywget https://dev.mysql.com/get/mysql80-community-release-el6-1.noarch.rpm====注意====注意====注意====根据你的系统版本不同的yum reposi...

2018-12-05 16:28:19 140 1

原创 Java学习笔记 (十五) 自动拆箱与自动装箱

什么是自动拆装箱自动装箱: 就是将基本数据类型自动转换成对应的包装类. 自动拆箱:就是将包装类自动转换成对应的基本数据类型。For example : Integer a=1; //自动装箱 int b=a; //自动拆箱基本数据类型与包装类对应关系,如下: 基本数据类型 包装类 boolean Boolean ...

2018-08-24 01:28:23 232 1

原创 Java学习笔记 (十四) JVM内存结构之运行时数据区域

JVM运行时数据区域(Java Virtual Machine Run-Time Data Areas)Java虚拟机在运行程序期间会划分运行时数据区域,有些数据区域随着jvm的启动而创建,退出而销毁。有些数据区域随着线程的启动和结束而创建和销毁。 这里放一张我盗来的图,图来源文章链接在文末; 从上图可以看出来、PC Register、JVM Stack、Native Method S...

2018-08-19 23:49:12 308

原创 Java学习笔记 (十三) String究竟创建了几个对象 以及String的intern方法

String究竟创建了几个对象 看代码:例 1、 public static void main(String[] args) { String s3 = "天道酬勤"; String s4 =new String("天道酬勤"); System.out.println("s3==s4 "+(s3==s4));//fals...

2018-08-13 21:52:32 272

原创 Java学习笔记 (十二) String源码分析

该文章基于jdk1.8String 不可变性String类是被final修饰的,意味着String是不可变的,那么为什么这么设计呢?其实源码里的注释给出了答案:their values cannot be changed after they are created. String buffers support mutable strings.Because String obj...

2018-08-13 21:31:56 203

原创 Java学习笔记 (十一) 反编译jdk10 本地变量类型推断

反编译jdk10 的本地变量类型推断 观察其实现细节源代码:public class VarTest{ public static void main(String[] args) { var s="abc"; var s2="bbc"; var i=1; var j=2; var k='e'; ...

2018-07-26 22:31:41 1291

原创 Java学习笔记 (十) 反编译lambda表达式

反编译lambda表达式观察其实现细节源代码:import java.util.*;public class LambdaTest{ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.a...

2018-07-26 22:15:28 3817 2

原创 Java学习笔记 (九) 反编译String的“+”

反编译String的“+” 观察其实现细节二话不说上源码:public class StringTest{ public static void main(String[] args) { String s1="I"; String s2=" Love"; String s3=" You"; String s4=s1..

2018-07-26 21:54:38 1226

原创 Java学习笔记 (八) 反编译 switch 观察其实现细节

看了H大的博客之后,发现还有反编译代码看实现细节的操作,学习一波,吸收营养。文末放博客链接地址。switch对整型支持的实现细节源代码,如下:public class SwitchTest{ public static void main(String[] args) { int a=1; switch (a) { case ...

2018-07-26 21:18:38 1489

原创 Java学习笔记 (七) Java中的编译与反编译

Java中的编译 Java语言的编译期是一段“不确定”的操作过程,因为它可能是指一个前端编译器(或编译器的前端)把.java文件转化为.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程;还有可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把.ja...

2018-07-25 22:08:51 1792

java-NIO 指南

JAVA NIO 指南。。

2018-12-26

空空如也

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

TA关注的人

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