自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(99)
  • 收藏
  • 关注

原创 字节码指令简介

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(操作数,Operands)而构成。字节码与数据类型由于java虚拟机的操作码长度只有一个字节,所以java并不是每种数据类型和每种操作都有对应的指令码,也就是说指令集是非完全独立的。大部分的指令都没有支持整数类型byte、har、hot甚至没有支持Boolean类型。编译器会在编译期或运行期将byte、short、Boolean、char转换为对应的int类型的字节码指令来

2022-01-23 12:31:40 291

原创 lambda表达式二之Stream流

Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据,流讲的是计算Stream自己不会存储元素Stream不会改变源对象,会返回一个持有结果的新Stream。Stream操作是延迟执行的,意味着会等待需要结果的时候才执行。操作步骤一、创建Stream一个数据源,获取一个流1.可以通过Collection系列集合提供的stream()或者parallelStream()2.通过Arrays中静态方法stream()获取数组流3.通过Stream

2022-01-16 19:38:36 608

原创 Class类文件结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在,根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表。无符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1、2、4、8个字节的无符号数。表是由多个无符号数或其他表作为数据项构成的符合数据类型,所有的表都习惯性地

2022-01-16 11:56:57 384

原创 lambda表达式二

java内置核心函数接口Consumer : 消费型接口 一个参数,没有返回值void accept(T t); public static void main(String[] args) { consumeType(5,(x)-> System.out.println(x)); } public static void consumeType(Integer integer,Consumer<Integer> num){

2022-01-09 19:31:06 303

原创 调优案例分析与实战

大内存硬件上的程序部署策略目前单体应用在较大内存的硬件上主要的部署方式有两种:1)通过一个单独的Java虚拟机实例来管理大量的Java堆内存。2)同时使用若干个Java虚拟机,建立逻辑集群来利用硬件资源。第一种方式,对于用户交互性强、对停顿时间敏感、内存又较大的系统,并不是一定要使用Shenandoah、ZGC这些明确以控制延迟为目标的垃圾收集器才能解决问题),使用Parallel Scavenge/Old收集器,并且给Java虚拟机分配较大的堆内存也是有很多运行得很成功的案例的,但前提是必须把应用

2022-01-09 11:42:22 182

原创 理解线程池

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。执行过程:任务进来时,先判断核心线程是否处于空闲状态,如果不是,核心线程就先就执行任务,如果核心线程已满,则判断任务队列是否有地方存放该任务,若果有,就将任务保存在任务队列中,等待执行,如果满了,在判断最大可容纳的线程数,如果没有超出这个数量,就创建非核心线程执行任务,如果超出了,就调用handler实现拒绝策略。线程池的主要参数构造方法:public ThreadPoolExecutor(int

2022-01-03 20:18:56 460

原创 JConsole:Java监视与管理控制台

JConsole是一款基于JMX的可视化监视、管理工具。它的主要功能是通过JMX的MBean对系统进 行信息收集和参数动态调整。点击JDK/bin 目录下面的jconsole.exe 即可启动内存监控“内存”页面相当于可视化的jstat命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势。我们通过运行下面代码来查看下监视功能。运行时设置的虚拟机参数为-Xms100m -Xmx100m -XX:+UseSerialGC这段代码的作用是以64KB/50毫秒的速度往Java堆

2022-01-03 14:29:29 1262

原创 生产者消费者问题

生产者消费者问题,也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例。生产者生成一定量的数据放到缓冲区中,然后重复此过程;与此同时,消费者也在缓冲区消耗这些数据。生产者和消费者之间必须保持同步,要保证生产者不会在缓冲区满时放入数据,消费者也不会在缓冲区空时消耗数据。不够完善的解决方法容易出现死锁的情况,此时进程都在等待唤醒。如果共享数据区已满的话,阻塞生产者继续生产数据放置入内;如果共享数据区为空的话,阻塞消费者继续消费数据;在实现生产者消费者问题时,

2021-12-26 20:11:33 421

原创 JHSDB:基于服务性代理的调式工具

JHSDB是一款基于服务性代理( Serviceability Agent, SA)实现的进程外调试工具。服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言(含少量JNI代码)实现的API集合。服务性代理以HotSpot内部的数据结构为参照物进行设计,把这些C++的数据抽象出Java模型对象,相当于HotSpot的C++代码的一个镜像。通过服务性代理的API,可以在一个独立的Java虚拟机的进程里分析其他HotSpot虚拟机的内部数据,或者从HotSpot虚拟机进程

2021-12-26 15:28:28 1193

原创 基础故障处理工具

jps:虚拟机进程状况工具和UNIX的ps命令很像,可以列出来正在运行的虚拟机进程,并显示虚拟机执行主类,名称以及这些进程的本地虚拟机唯一ID,是使用频率最高的JDK命令行工具之一。选项作用-q只输出LVMID,省略主类的名称-m输出虚拟机进程启动时传递给主类main()函数的参数-l启动服务器输出主类的全名,如果进程执行的是JAR包,则输出JAR路径-v输出虚拟机进程启动时的JVM参数jstat:虚拟机统计信息监视工具用于监视虚拟机各种运行状态信

2021-12-19 19:33:32 1015

原创 死锁与LOCK锁

为了避免多个线程同时访问同一个数据而产生不可预料的结果,需要将各个线程对同一数据的访问同步。同步最常见的方法就是用锁。而用锁的过程中,两个或者多个线程已经拥有资源,而且都在等待对放线程释放资源,都处于等待状态,可能发生死锁的问题。Lock和synchronized有以下几点不同:1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在

2021-12-19 16:40:29 488

原创 线程同步机制

线程同步多个线程处理同一个对象时,并且某些线程还想修改这个对象,就需要线程同步,线程同步其实是一种等待机制,多个想要获取这个资源的线程要进入对象的等待池形成队列,前面的线程使用完,下个线程才能获取资源。由于多个线程共享同一块存储空间,为保证数据的正确性,在访问时加入了锁机制synchronized,当一个线程获取了对象的排他锁,就会独占资源,其他线程必须等待,使用完成之后释放锁,供其他对象使用,会存在一些问题:一个线程持有锁会导致其他需要此锁的线程挂起。加锁和释放锁会导致较多的上下文切换和调度延迟

2021-12-12 19:44:01 272 2

原创 对象分配内存

对象优先在Eden分配一般情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间进行分配时,虚拟机将发生一次Minor GC.HotSpot虚拟机提供了 -XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时候输出当前区域内存各区域各分配情况。大对象直接进入到老年代大对象是需要大量连续内存空间的java对象,比如很长的字符串或者数量庞大的数组,在分配空间时,它容易导致内存明明还有不少空间就提前触发了垃圾收集,以获取足够的

2021-12-12 12:40:53 658

原创 虚拟机日志

程序对应的类别和能读取的组程序名类别G1PrintHeapRegionsXlog: gc+region=traceG1PrintRegionLiveness InfoXlog: gc+liveness=traceG1Summarize ConcmarkXlog: gc+marking=traceG1SummarizeRSetStatsXlog: gc+remset*=traceGCLogFileSize, NumberOfGCLogFiles, UseG

2021-12-05 18:01:26 873

原创 线程状态及优先级

线程状态Thread.State是一个枚举类,表示线程的状态,线程可以处于以下NEW 创建之后,尚未启动的线程处于这个状态RUNNABLE 在java虚拟机中执行的线程处于此状态。BLOCKED 被阻塞等待监视器锁定的线程处于此状态。WAITING 正在等待另一个线程执行特东动作的线程处于此状态。TIMED_WAITING 正在等待另一个线程执行动作到达指定等待时间的线程处于此状态。TERMINATED 已退出的线程的状

2021-12-05 15:40:20 643 1

原创 线程常用方法

线程状态新建状态 :Thread thread = new Thread();线程一旦创建就进入新生状态就绪状态:当调用线程的start()方法就进入就绪状态。 运行状态:进入到运行状态,线程才真正执行线程体的代码块。阻塞状态:当调用sleep()、wait()或者同步锁定时,线程进入阻塞状态,阻塞状态解除后,重新进入就绪状态,等待cpu的调度。死亡状态:线程中断或者结束,一旦进入死亡状态,就不能再次启动。线程方法方法说明setPriority(int priority

2021-11-21 19:55:24 493

原创 低延迟垃圾收集器

衡量垃圾收集器的三项重要收集指标内存占用吞吐量延迟一款优秀的垃圾收集器通常最多可以同时到达成其中的两项Shenandoah收集器Shenandoah是一款只有OpenJDK会包含,而OracleJDK不存在的收集器。与G1相比的优点从代码的历史渊源上来看,Shenandoah收集器更像是G1的下一代继承者,两者相似的堆内存布局,在初始标记、并发标记等许多阶段的处理思路都高度一致。但是Shenandoah相比G1还是至少有三个明显的不同之处。支持并发的整理算法,G1的回收阶段是可以多

2021-11-21 16:35:43 206

原创 线程创建方式

概率线程就是独立的执行路径在程序运行时,即使没有自己闯将线程,后台也会有多个线程,比如主线程,GC线程。main()是主线程,为系统的入口,用于执行整个程序。在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。对同一份资源进行操作时,会存在资源抢夺的问题,需要加入并发控制。线程会带来额外的开销,如CPU调度时间,并发控制开销。每个线程在自己的工作内存交互,内存控制不当造成数据不一致线程创建的方式有三种继承Thread

2021-11-14 21:29:25 350

原创 经典垃圾收集器

Serial 收集器最基础,历史最悠久的收集器,是一个单线程收集器,它在进行垃圾收集时,必须暂停其他工作线程,直到它收集结束。缺点:用户体验差,电脑在运行时可能突然暂停响应ParNew收集器采用的标记-整理算法,实际上是Serial 收集器多线程运行版本。ParNew Scavenge收集器新生代收集器,也是采用标记-整理算法,它的目标是达到可控制的吞吐量吞吐量:处理器用于运行用户代码的时间与处理器总消耗时间的比值, 即 运行用户代码/(运行用户代码+运行垃圾收集时间)高吞吐量最高效

2021-11-14 00:04:13 348

原创 分代收集简述

分代收集建立在两个分代假说纸上弱分代假说:绝大多数对象都是朝升夕灭的强分代假说:熬过越多次垃圾收集过程的对象就难以消亡。收集器应该将Java堆划分出不同的区域 然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。把一些难以熬过垃圾收集过程的对象集中放在一起,每次回收只关注如何保留少量存活而不是标记那些大量要被回收的对象。 对于难以消亡的对象,集中放在一起,虚拟机便可以使用较低的频率来回收这个区域。当Java 堆划分出不同的区域后,垃圾收集器才可以每次只回收其

2021-11-06 09:57:16 127

原创 分布式dubbo+zookeeper

分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统。是由一组通过网络进行通信,每个计算机之前相互通信,为了完成共同的任务而协调工作的计算机节点组成的系统。其目的是利用更多的机器、处理更多的数据。RPC是指远程调用,它允许程序调用另一地址空间的过程活函数。比如A电脑调用B电脑上的函数。两个核心模块 通讯 序列化dubbodubbo官网...

2021-10-31 22:16:22 974

原创 回收堆和方法区

/** * @author 陈 * @date 2021/10/28 上午9:55 */public class JvmTest { public static JvmTest test = null; @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("finalize method executed

2021-10-31 11:42:41 48

原创 SpringBoot邮件任务、定时任务

邮件任务引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>配置application.properties#邮箱名称spring.mail.usern

2021-10-24 20:10:46 1394

原创 内存溢出异常

OutOfMemoryError异常java堆溢出将限制 java堆的大小为20MB,不可拓展, -Xms20m -Xmx20m是设置堆的最小值与最大值,-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现异常时Dump出当前的内存堆转储快照以便分析。/** * -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError */public class JvmTest { public static void main(

2021-10-24 12:18:16 60

原创 java内存区域

java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。程序计数器它可以看作是当前线程锁执行的字节码的行号指示器,字节码解释器工作时就是通过这个计数器的值来选取吓一跳需要执行的字节码指令每个线程独有 私有-Java虚拟机栈就是我们平常说的栈内存,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每个线程独有 私有本地方法栈本地方法栈与虚拟机栈所发挥的作用是非常相似,其区别只是虚拟

2021-10-17 20:19:25 44

原创 lambda表达式一

Lambda表达式实际上简化匿名内部类匿名内部类没有名字的内部类必须继承一个父类或实现一个接口,但最多只能继承一个父类,或实现一个接口。1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类定义成抽象类。2)匿名内部类不等定义构造器(构造方法),因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,...

2021-10-17 13:17:52 42

原创 openJdk环境构建

mac中自带的jdk并不包含源代码获取OpenJDK源码https://hg.openjdk.java.net/jdk/jdk12/ 点击左边菜单中"Browse",显示源根目录页面点击左边的“zip”链接即可下载当前版本打包好的源码

2021-09-21 17:36:48 432

原创 SpringSecurity

SpringSecurity是针对spring项目的安全框架,也是SpringBoot底层安全模块默认的技术选型,可以实现强大的web安全控制,仅需要引入spring-boot-starter-security,进行少量配置,即可实现强大的安全管理。有几个类很关键WebSecurityConfigurerAdapter:自定义Security策略AuthenticationManagerBuilder:自定义认证策略@EnableWebSecurity:开启Security模式Spring S

2021-09-21 13:44:37 842

原创 idea中配置连接多个数据库

要在一个项目中连接如下两个数据库yml中配置两个不同数据库:master: datasource: username: root password: url: jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driversecond: datasource: username

2021-09-05 17:18:02 3671

原创 自动生成mapper文件

pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/mav

2021-09-05 14:41:15 971

原创 springboot整合JDBC

新建spring项目时,导入mysql驱动,如下配置数据库连接文件(在application.yml中配置)spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver表中数据

2021-08-29 12:50:46 126

原创 反射获取注解和泛型

反射操作泛型java采用泛型擦除的机制来引入泛型,java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除。ParameterizedType:表示一种参数化类型,比如CollectionGenericArrayType:表示一种元素类型或者类型变量的数组结构TypeVariable:是各种类型变量的公共父接口WildcardType:代表一种通配符类型表达式import java.lang.reflect.Me

2021-08-22 18:20:39 56

原创 mvc自动配置

如果想自定义一些定制化的功能,只要写这个组件,然后将它交给SpringBoot,SpringBoot就会帮你自动装配。@Configurationpublic class MyMvcConfig implements WebMvcConfigurer { @Bean public ViewResolver MyViewResolver(){ return new MyViewResolver(); } //自定义一个视图解析器 public st

2021-08-22 16:32:33 74

原创 反射动态创建对象

创建对象创建类的对象,调用Class对象的newInstance()方法类必须有一个无参的构造器类的构造器的访问权限需要足够 User user = (User) aClass.newInstance();用有参的构造器创建对象步骤如下:通过Class类的getDeclaredConstructor(Class...parameteTypes)取得本类的指定形参类型的构造器向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。通过Constructor

2021-08-15 19:24:12 174 1

原创 首页和thymeleaf模板引擎

首页在导入静态资源的包 "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" 下新建index.html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title&gt

2021-08-15 14:36:42 123 1

原创 类的加载器

类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成这个类的java.lang.Class对象,作为方法区中类数据的访问入口。类缓存:标准的JavaSE类加载可以按要求查找类,但一旦某个类被加载到类加载中,它将维持加载(缓存)一段时间,不过JVM垃圾回收机制可以回收这些Class对象。类加载器作用是用来类(class)装载进内存的。JVM规范定义了如下类型的类的加载器。引导类加载器:用C++编写的,是jvm自带的类加载器,负责JAVA平台

2021-08-08 19:27:17 51

原创 SpringBoot导入静态资源

SpringMVC的web配置都在 WebMvcAutoConfiguration这个配置类里面;我们可以去看看WebMvcAutoConfigurationAdapter中有很多配置方法;addResourceHandlers添加资源处理 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { if (!this.resourceProperties.isAddMap

2021-08-08 14:46:48 168

原创 获取类运行时结构

通过反射获取运行时类的完整结构Field、Method、Constructor、Superclass、Interface、Annotation获取类Class aClass = Class.forName("test.User");获取类的名字 //获取类的名字 aClass.getName(); //获取类的简单名字 aClass.getSimpleName();获取类的属性(1)只能找到public属性Field[] de

2021-08-01 18:21:38 47

原创 多环境配置及配置文件位置

配置文件可以从以下位置加载:file指的是项目路径,classpath是指类路径。file:./configfile: ./classpath:/configclasspath:/ (默认的)加载优先级依次从上向下

2021-08-01 15:09:15 88

原创 Class对象

对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE都为了其保留一个不变的Class类型的对对象。一个Class对象包含了特定某个结构的有关信息。Class本身也是一个类Class对象只能由系统建立对象一个加载的类在JVM中只会有一个Class实例一个Class对象对应的是一个加载到JVM中的.class文件每个类的实例都会记得自己是由哪个Class实例所生成通过``Class```可以完整的得到一个类中的所有被加载的结Class类是Ref

2021-07-25 18:37:31 63

空空如也

空空如也

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

TA关注的人

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