- 博客(168)
- 收藏
- 关注
原创 svn和git
一、svn和git的区别Subversion属于集中式的版本控制系统,Git属于分布式的版本控制系统。Subversion的工作区和版本库是截然分开的,而Git的工作区和版本库是如影随形的。二、如何规划版本号和分支规划版本号:对原版本进行小功能添加、优化或者修复bug,进行小版本的升级。当有重大模块添加时,进行一个较大版本的升级。三、jenkins和git的关系git 是一个代码仓库。Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工...
2021-12-11 17:11:06 441
原创 GC Roots
在Java语言中,GC Roots包括以几类元素:虚拟机栈中引用的对象I➢比如:各个线程被调用的方法中使用到的参数、局部变量等。本地方法栈内JNI (通常说的本地方法)引用的对象方法区中类静态属性引用的对象➢比如: Java类的引用类型静态变量方法区中常量引用的对象➢比如:字符串常量池(String Table)里的引用所有被同步锁synchroni zed持有的对象Java虚拟机内部的引用。➢基本数据类型对应的Class对象,一些常驻的异常对象(如:Nul1Poin
2021-06-20 19:39:35 1445 1
原创 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
题目:栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), pus
2021-05-22 17:06:25 1159
原创 JVM第十一章_直接内存
直接内存概述直接内存不是虚拟机运行时数据区的一 部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 直接内存来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 ➢因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 ➢Java的NIO库允许Java程序使用直接内存,用于数据缓冲区下面举个例子:/**...
2021-05-21 17:34:44 258 1
原创 JVM第十章_对象的实例化内存布局与访问定位
大厂面试题美团:对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:二面:java对象头里有什么1、对象的实例化创建对象的步骤解释:1、判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以Clas...
2021-05-20 23:46:44 150
原创 JVM第九章_方法区
1、栈、堆、方法区的交互关系方法区也是除堆空间之外非常重要的结构从内存结构上来讲,这就是一个运行时数据区中的完整结构我们要了解平常这些反复是怎么分配到栈、堆、方法区的,他们三者是如何配合的从线程共享与否的角度来看由于堆和元空间是线程共享的,他们通信更方便,但是要考虑到线程安全的问题,尤其是在这个堆空间。元空间除了你动态加载的这个时候,一般情况下是比较稳定的,所以它的gc不会像堆空间那样频繁。至于右边他们要报错就是StackOverFlow,因为他们都是这个栈的结构。程序计数器它不会爆异常,也不
2021-05-20 07:12:22 318
原创 JVM监控及诊断工具-GUI篇-Jvisual Vm
基本概述Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个JDK命令行工具,使用 Visual VM 可用于显示虚拟机进程及进程的配置和环境信息( jps , jinfo ) , 监视应用程序的CPU、GC、堆、方法区及线程的信息( jstat 、 jstack )等,甚至代替JConsole。在JDK 6 Update 7以后,Visual VM便作为JDK的一部分发布(VisualVM在JDK/bin目录下), 即:它完全免费。此外,Visual VM也
2021-05-05 23:01:19 330
原创 JVM监控及诊断工具-GUI篇-jconsole
概述使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:1. 无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。2. 要求用户登录到目标Java应用所在的宿主机上,使用起来不是很方便。3. 分析数据通过终端输出,结果展示不够直观。为此,JDK提供了一些内存泄漏的分析工具,如 jconsole , jvisualvm 等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的...
2021-05-05 15:34:51 237
原创 JVM性能监控与调优(二)诊断工具-命令行 jps jstat jinfo jmap jhat jstack
目录概述命令行工具javac,javajps:查看正在运行的 Java 进程基本用法options 参数-q:仅仅显示本地虚拟机唯一 id。不显示名称。-l:输入应用程序主类的全类名或如果执行的是 jar 包,则输出 jar 完整路径。-m:输出虚拟机进程启动时传递给主类 main()的参数-v:列出虚拟机进程启动时的 JVM 参数。比如:-Xms20m -Xmx50mhostid 参数jstat:查看 JVM 统计信息基本语法option:...
2021-05-05 13:56:01 547
原创 JVM性能监控与调优(一)JVM调优概述
目录1. 大厂面试题2. 背景说明1. 生产环境中的问题2. 为什么要调优?3. 不同阶段的考虑3. 调优概述1-监控的依据2-调优的大方向4. 性能优化的步骤1. 性能监控 (发现问题)2. 性能分析(排查问题)3. 性能调优(解决问题)5. 性能评价/测试指标1. 停顿时间(或响应时间)2、吞吐量3、并发数4、内存占用5、相互间的关系1. 大厂面试题如何进行JVM调优?有哪些方法?如何理解内存泄漏问题?有哪些情况会导.
2021-05-04 16:37:16 219
原创 ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor实现了按时间调度来执行任务:1. 延迟执行任务2. 周期执行任务区别如下:scheduleAtFixedRatescheduleAtFixedRate:按固定频率执行,与任务本身执行时间无关。但有个前提条件,任务执行时间必须小于间隔时间,例如间隔时间是5s,每5s执行一次任务,任务的执行时间必须小于5s。scheduleWithFixedDelay:按固定间隔执行,与任务本身执行时间有关。例如,任务本身执行时间是10s,间.
2021-05-03 21:13:30 223
原创 Executors工具类
concurrent包提供了Executors工具类,利用它可以创建各种不同类型的线程池。单线程的线程池:固定数目线程的线程池:每接收一个请求,就创建一个线程来执行:单线程具有周期调度功能的线程池:多线程,有调度功能的线程池:不同类型的线程池,其实都是由前面的几个关键配置参数配置而成的。在《阿里巴巴Java开发手册》中,明确禁止使用Executors创建线程池,并要求开发者直接使用ThreadPoolExector或ScheduledThreadPo..
2021-05-03 20:16:37 196
原创 线程池的4种拒绝策略
RejectedExecutionHandler 是一个接口,定义了四种实现,分别对应四种不同的拒绝策略,默认是AbortPolicy。ThreadPoolExecutor类中默认的实现是:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTim...
2021-05-03 20:02:29 461
原创 线程池2--任务的提交过程分析
任务的提交过程分析threadPoolExecutor.execute(runnable);public void execute(Runnable command) { if (command == null) throw new NullPointerException(); /* * Proceed in 3 steps: * * 1. If fewer than corePo...
2021-05-03 17:16:09 195
原创 线程池1-配置参数 线程池的优雅关闭
目录1ThreadPoolExecutor核心数据结构核心配置参数解释线程池的优雅关闭1.线程池的生命周期2.正确关闭线程池的步骤3.shutdown()与shutdownNow()的区别shutdown()shutdownNow()1ThreadPoolExecutor核心数据结构public class ThreadPoolExecutor extends AbstractExecutorService { //线程池控制状...
2021-05-02 16:03:59 273
原创 并发编程AQS ReentrantLock
Java的内置锁一直都是备受争议的,在JDK1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣。如何自己来实现一个同步自旋实现一个同步volatile int status=0;//标识--.
2021-05-01 22:45:47 139
翻译 Java并发之AQS详解
一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲: 概述 框架 源码详解 简单应用 若有不正之处,请谅解和批评指正,不胜感激。 请
2021-05-01 22:24:40 123
原创 同步工具--CyclicBarrier
1. CyclicBarrier 是什么?CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier),它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。白话讲CountDownLatch是减法倒计时,CyclicBarrier是加法,比如人员开会,一共有7个人,只有7个人都到了才能开会。该类用于协调多个线程同步执行
2021-04-30 16:45:28 188 1
原创 并发容器--LinkedBlockingQueue
1、LinkedBlockingQueue数据结构LinkedBlockingQueue是一种基于单向链表的阻塞队列。其数据结构如下,包含了头结点和尾节点。2、LinkedBlockingQueue源码分析类的继承关系public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializ...
2021-04-30 11:47:43 716
原创 同步工具类 Semaphore
1、SemaphoreSemaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。方法Semaphore的主要方法摘要: Semaphore myResources = new Semaphore(5, true); // 一开始有5份共享资源。第二个参数表示是否是公平 void acquire():从此信号量获取一个许可,在提...
2021-04-30 00:55:10 171
原创 CopyOnWrite、CopyOnWriteArrayList
CopyOnWrite指在“写”的时候,不是直接“写”源数据,而是把数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回。那为什么不直接修改,而是要拷贝一份修改呢?答:这是为了在“读”的时候不加锁。CopyOnWriteArrayList和ArrayList一样,CopyOnWriteArrayList的核心数据结构也是一个数组,代码如下:public class CopyOnWriteArrayList<E> implements List<E>, Rand
2021-04-29 23:53:26 217
原创 并发容器 ArrayBlockingQueue
目录BlockingQueueArrayBlockingQueueBlockingQueue在所有的并发容器中,BlockingQueue是最常见的一种。BlockingQueue是一个带阻塞功能的队列,当入队列时,若队列已满,则阻塞调用者;当出队列时,若队列为空,则阻塞调用者。在Concurrent包中,BlockingQueue是一个接口,有许多个不同的实现类,如图所示。该接口的定义如下:public interface BlockingQueue<...
2021-04-29 23:31:24 189
原创 daemon线程和非daemon线程的对比:
当在一个JVM进程里面开多个线程时,这些线程被分成两类:守护线程和非守护线程。默认都是非守护线程。在Java中有一个规定:当所有的非守护线程退出后,整个JVM进程就会退出。意思就是守护线程“不算作数”,守护线程不影响整个 JVM 进程的退出。例如,垃圾回收线程就是守护线程,它们在后台默默工作,当开发者的所有前台线程(非守护线程)都退出之后,整个JVM进程就退出了。对于下面的程序,在thread.start()前面加一行代码thread.setDaemon(true)。当main(...)..
2021-04-29 21:09:37 645
原创 线程中断 interrupt
Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己。每个线程都有一个boolean的中断状态(这个状态不在Thread的属性上),interrupt方法仅仅只是将该状态置为true。比如对正常运行的线程调用interrupt()并不能终止他,只是改变了interrupt标示符。interrupt() 它基于「一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。」思想,是一个比较温柔的...
2021-04-29 21:07:24 2580 1
原创 为什么wait,notify和notifyAll要与synchronized一起使用?为什么要放在Object类里面
目录为什么wait,notify和notifyAll要与synchronized一起使用?wait()和notify()是Object的成员函数,是基础中的基础。为什么Java要把wait()和notify()放在如此基础的类里面,而不是作为像Thread一类的成员函数,或者其他类的成员函数呢?为什么wait,notify和notifyAll要与synchronized一起使用?Object.wait(),Object.notify(),Object.notifyAll()都是Obje.
2021-04-26 14:45:30 278 1
原创 线程-2 Java线程实现的四种方式
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示:1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和Future创建线程4)使用线程池例如用Executor框架下面让我们分别来看看这四种创建线程的方法。1、继承Thread类创建线程Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的s.
2021-04-25 23:05:56 157
原创 线程1-介绍、6种状态
一.线程与进程1.线程与进程程序(program):是为了完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码。(程序是静态的)进程(process):是程序的一次执行过程。正在运行的一个程序,进程作为资源分配的单位,在内存中会为每个进程分配不同的内存区域。进程是动态的,是一个动的过程,有它自身的产生、存在和消亡的过程。线程(thread):进程可以进一步细化为线程,是一个程序内部的一条执行路径。若一个进程同一时间并行执行多个线程,就是支持多线程。2.
2021-04-25 21:57:01 181
原创 synchronized的理解4-对象头
上篇文章开始说了每个java对象都有一个与之相关联的monitor对象,当一个monitor被持有后,对象就处于锁定状态。那他们是怎么相关联的呢,其实 monitor对象(引用)是存在于java对象的对象头 的Mark word中的。还有我们经常说synchronize关键字给对象上锁进行同步,那么怎么才是给对象上锁了呢,其实就是改变Java对象头里的信息,来加不同的锁,从而来表示无锁,偏向锁,轻量锁,重量锁。说对象头之前,先说一下对象的结构:Java对象在JVM内存中分为三块区域:对象头,实例
2021-04-24 22:53:38 927
原创 synchronize的理解3-三种使用方式的反编译
synchronized关键字用来修饰的位置不同,其实现原理也是不同的。锁住的对象也是不同的。在Java中,每个对象都有一个与之相关联的monitor(对象监视器)对象/内在锁,这个对象源码是采用C++实现的,下面来看一下Monitor对象的源码:ObjectMonitor() { _header = NULL; _count = 0; // 锁计数器 _waiters = 0, _recursions = 0; //锁的重入次数
2021-04-22 23:33:05 274
原创 synchronize的理解2-使用方法
Synchronized常用三种使用方式1、修饰普通方法:锁对象即为当前对象2、修饰代码块:锁对象为synchronized紧接着的小括号内的对象3、修饰静态方法:锁对象为当前Class对象1、修饰普通方法public class MyThread extends Thread{ private int count=5; @SneakyThrows @Override public void run() { doSomething()
2021-04-19 22:41:17 266
原创 synchronize的理解1
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。synchrozene是一个关键字。synchrozene用来处理多线程环境下, 线程同步的问题,保证数据的准确性 。...
2021-04-18 21:15:41 333
原创 零拷贝原理
目录1、PageCache2、 cache和buffer的区别3、HeapByteBuffer和DirectByteBuffer4 缓冲IO和直接IO5 内存映射文件(Mmap)6 、直接内存读取并发送文件的过程7 、Mmap读取并发送文件的过程8 、Sendfile零拷贝读取并发送文件的过程零拷贝(zero copy)小结#综述Page cache是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O操作,从而提高性能。此外,还要确保在page cache中的数据
2021-03-26 10:16:31 389
原创 Rocketmq 消息过滤
RocketMQ分布式消息队列的消息过滤方式有别于其它MQ中间件,是在Consumer端订阅消息时再做消息过滤的。RocketMQ这么做是在于其Producer端写入消息和Consumer端订阅消息采用分离存储的机制来实现的,Consumer端订阅消息是需要通过ConsumeQueue这个消息消费的逻辑队列拿到一个索引,然后再从CommitLog里面读取真正的消息实体内容。流程:生产者向broker写入消息,先将消息写入到commitlog文件中,然后异步的创建每一个MessageQueue对应...
2021-03-25 13:54:17 526
原创 rocketmq01
rocketmq01-消息发送生产者向消息队列里写入消息,不同的业务场景需要生产者采用不同的写入策略。比如同步发送、异步发送、Oneway发送、延迟发送、发送事务消息等。 默认使用的是DefaultMQProducer类,发送消息要经过五个步骤:1)设置Producer的GroupName。2)设置InstanceName,当一个Jvm需要启动多个Producer的时候,通过设置不同的InstanceName来区分,不设置的话系统使用默认名称“DEFAULT”。3)设置发送失败重试次数,当网
2021-03-16 20:55:03 184
原创 五分钟搞懂hashCode()和equals()方法的原理
五分钟搞懂hashCode()和equals()方法的原理在Object中的默认的hashCode方法的实现是为不同的对象返回不同的hashcode,因此如果我们不重写hashcode方法,那么没有任何两个对象会是相等的,因为object类中的hashcode实现是为不同的对象返回不同的hashcode。所以重写了hashcode,equals相同,hashcode一定相同...
2020-09-12 09:15:33 194
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人