自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

向代码提问

部分是结合网上资料整理记录在印象笔记中的,如果原创标签有问题的话,请留言,我会第一时间修改的。

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

原创 Apollo搭建踩过的那些坑

环境:阿里云 CentOSJava 8Apollo 1.1问题一Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.ctrip.framework.apollo.tracer.Tracer at com.ctrip.framework.a...

2020-03-04 02:06:34 14887 3

原创 预览:Mybatis源码解析之解析器模块

主要功能1、对XPath进行封装,为MyBatis初始化时解析mybatis-config.xml配置文件以及映射配置文件提供支持2、处理动态SQL语句中的占位符提供支持目标模块源码地址https://gitee.com/bitongchong/mybatis-3/tree/feature/learningBranch/src/main/java/org/apa...

2020-01-30 17:21:29 238

原创 十五:运行时栈帧结构

栈帧( Stack frame)用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)s的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈...

2019-06-08 19:12:06 310

原创 十四:类加载的过程

加载->验证->准备->解析->初始化1.加载比如运行时计算生成,这种场景使用得最多的就是动态代理技术,在java.lang.reflect.Proxy中,就是用了ProxyGenerator.generateProxyClass来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流。加载阶段与连接阶段的部分内容(如一部分字节码文件格式验...

2019-06-07 18:28:19 174

原创 十三:类加载的时机

类的生命周期:类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)解析阶段的特殊性:加载、...

2019-06-07 18:27:48 149

原创 十二:Class文件常量池

Java代码在进行Javac编译的时候,并不像C和C++那样有“连接”这一步骤,而是在虚拟机加载 Class文件的时候进行动态连接也就是说,在 Class文件中不会保存各个方法、字段的最终内存布局信息,因此这些字段、方法的符号引用不经过运行期转换的话无法得到真正的内存入口地址,也就无法直接被虚拟机使用当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的...

2019-06-07 18:27:22 178

原创 十一:堆外内存导致的溢出错误

问题导入:某项目运行在内存4GB的32位Windows机器上,运行Jetty服务器,划分了1.6GBA给堆内存,但是依旧不时会抛出内存溢出异常原因:操作系统对每个进程能管理的内存是有限制的,这台服务器使用的32 位 Windows平台的限制是2GB,其中划了16GB给Java堆,而 Direct Memory内存并不算入1.6GB的堆之内,因此它最大也只能在剩余的0.4GB空...

2019-06-07 18:27:02 300

原创 九:内存分配与回收策略

1.对象优先在新生代的Eden区进行分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次 Minor GC。2.大对象直接进入老年代3.长期存活的对象将进入到老年代(虚拟机设置值,默认阈值为15)为了能够识别哪些对象存在新生代,哪些老年代,虚拟机给每个对象定义 了一个对象年龄(Age)计数器。如果对象在Eden出生并经过第一次 Min...

2019-06-07 18:26:37 165

转载 八:垃圾回收相关参数

-verbose:gc 显示gc详细信息

2019-06-07 18:25:44 200

原创 八:理解GC日志

默认垃圾收集器-XX:+UseParallelGC【-XX:+PrintCommandLineFlags -version查看】G1垃圾收集器GC日志开头的“[GC”和“[Full GC”说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的。如果有“Full”,说明这次GC是发生了Stop-The-World的。后面的“4639K->4622K...

2019-06-07 18:25:13 464

原创 附:问而知

结合JDK谈谈了解的设计模式单例模式:JDK的lang包中Runtime类的getRuntime()对Runtime实例的获取就是饿汉式单例的体现抽象工厂:JDK的sql包中的Connection接口就将一个产品族的构建方法进行了统一定义工厂方法:JDK的util包中的Collection接口中的iterator()方法就是一个工厂方法,使用这个方法来返回一个由子类实现的Iterato...

2019-06-07 18:24:10 195

原创 附-七大软件设计原则

该文章部分图片来自:慕课网《java设计模式精讲 Debug 方式+内存分析》七大原则:开闭原则、依赖倒置原则、单一职责原则接口隔离原则、迪米特法则、里式替换原则、组合复用原则注:1.高层底层不是UML图中类的高低,而是指在类似于MVC架构中的Service(高),DAO(低)这种2.通过抽象构建出来的架构一般要比通过细节构建出...

2019-06-07 18:22:38 205

原创 附:单例模式的破坏

序列化对象对单例模式的破坏与恢复首先这是一个饿汉式的单例对象构建方式,一般情况下获取到的都是同一个单例对象但是当序列化写入本地再读入内存时,会重新创建一个单例对象为什么会在读入序列化后的对象时会让单例模式失效呢?这儿从readObject()方法入手进入这个方法后:private Object readObject0(boolean unshared)进入p...

2019-06-07 18:20:34 126

原创 10-命令模式(Command)

定义:将"请求"封装成对象,以便使用不同的请求命令模式解决了应用程序中对象的职责以及它们之间的通信方式(即命令者和执行者完全解耦)适用场景请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互需要抽象出等待执行的行为优点降低耦合容易扩展新命令或者一组命令缺点:命令的无限扩展会增加类的数量,提高系统实现复杂度示例DEMO&am...

2019-06-06 20:09:23 173

原创 09-观察者模式(Observer)

附:或叫监听器模式(Listener)定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会 收到通知并更新适用场景:关联行为场景,建立一套触发机制优点观察者和被观察者之间建立一个抽象的耦合观察者模式支持广播通信缺点观察者之间有过多的细节依赖、提高时间消耗及程序复杂度...

2019-06-06 20:08:58 145

原创 08-策略模式(Strategy)

定义:定义了算法家族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化不会影响到使用算法的用户。可以通过策略模式清除大量的if..else。适用场景系统有很多类,而他们的区别仅仅在于他们的行为不同一个系统需要动态地在几种算法中选择一种优点:满足开闭原则避免使用多重条件转移语句提高算法的保密性和安全性:只需要知道策略类是干什么的,而不需要知...

2019-06-06 20:08:30 131

原创 07-代理模式(Proxy)

概述:控制对其它对象的访问。使用场景:保护目标对象增强目标对象优点:代理模式能将代理对象与真实被调用的目标对象分离一定程度上降低了系统的耦合度,扩展性好保护目标对象 增强目标对象缺点:代理模式会造成系统设计中类的数目增加在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢增加系统的复杂度拓展:静态代理:通过在代码中显式定义一个业务实...

2019-06-06 20:07:52 174

原创 06-装饰者模式(Decorator)

概述:为对象动态添加功能。装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也...

2019-06-06 20:06:37 214

原创 05-适配器模式(Adapter)

概述:把一个类接口转换成另一个用户需要的接口,使原本接口不兼容的类可以一起工作适用场景:已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)不是软件设计阶段考虑的设计模式,是随着软件维护,由于 不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案优点:能提高类的透明性和复用,现有的类复用但不需要改变目标类和适配器类解耦,提高程序扩展性符合开闭原则缺...

2019-06-06 20:05:52 134

原创 04-原型模式(Prototype)

概述:使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象不需要知道任何创建的细节,不调用构造函数适用场景:类初始化消耗较多资源new产生的一个对象需要非常繁琐的过程(数据准备、访问权 限等 构造函数比较复杂循环体中生产大量对象时优点:原型模式性能比直接new-个对象性能高简化创建过程缺点:必须配备克隆方法对克隆复杂对象或对克隆出的对象进行...

2019-06-06 20:05:17 151

原创 03-建造者模式(Builder)

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程 可以创建不同的表示用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道适用场景:如果一个对象有非常复杂的内部结构(很多属性) 想把复杂对象的创建和使用分离优点:封装性好,创建和使用分离 扩展性好、建造类之间独立、一定程度上解耦缺点:产生多余的 Builder对象产品内部发生变化,建造者都...

2019-06-06 20:04:29 138

原创 02-简单工厂&工厂方法&抽象工厂

1、简单工厂(Simple Factory)概述:在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。错误的方式:正确的方式:简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例...

2019-06-06 20:00:07 119

原创 01-单例模式(Singleton)

概述:使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。优点:在内存里只有一个实例,减少了内存开销可以避免对资源的多重占用设置全局访问点,严格控制访问缺点:没有接口,拓展比较困难饿汉式可以防止反射攻击,其他的则不能,因为饿汉式可以在类的链...

2019-06-06 19:58:33 185

原创 七:垃圾回收器

1.Serial收集器(-XX:+UseSerialGC 复制算法)1.是一个单线程收集器,只会使用一个CPU或一条收集线程去完成垃圾收集工作2.进行垃圾收集时,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(“Stop The World”)3.是HotSpot虚拟机运行在Client模式下的默认的新生代收集器4.与其他收集器的单线程相比更加简单高效,...

2019-05-13 20:21:55 166

原创 关于《深入理解Java虚拟机读书笔记》这个分类

该分类的内容来源?周志明先生的《深入理解Java虚拟机第二版》为什么都标的原创?现在部分是对书籍做的一个整理和要点提取,后面会逐渐二次提炼整理,逐步更新为什么大多都是提问的形式?因为这是我博客的风格,用提问的方式来确保自己是否掌握了这个知识点基于哪个版本的?在周先生书籍的基础上,修改添加了JDK8的一些变化书中的内容是否都有?之前整理过JVM相关内容,所以只有之...

2019-05-12 16:20:25 97

原创 六:HotSpot对象存活判定和垃圾回收算法的实现(是如何发起内存回收的)

首先需要明确如果逐个检查可以作为GC Roots节点的引用的话,是非常耗时的(很多应用一个方法区就几百兆)需要保证在分析的过程中对象的引用关系不能发生改变,否则就不能够保证结果的正确性。因此在GC过程中,必须要停顿(枚举根节点是必须要停顿的)枚举根节点因此HotSpot中通过使用一组OopMap的数据结构来得知哪些地方存放有对象的引用,在OopMap的协助下,HotSpot能...

2019-05-12 16:14:53 150

原创 五:对象的内存布局是什么样的?

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)注:下面的都是在HotSpot中的实现对象头包括两部分信息,Mark Word和类型指针对象头的结构:Mark Word第一部分用于存储Mark Word,即对象自身的运行时数据。它的长度在32位和64位的...

2019-05-12 16:13:58 295

原创 四:虚拟机是如何为对象分配内存空间的?

“指针碰撞”(Bump the Pointer) && “空闲列表”(Free List)假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)。如果Java堆中...

2019-05-12 16:13:27 674

原创 三:虚拟机是如何定位到需要访问的对象的?

一、使用句柄访问使用句柄访问的话,那么Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息二、使用直接指针进行访问使用直接指针访问,那么Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址使用句柄来访问的最大好处就是refere...

2019-05-12 16:13:04 687

原创 二:关于直接内存的溢出问题

DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java 堆最大值(-Xmx指定)一样由DirectMemory导致的内存溢出,一个明显的特征是在Heap Dump文件中不会看见明显的异常,如果读者发现OOM之后Dump文件很小,而程序中又直接或间接使用了NIO,那就可以考虑检查一下是不是这方面的原因。...

2019-05-12 16:12:14 204

原创 一:说说对象创建过程?

一、虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过(如果没有,那必须先执行相应的类加载过程)二、类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。附: 虚拟机是如何为对象...

2019-05-12 16:11:48 263

原创 问二十二:说说CAS是什么(原理)?

关于概念:CAS的概念及注意事项拿AtomicInteger的incrementAndGet()来举例:先是一些字段:附:自己要拿Unsafe实例需要通过反射获取

2019-05-05 10:54:57 300

转载 问二十八:说说双端队列(Deque )与工作密取(Work Stealing)?

Java6增加了两种容器类型,Deque(发音为“deck”)和BlockingDeque,它们分别对 Queue和BlockingQueue进行了扩展。Deque是一个双端队列,实现了在队列头和队列尾的髙. 效插入和移除。具体实现包括ArrayDeque和LinkedBlockingDeque。正如阻塞队列适用于生产者-消费者模式,双端队列同样适用于另一种相关模式,即工作 密取(Work...

2019-05-03 08:36:36 474

原创 问二十七:ThreadLocal源码解析

ThreadLocal概述:ThreadLocal是一个本地线程副本变量工具类,运用到了线程封闭技术。用来维护线程中的变量不被其他线程干扰而出现的一个结构,内部包含一个ThreadLocalMap类(该类由一个继承自虚引用的Entry来存具体的值,需要留意还有一个用来存Entry的table数组),该类为Thread类的一个实例属性(非static的成员变量),该Entry存储的key为T...

2019-05-03 08:35:59 185

原创 问二十六:各种变量在多线程中的共享状态?

静态方法:属于类本身的一部分,在类装载的时候被加载到内存,不会进行销毁,会一直存在内存中,知道JVM关闭非静态方法:即实例方法,属于实例对象的一部分,实例化后才会分配内存,必须通过类的实例来引用,不会常驻内存,当实例对象被JVM回收后跟着消失静态变量:非线程安全。静态变量即类变量,位于方法区,被与该类有关的所有对象所共享,共享一份内存实例变量:部分单例模式(不做特殊处理)非线程安全,非...

2019-05-03 08:35:18 271

原创 问二十五:long、double是原子操作吗?

当线程在没有固步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值。这种安全性保证也被称为最低安全性( out-of-thin-air safety)最低安全性适用于绝太多数变量,但是存在一个例外:非volatile类型的64位数值变量。Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非volatile类型的long和doub...

2019-05-03 08:35:01 1021 1

原创 问二十四:分类说明JUC包常用类有哪些?

JUC中常用类汇总JUC的atomic包下运用了CAS的AtomicBoolean、AtomicInteger、AtomicReference等原子变量类JUC的locks包下的AbstractQueuedSynchronizer(AQS)以及使用AQS的ReentantLock(显式锁)、ReentrantReadWriteLock附:运用了AQS的类还有:Semaphore、Co...

2019-05-03 08:34:11 2524

原创 问二十三:说说闭锁、栅栏、信号量是什么?

CountDownLatch的作用与使用场景:作用:允许一个或多个线程等待,直到其他线程的一组事件完成(是一次性对象,一旦进入终止状态就不能被重置)原理:CountDownLatch是一种闭锁的实现,它可以使一个或多个线程等待一组事件发生闭锁状态包括一个计数器,初始化为一个正数,用来表示需要等待的事件数量countDown()递减计数器,表示有一个事件巳经发生await...

2019-05-03 08:33:35 378

原创 问二十一:说说CAS是什么(概念)?

如果要深入了解Java中的具体实现:CAS原理(以AtomicInteger为例)导入synchronized这样的锁是悲观锁,始终假定会发生并发冲突,会屏蔽一切可能违反数据完整性的约束乐观锁假设不会发生并发冲突,所以它只会在提交时检查是否保证数据完整性,如果提交失败则会进行重试,而最常见的就是CAS(Compare and Swap)了CAS一种高效实现线程安全性的方法...

2019-05-03 08:31:14 1371

原创 问二十:说说notify和notifyAll的区别?

synchronized的底层实现monitor它有两个字段:EntryList和WaitSet锁池(EntryList)如果线程A拥有了某个对象的锁的话,其他线程B、C想调用这个对象的synchronized方法(或者进入方法块)的话,就必须获得该对象锁的拥有权。而这时该对象的锁被线程A锁占用,因此B、C线程就会被阻塞,进入到一个地方等待锁的释放,这个地方就是锁池。等待池(...

2019-05-02 16:36:15 286

空空如也

空空如也

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

TA关注的人

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