自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

java技术交流

源码分析,分布式,微服务三大专题资料加群:821169538

  • 博客(90)
  • 收藏
  • 关注

原创 金九银十,查漏补缺:线程池要是像你想的那么简单就好了

来源https://juejin.im/post/5ce1f3b6f265da1ba2522f62前言原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它;但在动手写的过程中落地到细节时发现并没想的那么容易。结合源码对比后确实不得不佩服 Doug Lea 。我觉得大部分人直接去看 java.util.concurrent.ThreadPo...

2019-09-28 15:09:57 185

原创 金九银十,查漏补缺:Java线程同步与实现

前言为何要使用Java线程同步? Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时,将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。但其并发编程的根本,就是使线程间进行正确的通信。其中两个比较重要的关键点,如下:线程通信:重点关注线程同步的几种方式; 正确通信:重点关注是否有...

2019-09-27 21:28:13 240

原创 金九银十,查漏补缺:JVM常见面试题解析

前言总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。1.什么情况下会发生栈内存溢出。思路: 描述栈定义,再描述为什么会溢出,再说明一下相关配置参数,OK的话可以给面试官手写是一个栈溢出的demo。我的答案:栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作...

2019-09-27 14:46:27 241

原创 金九银十,查漏补缺:Java GC 分析

https://juejin.im/post/59c070706fb9a00a4455f193Java GC就是JVM记录仪,书画了JVM各个分区的表演。什么是 Java GCJava GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要...

2019-09-26 21:13:17 125

原创 金九银十,查漏补缺:JVM内存模型

来源:https://juejin.im/post/5ad5c0216fb9a028e014fb63JVM回顾 JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)运行时数据区域   Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数...

2019-09-26 15:10:29 106

原创 金九银十,查漏补缺:JVM的内存区域是怎样划分的?

出处:http://www.cnblogs.com/dolphin0520/学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看...

2019-09-24 15:04:25 80

原创 连接器在Tomcat中是如何设计的

来源:https://my.oschina.net/luozhou/blog/3097513上期回顾上一篇文章《SpringBoot启动Tomcat》从main方法启动说起,窥探了SpringBoot是如何启动Tomcat的,在分析Tomcat中我们重点提到了,Tomcat主要包括2个组件,连接器(Connector)和容器(Container)以及他们的内部结构图,那么今天我们来分析...

2019-09-23 22:13:35 120

原创 SpringBoot启动Tomcat

来源:https://my.oschina.net/luozhou/blog/3088908前言我们知道SpringBoot给我们带来了一个全新的开发体验,我们可以直接把web程序达成jar包,直接启动,这就得益于SpringBoot内置了容器,可以直接启动,本文将以Tomcat为例,来看看SpringBoot是如何启动Tomcat的,同时也将展开学习下Tomcat的源码,了解Tomc...

2019-09-23 20:39:21 161

原创 金九银十,正在面试吗?面试官必问:JVM架构解读,查漏补缺

来源:www.codeceo.com前言每个Java开发人员都知道字节码由JRE(Java运行时环境)执行。但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它。作为开发人员,我们应该知道JVM的架构是非常重要的,因为它使我们能够更有效地编写代码。在本文中,我们将更深入地了解Java中的JVM架构和JVM的不同组件。什...

2019-09-23 17:27:13 98

原创 金九银十,每天还在增删查改,怎么看透JVM本质?

前言JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。这里就给大家讲一下JVM。...

2019-09-21 20:23:41 92

原创 秋招开始了,读《深入理解JVM虚拟机》总结

重读 JVM秋招开始了,前面由于做别的事耽误了半个月,以前学的东西不用就很容易忘记。所以,这次重新阅读《深入理解 JVM 虚拟机》时,想做一个记录。将碎片的知识整合,方便自己以后阅读,同时也和大家一起分享。内容中会添加我自己的理解,其中如果有错误,欢迎大家指正。1. Java 内存区域与内存溢出异常1.1 运行时数据区域根据《Java 虚拟机规范(Java SE 7 版)》规...

2019-09-21 17:04:33 150

原创 百因必有果,JVM调优(工具篇)建议收藏

18年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。jvm监控分...

2019-09-21 16:26:50 388

原创 查漏补缺,JVM系列:(JVM内存组成及分配)

java内存组成介绍:堆(Heap)和非堆(Non-heap)内存按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用...

2019-09-21 15:41:59 91

原创 探索Java字节码如何增强

1.字节码1.1 什么是字节码?Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看出字节码对于Java生态的重要性。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。在Java中一般是用...

2019-09-12 10:52:19 175

原创 Dubbo 源码分析 - 服务引用

1. 简介本文分析服务引用的原理。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直联的方式引用服务,第二种方式是基于注册中心进行引用。服务直联的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等...

2019-09-10 22:15:39 85

原创 Nginx源码阅读笔记-内存池的设计

nginx的内存池设计的比较简单了,一个内存池中分为两个部分:超过max大小的内存分配,走大块内存分配,这部分内存管理由ngx_pool_large_t结构体负责。 否则就是在ngx_pool_t遍历符合要求的ngx_pool_t结构体,找到符合要求大小的pool直接返回,否则就申请一块新的内存pool。nginx中所有请求都单独对应一个内存池,在这个请求的过程中,所有涉及到内存分配的地方...

2019-02-14 21:56:00 158

原创 还是自己撸一个java的mvc框架吧!

怎么写呢?因为在之前写代码的时候,我把每个类要做的事情分的比较清楚,所以在添加这个功能的时候写起来还是比较简单的,需要修改的地方也比较小。这一章里我们需要干的事情有: 定义一个注解,标识某一个class中的被添加注解的方法是一个 UrlMethodMapping 。 修改配置文件,添加需要扫描的 package 。 写一个方法,根据 package 中值找到其中 ...

2019-02-13 21:40:57 181

原创 来玩一下Java设计模式之命令模式

wiki上的描述 Encapsulate a request as an object, thereby allowing for the parameterization of clients with different requests, and the queuing or logging of requests. It also allows for the support of und...

2019-01-23 20:56:15 166

原创 Java-深入HashMap原理及内部存储结构

本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程。public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 0; i < 50; i++) { map.put("key" + ...

2019-01-22 21:31:12 2386

原创 教你怎么样在 Java8 中优雅的避开空指针异常

要说 Java 编程中哪个异常是你印象最深刻的,那 NullPointerException 空指针可以说是臭名昭著的。不要说初级程序员会碰到, 即使是中级,专家级程序员稍不留神,就会掉入这个坑里。Null 引用的发明者Tony Hoare 曾在 2009 年作出道歉声明,声明中表示,到目前为止,空指针异常大约给企业已造成数十亿美元的损失。下面是 Tony Hoare 的原话:我将 N...

2019-01-22 21:22:33 3401

原创 55道Java经典面试题+答案(全)

这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的朋友在笔试时更好地赢得笔试和面试。1 、一个 ".java" 源文件中是否可以包括多个类(不是内部类)?有什么限制?可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。2 、 Java 有没有 goto?java 中的保留字,现在没有在 ja...

2019-01-22 21:16:48 444

原创 JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?

 public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(10); service.submit(() -> System.out.println("Hello ")); System.out.pr...

2019-01-22 21:01:51 2950 1

转载 Java集合框架详解

一、Java集合框架概述集合可以看作是一种容器,用来存储对象信息。所有集合类都位于 java.util 包下,但支持多线程的集合类位于 java.util.concurrent 包下。数组与集合的区别如下:1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。2)数组元素既可以是基本类型的值,也可以是对象;集合只能保...

2019-01-15 19:32:29 95

原创 Java并发之AQS源码分析

AQS 全称是 AbstractQueuedSynchronizer,顾名思义,是一个用来构建锁和同步器的框架,它底层用了 CAS 技术来保证操作的原子性,同时运用了 CLH 同步队列作同步器,这也是 ReentrantLock、CountDownLatch 等同步工具实现同步的底层实现机制。它能够成为实现大部分同步需求的基础,也是 J.U.C 并发包同步的核心基础组件。说是框架,其实就是一个...

2019-01-10 21:26:47 198

原创 深入理解Java自带的线程池和缓冲队列

前言线程池是什么线程池的概念是初始化线程池时在池中创建空闲的线程,一但有工作任务,可直接使用线程池中的线程进行执行工作任务,任务执行完成后又返回线程池中成为空闲线程。使用线程池可以减少线程的创建和销毁,提高性能。举个例子:我是一个包工头,代表线程池,手底下有若干工人代表线程池中的线程。如果我没接到项目,那么工人就相当于线程池中的空闲线程,一但我接到了项目,我可以立刻让我手下的工人去工作...

2019-01-09 16:36:14 425

原创 Java消息系统简单设计与实现

前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单...需求分析我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息里包含了有:喜欢和赞、评论、关注、私信这样的一类东西,这样的一个系统应该包含以下的功能: 当用户 评论/关注/点赞 时能够 通知 到被评论/关注/点赞的用户,并生成像如下格式的提示信息(允许...

2019-01-08 19:37:26 8268

原创 年后跳槽怕面试不过关?搞懂并发编程,轻松应对80%的面试场景

作为一个合格的Java程序员,必须要对并发编程有一个深层次的了解,在很多互联网企业都会重点考察这一块。可能很多工作3年以上的Java程序员对于这一领域几乎没有太多研究。所以在接下来内容中,我会将并发编程整个领域由浅到深做非常全面的分析。内容导航从操作系统的发展了解进程、线程模型 线程的优势 线程的生命周期 线程的应用场景了解进程、线程模型每次学习一个新技术,我会先去了解这个技术...

2018-12-28 21:23:54 112

原创 老板!你确定要让我写个 BUG吗!

前言标题没有看错,真的是让我写个 bug!刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了

2018-12-28 21:19:22 186

原创 Java的内部类其实不难理解

01 前言昨天晚上,我把车停好以后就回家了。回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小时的“世外桃源”生活——别人找不到我,我也找不到别人,这种与世隔绝的状态非常适合读书写作。把厚厚的《Java编程思想》摆在桌子上,正襟危坐,认认真真地读起了第十章——内部类。尽管我已经非常耐心和...

2018-12-28 21:04:19 172

原创 来看看Redis 集群分布式锁与 API 网关分布式限流

Redis 集群的历史Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twemproxy、Codis),二是使用 Sentinel(哨兵)。 通过 Sentinel 是一种使用哨兵来达到高可用的方案,而 proxy 是用于在前置上进行 sharding 用代理给后端的 redis 集群的方案,达到负载均衡的方案,在单个分片的 redis 中作主从。 因为本文要重点讲解的不是 3...

2018-12-28 19:49:21 359

原创 Java 静态代理和动态代理的使用及原理解析

代理模式是软件开发中常见的设计模式,它的目的是让调用者不用持有具体操作者的引用,而是通过代理者去对具体操作者执行具体的操作。静态代理的实现操作接口:public interface Operate { void doSomething();}复制代码操作者:public class Operator implements Operate { @Overr...

2018-12-26 21:17:31 181

原创 面试阿里常被问到的十个 Java 面试题

1. 以满分十分来评估自己——你有多擅长 Java?如果你并不完全确信你自己或是你对 Java 的熟练程度,那么这会是一个非常棘手的问题。如果有这种情况,你应该把打分调低一点。之后,你大概会得到与你承认的水平相符的问题。因此,假如你给自己满分,却不能回答一个有点难的问题,那将会对你不利。2. 阐述 Java 7 和 Java 8 的区别。实话说,两者有很多不同。如果你能列出最重要的,应...

2018-12-22 16:01:26 617

原创 分享一个今日头条的面试题——LRU原理和Redis实现

很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU。我的第一反应该是内存不够的场景下,淘汰旧内容的策略。LRU ... Least Recent Used,淘汰掉最不经常使用的。可以稍微多补充两句,因为计算机体系结构中,最大的最可靠的存储是硬盘,它容量很大,并且内容可以固化,但是访问速度很慢,所以需要把使用的内容载入内存中;内存速度...

2018-12-20 19:25:42 2316

原创 十年架构师不到400行手写一个Spring MVC

人见人爱的Spring已然不仅仅只是一个框架了。如今,Spring已然成为了一个生态。但深入了解Spring的却寥寥无几。这里,我带大家一起来看看,我是如何手写Spring的。我将结合对Spring十多年的研究经验,用不到400行代码来描述SpringIOC、DI、MVC的精华设计思想,并保证基本功能完整。首先,我们先来介绍一下Spring的三个阶段,配置阶段、初始化阶段和运行阶段(如图):...

2018-12-19 17:15:36 847

原创 深入了解Java字符串常量池

java中有几种不同的常量池,以下的内容是对java中几种常量池的介绍以及重点研究一下字符串常量池。class常量池我们写的每一个Java类被编译后,就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种 字面量 (Literal)和 符号引用 (Symbolic...

2018-12-18 21:20:41 99

原创 JVM 中的守护线程

特点通常由JVM启动运行在后台处理任务,比如垃圾回收等用户启动线程执行结束或者JVM结束时,会等待所有的非守护线程执行结束,但是不会因为守护线程的存在而影响关闭。判断线程是否为守护线程判断一个线程是否为守护线程,主要依据如下的内容/* Whether or not the thread is a daemon thread. */private boolean daemo...

2018-12-17 19:26:36 722

原创 记一次面试最常见的10个Redis"刁难"问题

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。作为一名在互联网技术行业打击过成百上千名【请允许我夸张一下】的资深技术面试官,看过了无数落寞的身影...

2018-12-14 19:26:07 1573

原创 怎样实际项目中运用责任链模式

1 模式概要1.1 简介责任链模式为请求创建一个接收者对象链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,依此类推 责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。1.2 责任链模式优缺点优点降低耦合度。它将请求的发送者和接收者解...

2018-12-11 19:28:27 391

原创 详谈分布式最终一致性

“什么是分布式系统?这取决于看系统的角度。对于坐在键盘前使用IBM个人电脑的人来说,电脑不是一个分布式的系统。但对于在电脑主板上趴着的虫子来说,这台电脑就是一个分布式系统。” —— Leslie Lamport 引言分布式一致性问题随处可见,任何一个实体/联接模型,都可能存在分布式一致性问题。如果把单机拆开来看,CPU、内存、I/O设备组成的机箱本身就是一个小型的分布式系统,需要确保对...

2018-11-29 20:53:48 1315

原创 分享Java 中如何运行字符串表达式?

在日常的开发中,偶尔会遇到运行字符串表达式的情况,通常这样的需求会对需求进行进一步分析,然后进行进一步 “特殊化”,最后直接写到硬代码中,这样做的话,就不太好扩展了;也有另外的处理方式是采用 Java 内置的 JavaScript 引擎等运行字符串表达式,但是内置引擎也有弊端,比如频繁运行片段式的字符串的效率非常低,并且与 Java 之间的数据交互比较麻烦,于是,便产生了写一个“字符串表达式计算引...

2018-11-28 20:39:58 399

空空如也

空空如也

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

TA关注的人

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