自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

刘正阳的专栏

励志成为顶尖人才

  • 博客(96)
  • 资源 (1)
  • 收藏
  • 关注

原创 G1 GC核心原理、执行流程

今天让我们从0开始了解G1 GC。在开始之前,我们先探讨下为什么我们学习G1 GC。 要学习一些新知识,每个人可能都有不同的目的目标。 我认为学习G1GC对于Java工程师有如下收益。成为更好的Java开发工程师,在遇到服务性能问题、GC问题时,能够通过了解到的G1知识快速定位、解决相关问题在面试时GC问题也是常问的知识点,G1GC作为大多数工程师了解不是很多的知识领域,如果稍微深入理解,就能形成更大的领先优势,无论是被面试还是面试别人学习G1中的优化技巧、原理,有机会能够举一反三应用到平时

2022-11-21 12:31:30 792 1

原创 JVM字符串去重-内存优化利器

string deduplication即字符串去重是JDK在1.8提供的功能,目的是减少相同内容字符串的内存占用,相同内容是指equals为true的两个字符串。目前只有在使用G1收集器的情况下才能开启,默认不开启,开启方法为增加 启动参数。java.lang.String字符串对象的数据保存在内部的byte[] value即一个名为value的byte数组中在一次gc之后,回收的heap区域中的活对象(live objects)都会被访问一遍,对于每个string对象,我们都会查看是否能够进行de

2022-07-23 15:59:45 585

原创 在2022年使用Clion编译、debug、开发Java虚拟机(Mac版本)

前两年我分享过jdk的编译debug方法,不过之前的方法不是很好用,比如有很多方法字段定义无法跳转,今天我们来学习 一下最新的jdk构建debug开发方法,完美而且优雅。

2022-07-10 23:09:14 923

原创 像准备比赛一样准备晋升答辩 - 互联网公司答辩晋升经验分享

同学你好,我是bytejava刘老师,今天分享一些关于晋升答辩的心得经验,包含了针对晋升答辩的分析、答辩如何准备、ppt注意事项等,希望能给有需要的同学一些帮助。我在多家大型互联网公司参加过多次晋升,次数和成功率应该都是比较高的,在我看来,晋升答辩是一项比赛,就像编程比赛、跑步比赛、赛车比赛、游戏比赛一样,准备比赛要讲究知识技巧(按照互联网的黑话说是「打法」「方法论」),这样经过科学的努力准备、训练之后,相信你也能比别人具备更大优势取得更好的成绩。......

2022-07-03 12:55:52 1703

原创 kafka replication, high watermark

kafka replication复制(replication)是分布式系统中常用的保证数据可靠性服务可靠性的方案,一般数据会写入到 leader节点,leader将数据按顺序复制给follower,如果leader故障,则follower会重新选举出新的leader, 新的leader因为有复制的数据,可以对外继续提供服务。例如raft、zookeper、mysql、redis等都使用了复制。kafka,同样也使用复制保证数据可靠性,在创建topic时可以指定topic的replica

2022-05-23 08:14:34 206

原创 kafka partitioner和消息有序性

通过本篇文章,我们能了解kafka默认的Partitioner如何决定消息的partition,以及如何保证消息的有序性。一个消息要发送到哪个partition是由producer决定的。指定partition的需求大部分来自于消息有序性的保证。 例如一个关注系统会在用户关注、取关行为后发出关注、取关的消息,另一个系统消费这个消息, 比如用来更新缓存,关注加缓存、取关删除缓存。如果顺序出现错误比如先收到了取关消息后收到关注消息,则可能导致关注的缓存状态不对。 再例如一个订单系统

2022-05-12 22:49:27 705

原创 kafka rebalance机制详解

首先我们回忆一下kafka的基本的架构,kafka分为producer、broker和consumer。 为了能够横向扩展提升消息发送消费性能, 通过增加partition的方式,让消息能够保存到多个broker上。 为了提升消费性能,增加了consumer group的概念,一个topic下同一个consumer group中的不同consumer实例可以共同消费提升消费能力多个consumer消费同一个topic上的不同partition,就需要对consumer进行协调,

2022-05-08 15:19:42 2244

原创 ReentrantReadWriteLock读写锁源码分析

ReentrantReadWriteLock是jdk提供的读写锁,读写锁类似mysql中的读写锁概念,读锁与读锁之间可以共存,但是写锁和读锁写锁之间都不能同时加锁。读写锁适用于在一些读多写少的场景下代替ReentrantLock,让读与读之间可以并发,比如现在有一个线程不安全的数据结构,读多写少,我们可以使用ReentrantReadWriteLock,在读取时加读锁,修改数据时加写锁。使用方式ReentrantReadWriteLock的使用方式为,首先创建一个共享的ReentrantReadW.

2022-05-06 10:37:36 193

原创 ConcurrentHashMap源码分析

为什么需要ConcurrentHashMap,HashMap为什么有线程安全问题在前面的HashMap源码分析文章中我们提到在多个线程访问同一个HashMap对象时要注意线程安全问题,那么HashMap究竟有什么样的线程安全问题呢?线程安全问题源于多个线程对共享可变变量进行并发修改读取且缺少必要的同步操作,可能导致原子性、可见性、重排序等问题。下面介绍几种可能出现的线程安全问题线程安全问题举例1: 数据丢失问题在HashMap源码分析文章中我们了解到在put方法写入key value数据时,如果没

2022-05-04 10:59:53 154

原创 ReentrantLock源码分析

ReentrantLock介绍ReentrantLock是java util concurrent包中提供的一个锁实现,相对于synchronized关键字锁,ReentrantLock提供了具备超时时间的tryLock、可中断的lockInterruptibly,并且能够通过newCondition创建多个等待条件。ReentrantLock能够保证和synchronized一致的内存模型规则(happen before)。ReentrantLock中的Reentrant的意思是可重入,也就是一个

2022-05-04 09:48:10 178

原创 AQS AbstractQueuedSynchronizer源码分析

在解决并发问题时,开发者需要各种同步功能进行线程间的通信、协调、控制,比如信号量、锁、条件等待通知等等。JDK提供了AQS作为实现这些同步器(synchronizer)的基础,jdk中的并发工具类比如ReentrantLock, Semaphore, CountDownLatch等都是使用AQS来实现各自的线程同步能力的。AQS因为方法命名比较抽象,导致很多朋友开始难以理解各个方法的作用、原理,不用担心,通过学习本文今天我们彻底掌握AQS。AQS使用AQS整体实现设计AQS把同步器的操作分成两个操

2022-05-03 09:56:01 199

原创 ThreadPoolExecutor线程池源码图文精讲

ThreadPoolExecutor线程池源码图文精讲ThreadPoolExecutor介绍首先我们要思考一下为什么要使用线程池。Java提供了多线程机制让我们能够同时运行多个任务,就像多个任务由多个人同时执行,而不是一个人依次执行这些任务。但是如果我们每次执行任务都创建一个线程,导致的问题有每次创建销毁线程都有一定的开销线程数量不好控制,过多的线程会导致内存占用过多,也可能超过操作系统的限制导致异常因此Java提供了默认的线程池,帮助大家解决这些问题,通过ThreadPoolExecut

2022-04-17 21:28:59 127

原创 HashMap使用技巧、实现原理源码精讲

HashMap是平时开发中非常常用的一个基础类,同时在面试中也会问到大量相关知识点,掌握HashMap是高级Java开发的必要技能之一。

2022-04-17 18:07:48 605

原创 redis本地安装、debug环境搭建

通过断点调试redis代码,能够让我们深入了解redis的内部执行流程。下载redis代码、构建、测试git clone git@github.com:redis/redis.gitcd redismakemake构建好后,就可以启动redis-server并用redis-cli链接调用了。启动redis-server启动redis-cli然后就可以通过命令行调用测试redis。用IDE打开代码、debug调试我们使用Jetbrain...

2022-04-08 22:53:12 799

原创 用注解进行参数校验,spring validation介绍、使用、实现原理分析

spring validation是什么在平时的需求开发中,经常会有参数校验的需求,比如一个接收用户注册请求的接口,要校验用户传入的用户名不能为空、用户名长度不超过20个字符、传入的手机号是合法的手机号格式等等。遇到这种情况很多人会在controller接口中去写一些判断代码。但是如果我们又提供了一个修改用户信息的接口,这个接口也需要对用户的参数进行校验,那么我们的校验代码就会散落在两个地方,和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需要在修改多个地方。...

2022-03-24 17:39:22 7250 1

原创 类型安全的http客户端retrofit介绍、使用、实现原理分析

retrofit介绍retrofit是一个http访问客户端,类似okhttp、apache httpclient,不过retrofit是类型安全的,也就是定义一个强类型的http客户端接口使用,而不是请求url返回一个string的结果,再拿string去解析字段,这样开发时更加安全,能帮助开发者省去请求参数结果转换的繁琐重复工作,它的思想类似Mybatis、spring data等。使用添加maven依赖<dependency> <...

2021-12-20 20:09:56 670

原创 springboot-只能用于web服务开发?不创建web服务也能使用spring bean

spring除了开发web服务外,在其他的需求中也是可以使用的,比如我们只想实现一个简单的爬虫,爬到数据之后写入数据库,我们一定要创建一个web服务来通过接口触发各个方法的调用吗,可能有很多小伙伴使用spring都是在公司的web项目中使用,如果脱离web环境都不会写代码了,今天我们就看一下,使用springboot怎么不启动web服务也能运行spring代码。有了这个功能,我们在开发一些小的需求的时候非常方便,不用再去羡慕python等语言。假设我们现在写好了希望运行的...

2021-12-19 22:36:58 2865

原创 springboot - 搭建spring data jpa简单快速实现数据库读写

访问数据库是代码开发中最常见的任务之一,springboot搭配上spring data项目,在读写数据库的场景上非常简单方便好用,写起读写数据库代码来轻松愉快。本次实现的功能本次我们实现一个非常简单的数据写入、查询的功能。假设我们在开发一个股票交易系统中的一个小模块,这个模块负责上市公司的录入和查询。需要提供的功能是能够写入上市公司名称和对应的代码,能够根据代码查询上市公司的名称。创建数据库、建表如果在本地搭建数据库,可以用docker快速启动一个mysq...

2021-12-19 10:03:00 799

原创 为什么Java的lambda或匿名内部类中用到的外部局部变量需要声明成final或是effectively final的?

相信很多同学在开发过程中都遇到过类似的IDE提示,当我们在lambda表示中或匿名内部类中访问一个局部变量时,这个变量如果在方法内进行了重新赋值,则IDE/编译器会抛出一个Variable used in lambda expression should be final or effectively final这样的异常,那么为什么lambda表达式或匿名内部类中用到的变量需要是final或effectively final的呢?(effective final是指虽然变量...

2021-12-18 16:01:46 512

原创 Random类导致抢红包接口出现严重性能问题

生成随机数是一个常见的功能,例如我们给用户生成随机红包。但是你知道java.util.Random类在高并发的情况下具有性能问题和安全问题吗?我们在高并发常见下应该如何生成随机数呢?要知道为什么java.util.Random类具有性能问题,得深入到其中是实现来探究一下。首先看一下Random类的doc说明 An instance of this class is used to generate a stream of pseudorandom numbers....

2021-12-18 15:57:15 737

原创 ThreadLocal里的巧妙设计、常见面试问题,其他文章里写的一定是对的吗?

ThreadLocalThreadLocal的作用是什么?使用时有哪些注意事项?为什么ThreadLocalMap中的Entry要使用WeakReference?netty中FastThreadLocal又做了什么优化?答案尽在本文中。ThreadLocal介绍用ThreadLocal修饰的变量,一般我们称为线程本地变量。那么一般什么情况下会使用ThreadLocal呢? 解决线程安全问题。线程安全问题一般是多个线程对共享可变变量变量的修改问题,那么如果线...

2021-12-18 15:37:04 437

原创 mybatis spring介绍、使用、实现原理

maven依赖<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version></dependency>使用SqlSessionFactoryBean 可以创建sqlSessionFactory,dataSo...

2021-12-18 15:31:24 474

原创 springboot工程快速搭建使用

springboot能够帮助我们快速创建一个独立的、生产环境可用的基于spring的应用。使用springboot开发非常简单快捷,很多互联网新人获取没有感受到这种强大的进步,就像现在人们对手机支付、手机聊天习以为常一样。在springboot出来之前,大家开发java的web项目,需要大量繁琐的搭建配置工作,例如要先搭建一个servlet容器比如tomcat,然后要按照一定格式创建一个javaee工程,配置web.xml文件、配置spring的各种xml文件,如果要访问...

2021-12-18 15:27:05 330

原创 一文了解springboot+micrometer+prometheus+grafana监控系统

本章我们以springboot+micrometer+prometheus+grafana为例,展示一套springboot监控系统的搭建使用。安装promotheus、prometheus gateway这次实例我使用gateway是因为我的springboot在本地启动、promethus在远程机器,远程机器不方便访问我的电脑ip。下载启动prometheus gatewaywget https://github.com/prometheus/pushgate...

2021-12-15 21:37:03 2482

原创 并发编程基础之-如何用数组实现阻塞队列?

ArrayBlockingQueue顾名思义,是基于数组实现的阻塞队列,阻塞队列可以用于缓冲任务,实现生产者消费者模式,例如线程池中的工作队列。那么怎么才能用数组实现阻塞队列呢?我们先从ArrayBlockingQueue的功能说起 首先它是一个队列,队列需要具备入队、出队的能力 由于是BlockingQueue,需要在队列已满时,对入队的请求进行阻塞,当队列有剩余空间时,释放入队请求;在队列为空时,需要对出队的请求进行阻塞,当队列中有元素时,释放出队请求; 由...

2021-12-15 21:26:29 1030

原创 最强线程池解析,线程池的这些细节你真的会了吗

本文整体整体结构ThreadPoolExecutor介绍首先我们要思考一下为什么要使用线程池。Java提供了多线程机制让我们能够同时运行多个任务,就像多个任务由多个人同时执行,而不是一个人依次执行这些任务。但是如果我们每次执行任务都创建一个线程,导致的问题有每次创建销毁线程都有一定的开销线程数量不好控制,过多的线程会导致内存占用过多,也可能超过操作系统的限制导致异常因此Java提供了默认的线程池,帮助大家解决这些问题,通过ThreadPoolExecutor,我们可以实现多种线程创建回收策略

2021-12-12 13:34:16 610

原创 设计和分析Java动态代理的技术实现

你了解Java中的动态代理的作用是什么吗?动态代理又有哪些实现方式,真正的实现原理是什么呢?掌握本章内容,在面试遇到aop如何实现的问题时,就不会只知道jdk代理接口和cglib集成子类、不知道真正的实现原理了。本文将会讲解动态代理技术能够解决的问题、如何自己设计实现动态代理、以及Java中是如何实现的以及一些开源框架中的典型应用。dynamic proxy是什么,可以用来做什么?通过dynamic proxy动态代理,我们可以在运行为接口创建实现类,或为特定类...

2021-12-12 13:26:08 400

原创 JVM实现原理分析之safepoint

safepoint又称为安全点,它是hotspot等JVM中的一个重要概念。下面我们分部分了解下safepoint是什么、safepoint的作用、safepoint是如何实现的以及作为开发者有哪些需要注意的地方。safepoint是什么JVM的主要任务是执行Java程序,而JVM运行时本身也是一个程序,但是为了执行Java程序JVM还有不少辅助工作,比如进行GC、JIT编译等等。一般会把运行在JVM上的用户Java程序称为mutator。以GC为例,JVM中一般...

2021-12-12 11:30:49 2494

原创 lambda表达式实现原理分析

本文将深入了解lambda表达式的实现原理和这样的实现方案的取舍权衡。Java为什么需要lambda表达式?能够提升代码简洁性、提高代码可读性。例如,在平时的开发过程中,把一个列表转换成另一个列表或map等等这样的转换操作是一种常见需求。 在没有lambda之前通常都是这样实现的。List<Long> idList = Arrays.asList(1L, 2L, 3L);List<Person> personList = new Ar...

2021-12-12 10:33:40 3389 2

原创 kubernetes系列02-本地安装kubernetes、部署springboot服务

本章我们在本地快速搭建一个kubernetes集群并且在上面部署一个springboot服务。kubernetes组件介绍kuberntes组件分为两部分,control plane(控制面)和worker node(工作节点)。control plane从名字可以看出负责控制整个系统。Control plane里面注意包含controller manager,scheduler, api server和etcd。etcd是存放kubernetes数据信息的...

2021-12-11 21:09:44 1173

原创 手把手教你构建、debug、开发Java虚拟机

目的Java虚拟机是Java开发者最常使用的平台,了解其中的运行原理可以帮助我们成为更好的开发者、遇到问题更快解决。对于很多虚拟机知识点,大多数人通常是通过看书或文章来了解相关知识的。这样的缺点是一个知识经过了两次信息理解传递,可能导致信息不准,那么为什么不自己去探究虚拟机的实现原理呢。了解自己常使用的工具的原理,便于更好的使用工具,就像更了解轮胎的赛车手能更好地驾驶汽车、更了解锅和菜刀的厨师可以练出更好的厨艺。而了解虚拟机的最直接的方式就是去构建、debug、开发它!...

2021-12-11 13:16:09 1287

原创 kubernetes系列01-介绍

本章介绍kubernetes是什么,为什么要用它,具备什么价值。kubernetes是容器的编排系统,能够方便地对容器进行管理,包括升级、扩缩容等等,并且还具备健康检查自动治愈等实用功能。可以把kubernetes想象成一套容器管理系统,通过k8s(kubernetes的简称,k和s之间有8个字符)能够方便的分配资源、管理容器。软件发展历史要理解kubernetes出现的原因,就要理解它解决的问题。这些问题要从服务端软件发展的历史说起。微服务兴起最近...

2021-12-11 10:03:05 543

原创 mybatis spring介绍、使用、实现原理

maven依赖<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version></dependency>使用SqlSessionFactoryBean 可以创建sqlSessionFactory,dataSo...

2021-12-11 09:10:00 1559

原创 org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleT

欢迎关注技术公众号更多详细技术类博客请关注我的微信公众号: 一起源码分析更多参考: https://liuzhengyang.github.io/Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPe...

2020-04-19 09:28:06 857

原创 linux的screen命令

Linux中的screen命令,常用于执行一个长时间运行任务,当用户登出后不停止任务,如我们ssh登陆到一台机器,运行一个任务,当我们通过退出ssh时,任务可会跟着停止,如果我们想让它继续执行,一般有两种方式。1. nohup假设任务是一个 runjob的程序1nohup ./runjob &这样程序就会在后台执行,并

2016-10-05 19:48:36 613

原创 JVM漫谈

背景介绍jvm已经是Java开发的必备技能了,jvm相当于Java的操作系统。 JVM,java virtual machine, 即Java虚拟机,是运行java class文件的程序。 Java代码经过Java编译器编译,会编译成class文件,一种平台无关的代码格式,class文件按照jvm规范,包括了java代码运行的数据和代码等内容。jvm加载class文件后,就可以执行java代码了

2016-10-05 15:32:38 443

原创 分析ClassLoader

Java中的ClassLoader先抛出几个问题类初始化 static{} 块会在什么时候执行Class在方法区内的结构不同类加载器加载一个类,类初始化块会被执行几次,不同ClassLoader加载的类存放在哪里,是否指向同一个Class实例类A触发了类B的加载,那么类B的加载器是什么如何实现热部署,即在运行时改变类的行为,或类替换Class.forName(name) 做了什么回答这些问题还是要参考JDK的代码实现,另外还要依靠Java语言规范和Java虚拟机规范本篇文章用类来泛指

2016-09-30 10:11:12 360

原创 面试问题收藏

https://github.com/liuzhengyang/interview面试问题收藏这些是我最近想到的一些问题,比较基础。回答的不一定完全准确,一些自己还不是很明白,需要思考学习。计算机基础方面网络TCP/IP协议是什么TCP/IP是指由TCP、UDP、IP、ICMP等协议组成的协议簇TCP握手过程、关闭和状态变化,对应到程

2016-09-22 15:01:15 640

原创 线上问题排查

需要做好监控和报警,打日志要准确规范。性能类诊断uptimetopvmstat 1iostat 1dstatpidstat 1sar -n DEV 1free -m网络netstat -nltpnetstat -anptnetstat -ntp | grep ‘TIME_WAIT’ | awk ‘{print 5,5, 6}’ | awk -F ‘:’ ‘{print 1,

2016-09-18 13:47:20 691

原创 gobeanstalk

go-beanstalk 是beanstalkd 的GO语言的一个客户端.项目还在开发中,欢迎大家提意见介绍beanstalkd是一个快速的、有各种用途的延迟队列 和定时任务的不同点: 定时任务以一定的周期或者在某个特定的时间运行。beanstalk可以在延迟一段时间执行。 一些使用场景: * 用户下单5分钟后检查用户是否完成了支付 * 一分钟后开始一个新的程序如何使用Mac&Linux安

2016-09-15 12:56:19 810

Java虚拟机规范 JavaSe7

Java虚拟机规范 JavaSe7

2016-04-28

空空如也

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

TA关注的人

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