自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbitMQ持久化与内存管理

持久化机制RabbitMQ的持久化分为消息持久化、队列持久化、交换器持久化。无论是持久化消息还是非持久化消息都可以被写入磁盘。当RabbitMQ收到消息时,如果是持久化消息,则会储存在内存中,同时也会写入磁盘;如果是非持久化消息,则只会存在内存中。当内存使用达到RabbitMQ的临界值时,内存中的数据会被交换到磁盘,持久化消息由于本就存在于磁盘中,不会被重复写入。消息的持久化是在发消息时,通...

2019-08-29 21:37:30 1251

原创 RabbitMQ核心概念与消息分发机制

RabbitMQ整体架构Producer生产者,就是透体消息的一方。生产者创建消息,然后发不到MQ中。消息一般可以分为两个部分:消息体:在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON字符串。附加信息:比如目标交换器的名称、路由键、消息头部和一些自定义属性等。BrokerRabbitMQ的服务节点,一个Broker可以简单的看作一台RabbitMQ服务器,...

2019-08-22 16:28:44 505

原创 JVM垃圾回收机制

在C/C++这样的语言中,分配和释放内存是一个手动过程,需要编程人员自己对内存进行管理,常常由于编程人员的失误,导致内存泄漏。在Java中,释放内存的过程由JVM帮我们处理,JVM通过垃圾收集器自动释放那些不再使用的内存。自动垃圾收集自动垃圾收集是查看堆内存,识别正在使用和未使用的对象以及哪些对象未被删除并删除未使用的对象的过程。使用中的对象意味着程序某些部分仍然有该对象的引用,当程序的任何部...

2019-08-21 10:34:22 220

原创 Java类加载器与双亲委派模型

类生命周期类加载器类加载器负责加载、验证、准备和解析步骤,但不会执行静态初始化,搜索网络、jar、zip、文件夹、内存指定位置的二进制类资源。一个Java程序运行,最少有三个类加载器实例,负责不同类的加载。Bootstrap ClassLoader:启动类库加载器,负责加载核心类库,由C/C++实现,没有对应的Java类,加载jre/lib目录和用户自己配置的目录,可使用Launcher...

2019-08-20 11:48:56 131

原创 Java NIO与多线程Reactor模式

Java1.4开始,提供了新的非阻塞IO操作的API,用来替代Java BIO和网络编程相关的API。Java NIO包括三个核心组件:Buffer缓冲区、Channel通道、Selector选择器。Buffer缓冲区缓冲区本质上是一个可以写入数据的内存块(可以是数组),然后可以从中读取数据。此内存块包含在NIO Buffer对象中,该对象提供了一组较方便地使用内存块的方法,相比较直接对数组操...

2019-08-19 16:46:38 699

原创 FutureTask源码解析

在Java中,我们知道创建线程有两种方式,继承Thread类或者实现Runnable 接口,但是这两种方式都是不能获取方法返回结果的。如果想获取结果,就需要做一些额外的处理,利用共享变量,线程间通信等方式,使用起来就不是很方便,对于不熟悉的人还可能出现线程安全问题。jdk1.5之后,提供了FutureTask类,以及Callable、Future接口,实现了对异步获取返回结果的支持。Callab...

2019-08-16 14:14:59 115

原创 ConcurrentHashMap原理解析,jdk1.7与1.8区别

总所周知,HashMap是非线程安全的工具类,在多线程环境下就需要一个线程安全的工具类来帮助我们实现线程安全,jdk1.5之前,我们使用HashTable,HashTable只是用synchronized同步关键字将put等大多数方法进行加锁,锁定的是整个对象,因此效率不高,jdk1.5之后,ConcurrentHashMap随着j.u.c包一起引入了JDK中,相对于HashTable,Concu...

2019-08-15 12:18:57 1021

原创 HashMap底层实现与原理解析,JDK1.7与1.8的区别

HashMap是基于Map接口的实现,采用key-value形式存储,在项目开发中,这种容器使用是非常广泛的,本文主要就是对HashMap的底层原理做个剖析,首先对比HashMap与HashTable的区别,然后以jdk1.7为例介绍HashMap的实现,再介绍jdk1.8做的改动。对比:HashTable、HashMapHashtable 是早期Java类库提供的一个哈希表实现,本身是同步...

2019-08-12 16:44:42 2984 2

原创 手写Lock锁与AQS抽象队列同步器

手写Lock锁锁的实现需要:两个方法:lock()、unlock()两个组件:锁的持有者、等待队列代码:public class CustomLock implements Lock{ //当前前程 AtomicReference<Thread> current = new AtomicReference(); //等待队列 LinkedBl...

2019-08-11 21:53:53 243

原创 高性能编程专题--多线程并发编程--锁的概念和synchronized关键字原理

在开始前,先介绍一下Java中有关锁的概念。从不同的维度,锁可以有不同的分类方式:乐观锁:假定没有并发冲突,在尝试修改数据时会有一个比较的过程,如果发现数据和之前获取的不一致,则读取最新数据,再次操作并重新尝试修改悲观锁:假定一定会有并发冲突,直接同步所有对数据的相关操作,从读取数据就开始上锁自旋锁:为了不放弃CPU执行时间,循环使用CAS技术对数据尝试进行更新,直至成功。自旋锁是一种乐观...

2019-08-09 19:10:34 206

原创 Java线程安全之CAS原子操作

1.竞态条件与临界区多个线程访问了相同的资源,向这些资源做了写操作时,对执行顺序有要求。临界区:方法内部某些部分区域代码,如果多线程执行时,会对结果产生不可预测影响。竞态条件:当临界区代码被多线程执行时,产生竞态条件。2.共享资源如果一段代码是线程安全的,则它不包含竞态条件。只有当多个线程更新共享资源时,才会产生竞态条件栈封闭时,不会在线程之间共享变量,因此是线程安全的局部对象引用本...

2019-08-08 16:19:34 123

原创 Java内存模型JMM与可见性问题

在讲述Java内存模型之前,先介绍几个概念:指令重排序,Java运行模式1.指令重排序java编程语言的语义允许编译器和处理器执行指令重排序优化,以提高程序运行效率。指令重排序需遵守as-if-serial,as-if-serial指的是:不管怎么重排序,单线程程序的执行结果不能被改变。编译器和处理器都必须遵守as-if-serial语义。也就是说,编译器和处理器不会对存在数据依赖关系的操...

2019-05-19 14:43:21 159

原创 Java线程池应用及实现原理

为什么要用线程池:线程在java中是一个对象,更是操作系统的资源,线程的创建销毁需要时间。如果创建+销毁时间>执行任务时间就很不划算。 java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小为1M,这个栈空间是需要系统内存中分配的。因此线程过多,会消耗很多内存。 操作系统需要频繁切换线程上下文,影响性能。通过使用线程池可以控制线程数量,并且实现线程...

2019-05-15 22:17:05 157

原创 Threadlocal解析与栈封闭

多线程访问共享变量可变数据时,涉及到线程间数据同步的问题。并不是所有时候,都要用到共享数据,所以线程封闭概念就提出来了。数据都被封闭在各自的线程中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的技术称为线程封闭。线程封闭包括:ThreadLocal、栈封闭1.ThreadLocalThreadLocal是java里一种特殊的变量。它是一个线程级别的变量,每个线程都有一个Thr...

2019-05-15 19:54:31 195

原创 Java并发基础--CPU性能优化与内存屏障

为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化:1.CPU高速缓存。尽可能地避免处理器访问主内存的时间开销,处理器大多会利用高速缓存以提高性能。CPU缓存分为多几缓存,如图L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器CPU的L1缓存容量在32-4096KB。 L2 由于L1级高速缓存容量的限制,为了再次提高CPU的运算速度,在...

2019-05-14 16:07:40 608

原创 Java线程状态与线程通讯wait/notify,park/unpark机制

Java线程状态Java线程共有6个状态,在java.lang.Thread.State中明确定义。线程状态图:1.NEW 尚未启动的线程的状态2.Runnable 可运行的线程的状态,包括等待CPU调度和正在运行的线程的状态3.Blocked 等待监视器锁的阻塞线程的状态,处于synchronized同步代码块或方法中被阻塞4.Waiting 等待线程的状态。...

2019-05-13 20:41:17 868

原创 JVM运行时数据区

JVM运行时数据区如图分为五个部分,其中方法区和堆内存为线程共享,虚拟机栈,本地方法栈,程序计数器为线程独占。线程独占:表示每个线程都会有它独立的空间,随线程生命周期而创建与销毁;线程共享:表示所有线程都能访问的内存数据,随虚拟机创建和销毁,也可以GC销毁。1.方法区JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。虚拟机规范中这是一个逻辑划分,不...

2019-05-07 22:09:20 133

原创 深度学习-L2正则化

神经网络可能会存在过拟合,那么建议你首先对模型进行正则化处理。虽然使用更多的训练数据是肯定可以解决过拟合问题的,但问题是我们无法获得更多训练数据,即使能获取也太贵了。所以正则化是首选方案。正则化方法有很多。L2正则化就是其中一种常见的方法。它的实现主要分为两步。第一步,就是在成本函数后面加点“尾巴”;第二步就是在计算偏导数的时候加点“尾巴”。我们以逻辑回归为例来实现L2正则化,求成本函数J的最小...

2019-03-11 14:22:48 1920

原创 深度学习-深度神经网络

神经网络是由一个个神经元相互连接并按层次排列构成的,深度神经网络是有任意层的神经网络,这里的深度是指层次的多,而不是神经元数量的多。有任意层,那么就要有一个循环来负责遍历每一层进行计算。所以深度神经网络的计算形式,就必须要适应这个循环结构。我们先来说说神经元吧这个神经元通过对x,w,b进行运算,得出z,然后再由z得出a。对于多神经元神经网络,其实也是一样的。简单来说就是重复单神经元的流程,把...

2019-03-11 13:24:12 818

原创 深度学习-核对矩阵维度

在编写深度神经网络程序时,出现的很多问题都是由于矩阵的维度不对引起的,而且这个问题非常难查。而且python有时候还会改变矩阵的维度(例如之前我们学到的python广播化),所以我们需要经常核对矩阵的维度,使他们的维度与我们预料中的保持一致。上面是一个五层的神经网络,输入层有2个元素,所以n[0] =2,第一层有三个元素,所以n[1] =3,所以w[1]为(3,2)其他层同理。因此单个训练样本...

2019-03-11 13:13:03 965

原创 深度学习-神经网络激活函数

使用一个神经网络时,需要决定使用哪种激活函数用隐藏层上,哪种用在输出节点上。之前逻辑回归输出节点使用的激活函数是sigmoid激活函数,图像如下,但是,有时其他的激活函数效果会更好。tanh函数或者双曲正切函数是总体上都优于sigmoid激活函数。如图,y=tan(x)=ex−e−xex+e−xy=tan(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}y=tan(x)=e...

2019-03-01 09:48:39 814

原创 深度学习-反向传播与梯度下降

首先让我们来回顾一下有关逻辑回归的知识。如下图所示,在逻辑回归的前向传播过程中,第一步我们要先计算出z,第二步计算出预测值y^\hat{y}y^​,最后计算出损失函数L。         z = wTw^TwTx+b         y^\hat{y}y^​ = 11+e−z\frac{1}{1 + e^{-z}}1+e−z1​         L(y^\hat{y}y^​, y) = -(...

2019-02-25 11:27:56 996 1

原创 深度学习-逻辑回归sigmoid激活函数

逻辑回归学习算法,适用于二分类问题。对于二元分类问题来讲,给定一个输入特征向量X,它可能对应一张图片,如果想识别这张图片看它是一只猫或者不是一只猫的图片,那么就需要一个算法能够输出预测,输出值为y^\hat{y}y^​(也就是预测值),也就是对实际值 y 的估计。更正式地来说,要让y^\hat{y}y^​表示 y 等于1的一种可能性或者是概率,通过这个值来告诉你这是一只猫的图片的机率有多大。X...

2019-02-25 09:35:11 1501

空空如也

空空如也

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

TA关注的人

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