- 博客(27)
- 资源 (9)
- 收藏
- 关注
原创 JVM的艺术-对象创建与内存分配机制深度剖析
JVM的艺术-对象创建与内存分配机制深度剖析引言本章将介绍jvm的对象创建与内存分配。彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容。对象的创建类加载的过程 固定的类加载执行顺序: 加载 验证 准备 初始化 卸载 的执行顺序是一定的 为什么解析过程没有在这个执行顺序中?(接下来分析) 什么时候触发类加载不一定,但是类的初始化如下四种情况就要求一定初始化。 但是初始化之前 就一定会执行 加载 验证 准备 三个阶段。触发类加载的过程(由初始化过程引起的
2020-12-31 14:46:00
325
原创 JVM的艺术—JAVA内存模型
*喜欢文章,动动手指点个赞 *引言亲爱读者你们好,关于jvm篇章的连载,前面三章讲了类加载器,本篇文章将进入jvm领域的另一个知识点,java内存模型。彻底的了解java内存模型,是有必要的。只要掌握了java的内存模型,内存空间分为哪些区域,才能更好地理解,java是如何创建对象以及如何分配对象的空间。对后续的jvm调优打下坚实的基础。而对于现在的互联网行业来说,高并发,高可用已经必不可少,而学好jvm调优,不仅能在企业工作当中针对高并发场景下的系统进行优化,在日常对系统的错误排查、系统的优化也起
2020-12-17 09:50:46
208
原创 Spring源码分析之AOP从解析到调用
正文:在上一篇,我们对IOC核心部分流程已经分析完毕,相信小伙伴们有所收获,从这一篇开始,我们将会踏上新的旅程,即Spring的另一核心:AOP!首先,为了让大家能更有效的理解AOP,先带大家过一下AOP中的术语:切面(Aspect):指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。在Spring AOP中,切面可以使用在普通类中以@Aspect注解来实现。 连接点(Join point):在Spring AOP中,一个连接点总是代表一个方法的执行
2020-12-14 08:37:44
267
原创 JVM的艺术—类加载器篇(三)
JVM的艺术—类加载器篇(三)引言今天我们继续来深入的剖析类加载器的内容。上篇文章我们讲解了类加载器的双亲委托模型、全盘委托机制、以及类加载器双亲委托模型的优点、缺点等内容,没看过的小伙伴请加关注。在公众号内可以找到,jvm的艺术连载篇。欢迎各位小伙伴儿的持续关注,同时也感谢各位读者一直以来的支持,本人会一直坚持原创、独立创作,给各位读者带来真正的、实用的干货。也会把文章写的通俗易懂,从人的思维、从程序员的思维中,不断的改善写作技巧。争取让每个人都能花最少的学习成本,读懂最好的文章。谢谢。由于被一些私
2020-12-11 15:52:06
262
原创 计算机组成-无锁编程追求极致性能
前言 现代计算机通常由CPU,以及主板、内存、硬盘等主要硬件结构组成,而决定计算机性能的最核心部件是CPU+内存,CPU负责处理程序指令,内存负责存储指令执行结果。在这个工作机制当中CPU的读写效率其实是远远高于内存的,为提升执行效率减少CPU与内存的交互,一般在CPU上设计了缓存结构,常见的为三级缓存结构:L1 Cache,分为数据缓存和指令缓存,逻辑核独占L2 Cache,物理核独占,逻辑核共享L3 Cache,所有物理核共享下图为CPU-Core(TM)I7-10510U型
2020-12-04 16:33:42
225
原创 ScheduledThreadPoolExecutor源码分析-你知道定时线程池是如何实现延迟执行和周期执行的吗?
Java版本:8u261。1 简介ScheduledThreadPoolExecutor即定时线程池,是用来执行延迟任务或周期性任务的。相比于Timer的单线程,定时线程池在遇到任务抛出异常的时候不会关闭整个线程池,更加健壮(需要提一下的是:ScheduledThreadPoolExecutor和ThreadPoolExecutor一样,如果执行任务的过程中抛异常的话,这个任务是会被丢弃的。所以在任务的执行过程中需要对异常做捕获处理,有必要的话需要做补偿措施)。传进来的任务会被包装为Scheduled
2020-12-03 17:35:40
612
原创 ThreadPoolExecutor源码分析-面试问烂了的Java线程池执行流程,如果要问你具体的执行细节,你还会吗?
Java版本:8u261。对于Java中的线程池,面试问的最多的就是线程池中各个参数的含义,又或者是线程池执行的流程,彷佛这已成为了固定的模式与套路。但是假如我是面试官,现在我想问一些更细致的问题,你还能答得上来吗?比如:线程池是如何实现线程复用的?如果一个线程执行任务的时候抛出异常,那么这个任务是否会被丢弃?当前线程池中有十个线程,其中一个线程正在执行任务,那么剩下的九个线程正在处于一种什么状态呢?相信如果没有看过线程池的相关源码实现,这些问题是很难回答得完美的。同时这些问题往深了问还会引出
2020-11-22 12:20:11
264
1
原创 Spring源码分析之循环依赖及解决方案
Spring源码分析之循环依赖及解决方案往期文章:Spring源码分析之预启动流程Spring源码分析之BeanFactory体系结构Spring源码分析之BeanFactoryPostProcessor调用过程详解Spring源码分析之Bean的创建过程详解正文:首先,我们需要明白什么是循环依赖?简单来说就是A对象创建过程中需要依赖B对象,而B对象创建过程中同样也需要A对象,所以A创建时需要先去把B创建出来,但B创建时又要先把A创建出来...死循环有木有...那么在Spring中,有
2020-11-16 11:29:38
257
原创 AQS源码深入分析之条件队列-你知道Java中的阻塞队列是如何实现的吗?
本文基于JDK-8u261源码分析 1 简介因为CLH队列中的线程,什么线程获取到锁,什么线程进入队列排队,什么线程释放锁,这些都是不受我们控制的。所以条件队列的出现为我们提供了主动式地、只有满足指定的条件后才能线程阻塞和唤醒的方式。对于条件队列首先需要说明一些概念:条件队列是AQS中除了CLH队列之外的另一种队列,每创建一个Condition实际上就是创建了一个条件队列,而每调用一次await方法实际上就是往条件队列中入队,每调用一次signal方法实际上就是往条件队列中出队。不像CLH队列上节点
2020-11-09 17:05:09
144
原创 AQS源码深入分析之共享模式-你知道为什么AQS中要有PROPAGATE这个状态吗?
本文基于JDK-8u261源码分析本篇文章为AQS系列文的第二篇,前文请看:[传送门] 第一篇:AQS源码深入分析之独占模式-ReentrantLock锁特性详解1 Semaphore概览共享模式就是有多个线程可以同时拿到锁资源,共享模式用Semaphore来举例,其与ReentrantLock的结构类似,也有公平和非公平两种模式: 1 public class Semaphore implements Serializable { 2 //... 3 4 private
2020-11-04 21:04:38
1595
原创 AQS源码深入分析之独占模式-ReentrantLock锁特性详解
本文基于JDK-8u261源码分析相信大部分人知道AQS是因为ReentrantLock,ReentrantLock的底层是使用AQS来实现的。还有一部分人知道共享锁(Semaphore/CountDownLatch/CyclicBarrier)也是由AQS来实现的。也就是说AQS中有独占和共享两种模式。但你以为这就是AQS的全部了吗?其实不然。AQS中还有第三种模式:条件队列。像Java中的阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue等)就是由AQS中的条件队
2020-11-02 21:46:24
327
原创 JVM的艺术—类加载器篇(二)
分享是价值的传递,喜欢就点个赞引言今天我们继续来深入的剖析类加载器的内容。上节课我们讲了类加载器的基本内容,没看过的小伙伴请加关注。今天我们继续。什么是定义类加载器和初始化类加载器?定义类加载器:假设我们的某一个类是由ExtClassLoader加载的,那么ExtClassLoader称为该类的定义类加载器初始化加载器:能够返回Class对象引用的都叫做该类的初始类加载器,比如类A是由我们的ExtClassLoader加载,那么ExtClassLoader是该类的定义类加载器,也是该类的初始
2020-10-31 22:08:36
446
原创 Spring源码分析之Bean的创建过程详解
前文传送门:Spring源码分析之预启动流程Spring源码分析之BeanFactory体系结构Spring源码分析之BeanFactoryPostProcessor调用过程详解本文内容:在IOC中,是如何通过beanDefition创建出一个bean的?各BeanPostProcessor在这过程中扮演的角色,调用时机?话不多说,直接正题走起,上图!下面是bean创建过程的大致流程图,本文将以图中顺序进行逐步源码分析,小伙伴亦可与图中流程边对照边品食原矢量图地址:https://
2020-10-29 17:24:57
886
原创 Spring源码分析之`BeanFactoryPostProcessor`调用过程
前文传送门:Spring源码分析之预启动流程Spring源码分析之BeanFactory体系结构本文内容:AbstractApplicationContext#refresh前部分的一点小内容BeanFactoryPostProcessor调用过程详解mybatis是如何使用本节知识整合spring的?正文:在Spring中,一共分为BeanFactoryPostProcessor和BeanPostProcessor两类后置处理器,他们主要的职责如下:BeanFactoryPos
2020-10-27 11:44:11
1117
原创 从零造就JVM大牛(一)
引言从事java的小伙伴大家好,如果你是一名从事java行业的程序员,无论你是小白还是工作多年的老司机,我相信这篇文章一定会给你带来不同程度的收货不敢说你看完我的文章从此精通jvm打遍天下无对手,但我能保证的是看完我的文章并且实践操作加以理解,至少在jvm的这个领域碾压百分之80以上的程序员。废话不多说我们进入正题。(此文连载,请持续关注!!!)一:类加载我相信很多从事java的小伙伴儿在网上或者视频上也看了很多关于jvm的文章和讲解,但总觉得缺少点儿什么,那么今天我来告诉你为什么会有这种感觉,
2020-10-26 20:26:11
199
原创 10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践
前言对于项目版本管理,你是否存在这样的痛点:项目分支多而杂不好管理,git log界面commit信息错乱复杂无规范,版本回退不知道选择什么版本合适……。项目版本管理的最佳实践系列,笔者将以两篇文章的形式展开介绍(即基础篇与进阶篇)。本文为gitflow版本管理的最佳实践-基础篇。基础篇主要介绍git应用于生产的基本流程与怎么使用gitflow管理你的项目版本线(适用于敏捷迭代的项目管理场景下)。进阶篇 将着重介绍gitflow+jenkins+docker+DevOps+敏捷Scrum 完成项目持续
2020-10-19 21:02:08
247
原创 1T数据快速排序!十种经典排序算法总结
1 冒泡排序每次循环都比较前后两个元素的大小,如果前者大于后者,则将两者进行交换。这样做会将每次循环中最大的元素替换到末尾,逐渐形成有序集合。将每次循环中的最大元素逐渐由队首转移到队尾的过程形似“冒泡”过程,故因此得名。一个优化冒泡排序的方法就是如果在一次循环的过程中没有发生交换,则可以立即退出当前循环,因为此时已经排好序了(也就是时间复杂度最好情况下是的由来)。public int[] bubbleSort(int[] array) { if (array == null || array.
2020-10-15 13:51:53
1006
1
原创 BeanFactory体系结构探析
什么是BeanFactory?提到Spring,总是让人第一时间想起IOC容器,而IOC容器的顶层核心接口就是我们的BeanFactory,如果能够理解BeanFactory的体系结构想必能让我们对Spring整体脉络有更加清晰的认知,所以,本文的探究方向主要为以下几点:BeanFactory的体系结构是怎样的?Bean的元信息从何而来?BeanFactory生产Bean的过程是怎样的?BeanFactory的体系结构我们先来看看有哪些子类实现了它吧其中ApplicationContex
2020-09-29 23:00:47
519
原创 聊聊经典数据结构HashMap,逐行分析每一个关键点
#本文基于JDK-8u261源码分析1 简介HashMap是一个使用非常频繁的键值对形式的工具类,其使用起来十分方便。但是需要注意的是,HashMap不是线程安全的,线程安全的是ConcurrentHashMap(Hashtable这种过时的工具类就不要再提了),在Spring框架中也会用到HashMap和ConcurrentHashMap来做各种缓存。从Java 8开始,HashMap的源码做了一定的修改,以此来提升其性能。首先来看一下HashMap的数据结构:整体上可以看作是数组+链表的形式。数
2020-09-29 22:32:58
426
原创 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼
本文基于JDK-8u261源码分析1 简介 ArrayList作为最基础的集合类,其底层是使用一个动态数组来实现的,这里“动态”的意思是可以动态扩容(虽然ArrayList可以动态扩容,但却不会动态缩容)。但是与HashMap不同的是,ArrayList使用的是1.5的扩容策略,而HashMap使用的是2的方式。还有一点与HashMap不同:ArrayList的默认初始容量为10,而HashMap为16。有意思的一点是:在Java 7之前的版本中,ArrayList的无参构造器是在构造器阶段完
2020-09-27 20:31:53
162
原创 MySQL-常用命令
MySQL常用命令mysql>mysql -h host(数据库地址) -u root -p -P 3306mysql> update user set password=password(”xueok654123″) where user=’root’;(设置用户名密码)mysql> show processlist; // 查看所有的客户端连接信息...
2019-04-27 13:39:20
166
转载 VirtualBox--CentOS6.4设置网络连接与文件夹共享
准备工作yum update把系统的所有软件升级到最新版本。yum install gcc安装编译系统yum install kernel-devel安装外置核心模块。reboot重启以使所有的升级或安装生效。配置共享文件夹在virtualbox虚拟机窗口的菜单条下选择 "Device(设备)"--“Share Folder(共享文件夹)” ,先选择共享文件夹,然后点击右上方的添加按钮,其中根据需...
2018-07-05 22:46:21
306
转载 MySQL数据库update更新子查询
比如:1234UPDATE test.tb_vobile aset a.name = '111 'WHEREa.id = (select max(id) id from test.tb_vobile)报错:12
2017-07-02 16:51:24
6078
原创 使用Lock与ReentrantLock模拟消息队列阻塞,生产与消费问题模拟
//测试结果package com.cn.test.queue;public class EggTest { /** * @param args */ public static void main(String[] args) { //创建一个鸡蛋篮子,实现阻塞队列 EggBlockingQueue eggs=new EggBlockingQueue(); in
2017-06-12 20:47:05
491
原创 java按指定的字节Byte的起始位置截取长度截取字符串
java按指定的字节Byte的起始位置截取长度截取字符串,自动舍弃超出字节长度的汉字package com.cn.util;import java.io.UnsupportedEncodingException;/** * @author Administrator * */public class StringUtil { /** * 判断是否是一个
2017-06-11 16:16:56
14757
原创 java性能优化
一、避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。 例子: import java.util.vector;class cel { void method (vector vector) { for (int i = 0; i < vector...
2014-02-26 17:50:00
135
Jboss+EJB+Oracle10g部署配置
1:安装好jboss-4.2.3.GA(已经集成了EJB3)2:配置环境变量(如果与myeclipse搭配使用则不配置也可)JBoss_HOME=C:\jboss4GA;path: 增加: C:\jboss4GA\bin;3:拷贝数据库驱动包我这里是ojdbc14.jar到指定目录:jboss4GA\server\default\lib下4:将开发需要引用到的包copy到jbos...
2012-07-03 11:15:03
197
基于SSM+ADMINTE后台+boostrap前端个人博客系统
2018-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人