09 2019 档案
摘要:环境是CentOS7。 采用NFS实现。 第一步:服务端安装nfs和rpcbind并启动 检查是否已经安装 表示nfs已经安装 表示rpcbind已经安装。 如果没检测到则安装 查看是否启动: 表示已经启动,如果没启动则 启动。 第二部:客户端安装nfs和rpcbind并启动 步骤如上: 第三部:配
阅读全文
摘要:原先我们学习了jvm的命令行工具,现在我们来学习命令行的可视化工具jconsole: 为了测试我们启动原先的springboot项目 jconsole工具 jconsole(Java Monitoring and Management Console)是一种基于 JMX 的可视化监视、管理工具,它管
阅读全文
摘要:一、6种状态 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行
阅读全文
摘要:概述 给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。 数据包括:运行日志、异常堆栈、GC 日志、线程快照。 使用(threaddump/javacore文件)、堆转储快照( heapdump/hprof文件)等。使用适当的虚拟机监控和分析的工具可以加快我们
阅读全文
摘要:如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。 虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。试想一下:如果有一种四海之内、任何场景
阅读全文
摘要:经过上篇如何判断对象是否死亡,那么jvm要对死亡的对象进行垃圾回收,垃圾回收的算法主要有以下几种: 一、标记-清楚算法 该算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带
阅读全文
摘要:堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不能再被任何途径使用的对象)。 判断兑现死亡的方式主要有,引用记数法和可达性性分析算法 引用记数法 给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对
阅读全文
摘要:java堆内存概述 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集
阅读全文
摘要:上一篇jvm博客中我们学习了jvm的内存模型,本篇中我们来探索对象是如何创建的,对象的内存布局,对象是如何访问到的。 对象的创建过程 第一步:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中(JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出
阅读全文
摘要:mysql5.5版本以上默认的引擎是InnoDB,5.5以下,默认引擎是MYISAM,根本还是要根据引擎的不同去考虑。 InnoDB和MyISam区别: 区别项Innodbmyisam 事务 支持 不支持 锁粒度 行锁,适合高并发 表锁,不适合高并发 是否默认 默认 非默认 支持外键 支持外键 不支
阅读全文
摘要:在我们编写sql的过程中where的条件使用不当会使索引(index)失效 1. 在 where 子句中使用!=或<>操作符,会使引擎放弃使用索引而进行全表扫描 2. 在 where 子句中对字段进行 null 值判断,会使引擎放弃使用索引而进行全表扫描 3. 在 where 子句中使用 or 来连
阅读全文
摘要:NIO简介 NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。 NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO
阅读全文
摘要:mysql查询的过程图 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时:数据库表、字段的设计,存储引擎 利用好MySQL自身提供的功能,如索引等 横向
阅读全文
摘要:什么是序列化和反序列化? 序列化是将 Java 对象转换成与平台无关的二进制流,而反序列化则是将二进制流恢复成原来的 Java 对象,二进制流便于保存到磁盘上或者在网络上传输。 如何实现序列化和反序列化 如果想要序列化某个类的对象,就需要让该类实现 Serializable 接口或者 Externa
阅读全文
摘要:一. IO的分类 从数据来源或者说是操作对象角度看,IO 类可以分为: 1. 文件(file):FileInputStream、FileOutputStream、FileReader、FileWriter 2. 管道操作:PipedInputStream、PipedOutputStream、Pipe
阅读全文
摘要:缓存的收益和成本 1、缓存带来的回报 高速读写:缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果 降低后端负载:后端服务器通过前端缓存降低负载: 业务端使用Redis降低后端MySQL负载等 2、缓存带来的
阅读全文
摘要:一 String 1、set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 如: set a 1 ex 10 , 10秒有效 Set a 1 px 9000 , 9秒有效 注: 如果ex,px同时写,以后面的有效期为准 如 set a 1 ex 100 px 900
阅读全文
摘要:下载 官网地址:http://download.redis.io/releases/redis-5.0.5.tar.gz 安装 首先安装编译环境 出现如下图表示安装成功 解压 解压完成如下 编译 测试编译是否有问题 解决编译问题 出现下图,表示测试成功 安装 安装完成! 启动方式 直接启动 表示启动
阅读全文
摘要:一、概述 Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)
阅读全文
摘要:数据结构 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。再简单描述一下:数据结构就是描述对象间逻辑关系的学科。 数据存储结构 常用的数据存储方式有两种:顺序存储,非顺序存储。顺序存储就是把数据存储在一块联系的存储介质(硬盘或内存等)中。反之则是非顺序存储。 Java中的数组就是典型的顺
阅读全文
摘要:简介 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 有些类如交易所的核
阅读全文
摘要:使用场景 工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。 介绍 它是由一个工厂对象决定
阅读全文
摘要:总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面
阅读全文
摘要:什么是NOSQL NoSQL是不同于传统的关系数据库的数据库管理系统的统称。其两者最重要的区别是NoSQL不使用SQL作为查询语言。NoSQL数据存储可以不需要固定的表格模式。NoSQL是基于键值对的,可以想象成表中的主键和值的对应关系。NoSQL:redis、memcached、mongodb、g
阅读全文
摘要:cpu和计算机内存的交互 在计算机中,cpu和内存的交互最为频繁,相比内存,磁盘读写太慢,内存相当于高速的缓冲区 但是随着cpu的发展,内存的读写速度也远远赶不上cpu。因此cpu厂商在每颗cpu上加上高速缓存,用于缓解这种情况。现在cpu和内存的交互大致如下。 cpu上加入了高速缓存这样做解决了处
阅读全文
摘要:参数传递 Java 的参数是以值传递的形式传入方法中,而不是引用传递。 以下代码中 Cat cat的 cat是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。因此在方法中使指针引用其它对象,那么这两个指针此时指向的是完全不同的对象,在一方改变其所
阅读全文
摘要:概览 String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承) 在 Java 8 中,String 内部使用 char 数组存储数据。 在 Java 9 之后,String 类的实现改用 byte 数组存储字符串,同时使用 coder 来标识使用了哪种编码。 v
阅读全文
摘要:基本概念 bit(位) 位是计算机中存储数据的最小单位,指二进制数中的一个位数,其值为“0”或“1”。 byte(字节) 字节是计算机存储容量的基本单位,一个字节由8位二进制数组成。在计算机内部,一个字节可以表示一个数据或者一个英文字母,但是一个汉字需要两个字节表示。 换算 1Byte=8bit1K
阅读全文
摘要:java编译期 编译期是指编译器将源代码翻译为机器能识别的代码,java为编译为jvm认识的字节码文件。 举个例子,当我们作为开发人员,在电脑上拼死拼活写了一个版本的代码,然后将代码提交到git上去,当我们用jekins或其他工具将代码从git上clone下来,使用mvn package,或者mvn
阅读全文
摘要:例子 编写出现OutOfMemoryError的代码 IDEA配置JVM的启动参数 点击Edit Configurations... 运行结果 分析 Dump下的文件: 分析工具 采用IBM HeapAnalyzeer 网盘现在地址:https://pan.baidu.com/s/1qV4A4fm8
阅读全文
摘要:一、基础概念 URI URI 包含 URL 和 URN。 请求和响应报文 请求报文 响应报文 二、HTTP请求方法 客户端发送的 请求报文 第一行为请求行,包含了方法字段。 GET 获取资源 当前网络请求中,绝大部分使用的是 GET 方法。 HEAD 获取报文首部 和 GET 方法类似,但是不返回报
阅读全文
摘要:Executor 简介 Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更
阅读全文
摘要:一、三大特性 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外的接口使其与外部发生联系。 用户无需关心对象内部的细节,但可以通过对象对外提供的接口来访问该对象。 优点: 减少耦合:可以独立地
阅读全文
摘要:为什么要使用线程池 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP )、通过 JMS队列或者可能通过轮询数据库。不管请求如何到达,服务器应用程序
阅读全文
摘要:CountDownLatch CountDownLatch是一种java.util.concurrent包下一个并发工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成。 可以控制线程的执行顺序 例子:学校操场的跑道上8位选手首先进行1000米赛跑,跑完裁判清空跑道进行跨栏比赛。 结果:
阅读全文
摘要:为什么会出现同步容器 java集合框架图 在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。 List、Set、Queue接口分别继承了Collection接口,Map本身是一个接口。 Collection和Map是一个顶层接口,而List、Set、Queue则继承了
阅读全文
摘要:使用场景 线程A执行到一半,需要一个数据,这个数据需要线程B去执行修改,只有B修改完成之后,A才能继续操作 线程A的run方法里面,调用线程B的join方法,这个时候,线程A会等待线程B运行完成之后,再接着运行 代码: 结果: 源码 完成!!!
阅读全文
摘要:使用管道流进行通信 以内存为媒介,用于线程之间的数据传输。 主要有面向字节:【PipedOutputStream、PipedInputStream】 面向字符【PipedReader、PipedWriter】 代码 读线程类: 测试类 结果: 源代码地址:https://github.com/wox
阅读全文
摘要:wait、notify、notifyAll 何时使用 在多线程环境下,有时候一个线程的执行,依赖于另外一个线程的某种状态的改变,这个时候,我们就可以使用wait与notify或者notifyAll wait跟sleep的区别 wait会释放持有的锁,而sleep不会,sleep只是让线程在指定的时间
阅读全文
摘要:代码 在这里我们只是实现lock()和unLock()方法 测试 结果 源代码地址:https://github.com/woxbwo/is-concurrent 完成!!!
阅读全文
摘要:Lock的使用 代码: 结果: lock与synchronized的区别 lock 获取锁与释放锁的过程,都需要程序员手动的控制 Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就 是CAS操作 synchr
阅读全文
摘要:锁的分类 自旋锁: 线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁上下文切换不值得。jvm实现,使线程在没获得锁的时候,不被挂起,转而执行空循环,循环几次之后,如果还没能获得锁,则被挂起。 阻塞锁:阻塞锁改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间
阅读全文