自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 资源 (1)
  • 收藏
  • 关注

原创 JVM运行时数据区详解(超长)

一、运行时数据区的介绍HotSpot VM的运行时数据区:不用的JVM对内存的划分和管理机制存在部分差异(主要是方法区的有无)。Java虚拟机定义了若干个程序运行期间会使用到的运行时数据区,其中有一些会伴随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是跟线程相对应的,这些与线程对应的数据区的生命周期跟线程一致,随着线程的开始而出生,随着线程的结束而销毁。每个线程拥有独立的虚拟机栈、本地方法栈、程序计数器。多个线程共享堆、方法区(或者说每个进程共有的)。在jdk8后的方法区改名

2020-08-22 14:16:46 693

原创 log4j2(MDC)+Skywalking全局链路日志实现

1.问题目前:当线上出现问题需上kibana上去查询es上收集的log4j2日志。缺陷:在多个服务相互调用下,若出现Error级别日志时,无法快速准确定位到由哪个服务引起,只能根据日志时间模糊去定位。log4j2没有配置传入参数,无法准确的复现错误。改进:优化:引入skywalking的traceId,能够显示出完整的链路调用。收集 请求ip、请求参数、请求路径、返回状态码(属于业务状态码,并不是http状态码,例如Result类中的code),返回数据等信息。定义log规范,在es上

2021-08-20 18:59:36 6502 4

原创 排查线上死循环方案(arthas、动态跟踪技术)

最近在学习dubbo的源码时,发现了javassit技术,接着了解了相关的asm、javaagent等字节码的一些玩法。无意间看到了btrace、arthas。接下来就是对arthas的一些玩法。这边使用arthas去排查由于死循环引起的cpu升高问题。问题:例如在报错的时候打印日志时日志不全或者是没有给出错误状态码,那正常想到的就是改代码加日志重新部署?但如果是线程池的问题或者是一些不易复现,重启会破坏现场。例如以下场景:由HashMap、HashBiMap或者是一些不适当的操作引起的死循环问题

2021-07-23 18:34:22 2307

原创 1711. 大餐计数

package leetcode.editor.cn;//大餐 是指 恰好包含两道不同餐品 的一餐,其美味程度之和等于 2 的幂。 //// 你可以搭配 任意 两道餐品做一顿大餐。 //// 给你一个整数数组 deliciousness ,其中 deliciousness[i] 是第 i 道餐品的美味程度,返回你可以用数组中的餐品做出的不同 大//餐 的数量。结果需要对 109 + 7 取余。 //// 注意,只要餐品下标不同,就可以认为是不同的餐品,即便它们的美味程度相同。 ////

2021-07-07 22:12:24 166

原创 CountDownLatch源码解析(唤醒细节)

CountDownLatch源码JDK1.8 api文档对CountDownLatch的说明如下:允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier 。A CountDownLa

2021-05-21 18:16:10 388 1

原创 ReentrantLock源码分析(AQS)

1.结构ReentrantLock类内定义了抽象类Sync,以及实现抽象类的NonfairSync和FairSync,重写了lock和tryAcquire(非公平锁直接去调用了抽象类实现的)方法。Sync这边我们可以看到Sync是基于AbstractQueuedSynchronizer实现的。abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialV

2021-04-27 02:39:19 285 1

原创 ConcurrentHashMap扩容源码详细分析

private final void transfer(Node<K,V>[] tab, Node<K,V>[] nextTab) { int n = tab.length, stride; //获取步长 就是每个线程需要处理的桶数量 if ((stride = (NCPU > 1) ? (n >>> 3) / NCPU : n) < MIN_TRANSFER_STRIDE) stride = MIN_TRANSF

2021-04-23 15:55:54 176

原创 整理下最近面试遇到的题目

基础你能讲讲多态的好处ArrayList跟LinkedList的区别 (从物理内存 扩容机制 LinkedList查询的小优化)深度优先跟广度优先用到的集合(栈,队列)动态规划最重要的是什么(状态转移方程,然后问了个跳台阶的案例写出动态转移方程)HashMap跟HashTable和ConcurrentHashMap的区别 (从应用场景到源码)你用过线程嘛 线程的创建方式(继承Thread、实现Runnable、Callable、通过线程池)Runnable跟Callable的区别(后者提供线

2021-04-09 10:18:27 122

原创 美团笔试(小美的优雅字符串)

/** * 时间限制: 3000MS * 内存限制: 1048576KB * 题目描述: * 一天,小美在写英语作业时,发现了一个十分优美的字符串:这个字符串没有任何两个字符相同。于是,小美随手写下了一个字符串,她想知道这个字符串的的所有子序列,有多少个是优美的。由于答案可能会很大,输出对20210101取模后的结果。 * <p> * 一个字符串的子序列定义为:原字符串删除0个或多个字符后剩下的字符保持原有顺序拼接组成的字符串为原串的子序列。如:ab是acba的子序列,但bc则不是。

2021-04-04 13:18:21 2909 1

原创 Spring IOC源码解析

getBean()ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:spring.xml");User user = (User) ac.getBean("user");ApplicationContext是接口,实现的方法是AbstractApplicationContext的getBean()@Overridepublic Object getBean(String name) throws Bean

2021-03-31 00:38:42 99

原创 openfeign调用超时feign.RetryableException: Read timed out executing POST http://xxxx

遇到报错信息如下o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.RetryableException: Read timed out executing POST http://xxx

2021-01-10 20:51:32 1751 1

原创 IDEA报错:Process ‘command ‘./Java/jdk1.8.0_131/bin/java.exe‘‘ finished with non-zero exit value 1 解决!

IDEA的下gradle项目运行test下的main()方法报错:Exception in thread “main” java.lang.NoClassDefFoundError: com/xxxx/xxxx/xxxx/xxxxat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763)at java.security.SecureClas

2020-10-22 11:15:36 35004 16

原创 遇到的问题(实习)

问题描述:在开完蓝票进行退款后系统应自动回收蓝票并开冲红发票退款的流程:加载子订单信息子订单进行验证与冻结判断冻结结果,如果结果失败的话拒绝批量退款申请并取消冻结,如果成功进行下一步审核批退款(由管理员手动操作同意或者拒绝),如果拒绝则取消冻结,如果同意则进入下一步进行回收资源,如果回收失败则重试,如果回收成功更新回收状态判断批量退款模式,如果是线上支付,需由管理员手动操作是否允许退款(如果是则退款后进入下一步,否则直接进行下一步),如果是线下支付,确认线下批量退款后结束判断批审核结果,如

2020-10-16 15:44:06 944

原创 导出Excel的案例(POI)

一、介绍什么是POI?Apache POI是基于Office Open XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)处理各种文件格式的开源项目。 简而言之,您可以使用Java读写MS Excel文件,可以使用Java读写MS Word和MS PowerPoint文件。二、Maven依赖<dependency> <groupId>org.apache.poi</groupId> <artifactId>

2020-09-23 11:25:14 245

原创 更换头像的小案例(fastDFS)

1.介绍环境:SpringBoot+Dubbo+Zookeeper图片服务器:fastDFS数据库:Mysql2.环境搭建需在linux上搭建Tomcat(为了访问zookeeper)、zookeeper、dubbo、fastDFS。tomcat下载:https://tomcat.apache.org/JDK下载:https://www.oracle.com/technetwork/java/javase/archive-139210.htmlzookeeper下载:https://mirr

2020-08-23 17:04:25 562

原创 用synchronized或ReentrantLock实现的消费者与生产者

以如下场景为案例:假设某公司有一个仓库,该仓库只能容下3件货物。该公司有4名员工,分别为2名进货员(生产者)与2名销售员(消费者)。每名进货员每次只能进一件货物,每名销售员每次只能卖出一件货物。以synchronized实现:public class SynTest { public static void main(String[] args) { Clerk clerk = new Clerk(); new Thread(() -> {

2020-08-22 15:51:58 328

原创 JVM中的GC算法(详细)与垃圾收集器

一、介绍什么是垃圾?垃圾是指运行在程序中没有任何指针指向的对象。为什么要进行垃圾回收?如果不及时对内存的垃圾进行清理,那么这些垃圾所占用的内存会一直保存到应用程序结束,被保留的空间就无法被其他对象所使用,同时也增加了内存溢出的概率。什么是自动内存管理?自动内存管理是:无需开发人员手动参数内存的分配以及回收,降低内存泄漏和内存溢出的风险,让程序员更专注于业务开发。垃圾收集器位于JVM模型的哪里,它作用于哪?垃圾收集器在执行引擎中。垃圾收集器可以对年轻代、老年代甚至是全堆

2020-08-22 14:35:09 416

原创 Java中String的特性(JDK1.6、1.7、1.8中的常量池,拼接,intern方法等)

一、String的基本特性String类声明是final的,不可以被继承。String实现了Serializable接口(序列号接口),Comparable接口(比较接口)String在JDK8中是用final char[]存储字符串数据的,JDK9后改为final byte[]存储数据的。因为char类型占两个字节,很多时候的数据只需要一个字节就能存放的,因此会浪费掉一半的空间,之后改成byte[]类型,同时为了能够存放两个字节的数据(例如汉字),会将在使用前判断字符集。例子:pub

2020-08-22 14:31:16 922 1

原创 关于JVM执行引擎的理解

一、执行引擎介绍:执行引擎是Java虚拟机核心的组成部分之一。执行引擎的作用:由于代码经过前端编译器后生成字节码文件,JVM将装在字节码文件到内部,JVM中只有自己的执行引擎才"解析"对应的指令集,然后为翻译成机器指令(解释器)或者是将翻译成机器指令后再加入缓存(JIT编译器)。执行引擎的工作过程:依赖于PC寄存器,当PC寄存器指向哪条指令时,执行引擎就去操作该指令对应的操作。当在执行的过程中,遇到局部变量表中的对象引用时,会根据引用访问堆中对象的实例以及根据对象头来访问对应位置的

2020-08-22 14:27:08 467 1

原创 Java的对象是在JVM中是如何创建的?

一、对象的实例化创建对象的方式:通过new关键字(或者一些设计模式下的获取对象方法)通过Class的newInstance(),也就是反射的方式,但是要满足权限是public和无参构造器通过Constructor的newInstance(args[]):也是反射的方式,但是可以调用空参或者带参的构造器,权限没有要求使用clone():需要该类实现Cloneable接口中的clone()方法使用反序列化:例如从文件中获取对象流转成对象使用第三方库Objenesis等创建对象的步骤:判断

2020-08-22 14:24:12 304

原创 JVM之关于GC一些小概念

GC的介绍Partial GC:部分收集,不是对整个Java堆和方法区的收集,其中包括以下三种GC。Minor GC/Young GC:新生代收集,只对新生区(Eden+S0/S1)的收集Major GC/Old GC:老年代收集,只对老年代进行收集(只有CMS的concurrent collection是这个模式),但有时候材料提到的Major GC跟Full GC一致功能(整堆收集),这里我觉得它应该是只对老年代进行收集。Mixed GC:混合收集,对整个新生代以及部分老年代的收集,目前只

2020-08-22 14:18:29 275

原创 JVM的类加载器(详细)

一、类加载器的关系二、类加载器的分类JVM支持两种类加载器,一种为引导类加载器(Bootstrap ClassLoader),另外一种是自定义类加载器(User Defined ClassLoader)引导类加载器是由C/C++编写的无法访问到Java虚拟机规定:所有派生于抽象类ClassLoader的类加载器都划分为自定义加载器最常见的类加载器只有三个(如上图所示)用户自定义的类会被系统类加载器所加载,核心类库的类会被引导类加载器所加载public class ClassLoaderT

2020-08-22 14:02:45 444

原创 JVM的类加载过程(详细)

一、类加载过程图简图:二、类加载器与类加载的过程介绍类加载器系统分为三个阶段:加载阶段:引导类加载器、扩展类加载器、系统类加载器。链接阶段:验证、准备、解析。初始化阶段:初始化。类加载子系统只负责加载class文件不负责运行,class文件在打开的头有特定的文件表示(java中的class文件以cafebabe(咖啡宝贝????))加载的类信息存放在一块称为方法区的地方,方法区里存放 类的信息、运行时常量池三、类的加载过程加载:通过一个类的全限定名获取此类的

2020-08-22 13:59:52 443

头像上传代码.rar

使用fastdfs+springboot+dubbo+zookeeper搭建的头像上传,在博客中有说明!

2020-08-23

空空如也

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

TA关注的人

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