自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java自动测试

三大等待硬性,显式,隐式aler弹窗控制:comfirm弹窗控制:也使用alert

2021-08-31 03:33:48 268

原创 Selenium

安装Firefox安装Selenium插件idea添加Selenium依赖元素定位findElement()可以通过id,name,tgname等变量来定位,sendkeys写入数据使用tgname重复率高,容易定位到多个元素使用className注意,只能使用一个当前页面唯一的类名定位...

2021-08-30 04:45:06 186

原创 Jmeter运行badboy脚本

使用badboy进行录制这里我使用禅道提bug导出为Jmeter文件即可Jmeter运行脚本使用Jmeter打开jmx文件,添加结果树点击回放,测试脚本是否正常运行根据结果树,对脚本进行调试调试脚本需要自己摸索...

2021-08-24 03:49:12 233

原创 性能测试(loadrunner)

性能测试常见分类负载测试,压力测试,并发测试,配置测试,可靠性测试loadrunner是一个性能测试工具loadrunner自带的web tours订票系统

2021-08-23 16:40:03 92

原创 软件测试介绍

软件测试方法分为:黑盒(不透明),白盒(透明),灰盒(半透明)软件测试方向分为:性能测试,功能测试,安全测试性能测试分为:压力测试,负载测试,并发测试压力测试:测试最大性能负载测试:测试在负载情况下能运行多长时间软件测试具体阶段:单元测试,集成测试,系统测试,验收测试软件测试流程:需求分析,测试设计(测试计划,测试方案,测试策略,测试用例),测试执行,测试总结测试用例需要有这些内容:5w1h: 1.测试的目的。(why) 2.测试的范围。(what) 3.测试进度安排

2021-08-22 06:23:00 147

原创 过期删除策略

redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样怎样的策略来删除过期数据的呢?过期键删除策略过期删除策略通常有以下三种定时删除:在为键设置过期时间的同时创建一个定时器,当过期时间到来时就会触发定时器中的处理函数,立即执行过期键的删除操作定期删除:每隔一段时间就对数据库进行一次检查,删除其中的过期键。检查的数据库数量及删除的过期键数量由算法决定惰性删除:不会主动去删除过期键。每次获取键时都会判断获取的键是否过期,如果过期则删除,没过期则返

2021-08-21 22:21:44 121

原创 Redis持久化

RDBrdb是一种类似于快照的方式进行持久化,原理是他单独fork了一个子进程专门去干这件事。可以通过修改配置文件来修改rdb的持久化策略。他的工作就是按照定义的策略,定时或者在修改多少次之后来进行快照。在宕机或者关闭时声称已个dump文件。当redis再次开启时他会自动读取这个dump文件来回复数据。rdb默认是开启的所以绝大多数情况下的需求他是可以满足的。AOFaof是以一种日志记录的方式来进行持久化的。他会记录每一次的操作。默认是每秒同步一次。在宕机或者异常情况重启后他会自动恢复。如果aof文件

2021-08-19 02:18:16 68

原创 Redis配置文件

2021-08-19 02:02:40 68

原创 事务和Jedis

事务Redis单条命令 保证原子性,但事务不保证原子性,没有回滚一个事务中的所有命令都被序列化,一次性、顺序性、排他性的执行命令Redis没有事务隔离级别事务的执行:​ 开启事务:multi​ 命令入队:…​ 执行/放弃事务:exec/discard编译时异常:不会执行任何代码运行时异常:执行正常代码,抛出错误悲观锁认为什么时候都会出问题,做什么都加锁效率不高,使用场合少乐观锁认为什么时候都不会出问题,自己更新数据才去判断是否有人修改数

2021-08-17 06:53:50 99

原创 Redis数据类型

数据类型Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU evi

2021-08-17 04:41:34 233

原创 Redis入门

Redis入门概述Redis(Remote Dictionary Server ),即远程字典服务是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。支持大多数语言。使用NoSQL技术特点内存存储,持久化(rdb,aof)效率高,可用于高速缓存。支持集群支持事务安装宝塔安装。简单快捷连接redis-cli -p 6379关闭shutdown测试//宝塔在 www/server/redis

2021-08-15 03:36:10 115

原创 CAS和volatile

CAScompareAndSet,它的简称就是 CAS (也有 Compare And Swap 的说法),它必须是原子操作。public void withdraw(Integer amount) { while(true) { // 需要不断尝试,直到成功为止 while (true) { // 比如拿到了旧值 1000 int prev = balance.get(); // 在这个基础上 1000-10 = 990 int next = prev - amount; /* co

2021-08-10 00:31:07 216

原创 几种垃圾回收器

垃圾回收器分类按线程分:1.串行垃圾回收器。2.并行垃圾回收器按工作模式分:1.并发式垃圾回收器2.独占式垃圾回收器:GC时STW。按碎片处理分:1.压缩式垃圾回收器:压缩整理,清理碎片2.非压缩式垃圾回收器:没有压缩整理。按工作的内存分:1.老年代垃圾回收器2.年轻代垃圾回收器评估GC的指标吞吐量:运行用户代码的时间占总运行时间的比例。(总运行时间=程序运行时间+内存回收时间)垃圾开销:吞吐量的补数。暂停时间:STW的时间收集频率:收集操作的频率内存占用:占用java堆

2021-08-09 20:07:00 1055

原创 几种引用和一些名词

System.gc()的理解调用system.gc()或者Runtime.getRuntime().gc(),会触发Full GC ,同时对老年代和新生代进行尝试回收,无法保证对垃圾收集器的调用内存溢出内存溢出(OOM):在OOM之前会进行垃圾回收,如果内存还是不够,就报OOM。特殊情况:分配一个超大对象,超过了堆的大小,直接报OOM。内存泄露对象不被用到,但是被引用,无法回收,叫做内存泄露。举例:单例模式中,单例的生命周期很长,如果对调用外部对象的引用,则会导致内存泄露。Stop the

2021-08-09 20:04:38 146

原创 常见垃圾回收算法

标记-清除算法(Mark-Sweep)标记:从根对象开始遍历,标记所有被引用的对象清除:堆内存,从头到尾遍历,发现没有被标记的,回收。优点:实现简单缺点:效率不高(两次遍历)。​ GC时需要STW。​ 这种方式会导致清理出的内存不连续。所以需要维护空闲列表。什么是清除、回收?对象并没有被正在的清除,而是把对象地址放在空闲列表里,需要用内存时,覆盖他。复制算法原理:将活着的内存空间分为两块,每次只使用一块,回收时,将存活的对象复制到另一块内存中,原来这块完全清除。优点:没有标记清

2021-08-09 20:03:54 71

原创 垃圾回收概述

垃圾程序运行中,没有任何指针指向的对象。java自动内存管理开发人员无需参与分配和回收堆是垃圾回收的重点区域新生代:频繁回收老年代:较少回收方法区:基本不动垃圾回收相关算法标记阶段:找出哪些是垃圾清除阶段:回收垃圾标记阶段:对象存活判断 方式:引用计数算法(java未使用)原理:对象有一个引用计数器属性,每多个引用,加1,当为0时,可以被回收。优点:实现简单,垃圾容易辨识,判断效率高,回收没有延迟性缺点:无法处理循环引用的情况,如:废弃的循环链表循环引用:两个或多个对象互

2021-08-09 20:01:40 87

原创 JVM中的String

String的不可变性String s1="abcd";String s1=new String("abcd");String不可被继承String底层Hashtable字符串常量池不会存储相同的东西。字符串常量池底层是固定大小的Hashtable使用-XX:StringTableSize 设置常量池大小String的内存分配java6以前:在永久代java7:在堆,保留永久代java8:元空间,在堆String字符串拼接面试题equals和==本质是相同的string的eq

2021-08-09 19:57:44 90

原创 关于执行引擎

执行引擎前端编译:源码编译成字节码文件后端编译:字节码文件编译成机器语言jvm的主要任务是负责把字装载字节码到其内部执行引擎的任务是把字节码解释成机器指令解释器:翻译字节码成机器指令jit编译器:也是翻译字节码,区别是编译后生成了机器指令文件。为什么java是半编译半解释型语言?同时存在解释器和编译器。两者各有千秋,优势互补。解释器如今,解释器变得低效。响应速度快,但是执行速度慢。jit编译器/即时编译器(Hotspot的C1,C2编译器)不会立刻执行,先编译成机器指令,但编译完

2021-08-09 19:55:19 66

原创 重点:happens-before

happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结happens-beforehappens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结线程解锁 m 之前对变量的写,对于接下来对 m 加锁的其它线程对该变量的读可见static int x;static Object m = new Object();new Thread(()->{ synchronized(m) { x

2021-08-08 13:36:07 153

原创 JMM 可见性 原子性 有序性

Java 内存模型JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、 CPU 指令优化等。JMM 体现在以下几个方面:原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响可见性现象:在main中修改run的值,线程也无法停止static boolean run = true;public static void mai

2021-08-08 05:35:22 200

原创 哲学家进餐

死锁一个线程需要同时获取多把锁,这时就容易发生死锁例如:t1 线程获得 A对象 锁,接下来想获取 B对象 的锁​ t2 线程获得 B对象 锁,接下来想获取 A对象 的锁定位死锁检测死锁可以使用 jconsole工具,或者使用 jps 定位进程 id,再用 jstack 定位死锁:哲学家进餐问题有五位哲学家,围坐在圆桌旁。 吃饭时要用两根筷子吃,桌上共有 5 根筷子,每位哲学家左右手边各有一根筷子。 如果筷子被身边的人拿着,自己就得等待。筷子类:class Chopstick { S

2021-08-04 13:34:31 140

原创 偏向锁、批量重偏向、批量撤销、锁消除、锁粗化

偏向锁同一线程对同一对象加锁,叫锁重入。加轻量级锁时,若没有竞争,每次重入都要进行CAS操作,导致浪费性能。于是,使用偏向锁优化性能, 将线程ID和对象头替换若其他线程竞争使用偏向锁对象时,偏向锁升级成轻量级锁一个对象创建时:如果开启了偏向锁(默认开启),那么对象创建后,markword 值为 0x05 即最后 3 位为 101,这时它的 thread、epoch、age 都为 0偏向锁是默认是延迟的,不会在程序启动时立即生效,如果想避免延迟,可以加 VM 参数 - XX:BiasedLoc

2021-08-02 03:10:42 302

原创 锁膨胀和自旋优化

加轻量级锁时,如果cas操作失败,轻量级锁变重量级锁,这个过程叫锁膨胀自旋优化当t1线程获得锁时,另t2线程也尝试获得,这时,t2不会直接进入阻塞队列,而是进行自旋,如果自旋成功,避免阻塞。自旋:尝试获取锁,未获取到不进入阻塞,再次尝试。自旋会占用 CPU 时间,单核 CPU 自旋就是浪费,多核 CPU 自旋才能发挥优势。在 Java 6 之后自旋锁是自适应的,比如对象刚刚的一次自旋操作成功过,那么认为这次自旋成功的可能性会高,就多自旋几次;反之,就少自旋甚至不自旋Java 7

2021-08-01 18:39:31 131

原创 轻量级锁加锁解锁过程

轻量级锁static final Object obj = new Object();public static void method1() { synchronized( obj ) { // 同步块 A method2(); } }public static void method2() { synchronized( obj ) { // 同步块 B }}每次指向到 synchronized 代码块时,都会创建锁记录(Lock Record)对象,每个线程都会包括

2021-08-01 18:15:19 624 1

原创 synchronized优化原理

JVM对象默认是偏向锁优化方法:不用Monitor,而用轻量级锁偏向锁批量重刻名不能刻名字

2021-08-01 18:12:54 74

原创 Monitor概述

Monitor监视器/管程/锁注:monitor为操作系统提供的对象,obj是java中的对象synchronized(obj){ 临界区 }; // 一个obj与一个Monitor对象关联刚开始Owner为nullT2执行synchronized(obj) Owner置为T2后执行的线程进入EntryList链表,为阻塞状态T2执行完后,Owner置空。唤醒EntryList中的线程(顺序不一定)...

2021-08-01 17:48:09 507

原创 对象结构、实例化、访问

对象实例化的方式创建对象的方式1.new:直接new,或者单例模式中调用类内部的静态方法(类内自己new),或者xxxbuilder,xxxFactory(本质都是new)2.Class的newInstance() 或者 Constructor 的newInstance(可带参数)前者已过时,被后者替代3.clone(),不调用任何构造器,需要接口Cloneable的clone()方法4.反序列化:从文件、网络中获取对象的二进制流。5.第三方库创建过程(字节码角度)先加载到方法区,在堆内创建

2021-07-08 02:28:56 168

原创 方法区概述

方法区看做独立于堆的内存空间线程共享内存可不连续如果第三方jar包太多,类太多,tomcat部署的工程过多,大量动态的生成反射方法区也会溢出,java.lang,OutOfMemoryError:Metaspace栈,堆,方法区的交互关系?Person person =new Person();Person类被类加载器加载到方法区(Class文件),person引用(变量)放在局部变量表里,new Person()放在堆里堆中对象的实例数据存在一个指针,指向方法区对象类型数据方法区参数

2021-07-08 02:27:07 89

原创 本地方法接口、堆

本地方法接口是一个java调用非java代码的接口**使用native修饰的方法。**没有方法体。比如 getClass()方法,Start()方法为什么用本地方法?java需要与java外的环境交互,与操作系统交互,调用c++/c。本地方法栈管理本地方法的调用。和虚拟机栈差不多。堆Heap概述堆可以物理上不连续的存储空间。逻辑上视为连续。几乎所有的对象实例和数组运行时都在堆上。还可能分配在栈上。栈帧中局部变量表中的对象引用的实体放在堆里方法执行结束后,堆里的对象不会马上被移除,只

2021-07-08 02:26:17 74

原创 栈顶缓存,动态链接,虚方法,方法绑定,栈的面试题

栈顶缓存技术频繁的执行入栈出栈操作会影响执行速度,所以,将栈顶元素缓存在物理cpu的寄存器,依次降低读写次数,提升执行引擎的效率动态链接(指向运行时常量池的引用)字节码文件中,带#号那里Constant pool ,就是常量池#+数字:这叫符号引用java源文件编译成字节码文件时,所有变量和方法都作为符号引用放在常量池里常量池运行时在方法区里方法区是共享的栈帧内包含指向常量池的引用 #+数字。常量池的意义:减小内存,提高复用性方法的绑定机制静态链接、早期绑定:目标方法编译阶段已知,且

2021-07-08 02:25:13 241

原创 栈的存储结构和原理

栈中的数据以栈帧为格式存储一个方法对应一个栈帧。如果一个方法出现异常,会返回给前面的栈帧。不能在一个栈里使用另一个线程的栈帧栈帧的内部结构每个栈帧存储着:局部变量表(本地变量表)操作数栈动态链接(指向运行时常量池的方法引用)方法返回地址(方法正常退出或异常退出的定义)附加信息局部变量表或本地变量表(菜谱里的原料表)是一个数组数组,主要存储方法参数和方法体内的局部变量数据类型包括:基本数据类型,对象的引用,returnAddress类型容量大小在编译期确定下来的。Slot(变量槽

2021-07-08 02:23:18 738

原创 运行时数据区

运行时数据区一个JVM进程对应一个方法区和堆,多个线程共享。一个线程对应独立的栈,本地方法栈,程序计数器。每个JVM只有一个Runtime实例,是运行时环境,相当于图上运行时数据区的框框。JVM中的线程Hotspot JVM的线程是内核级线程,内核线程:建立和销毁都是由操作系统负责、通过系统调用完成的。虚拟机中,每个线程都与操作系统本地线程直接映射,java线程结束后,本地线程也会回收。jmv有许多后台线程主要有:虚拟机线程周期任务线程Gc线程编译线程信号调度线程程序计数器(pc

2021-07-08 02:21:44 62

原创 双亲委派机制,沙箱安全机制

双亲委派机制当需要加载一个类时,当前类加载器不会先去加载,而是委托给父类加载器执行,最终到引导类加载器如果父类加载器可以完成类的加载任务,那么就父加载器加载,如果不可以(加载路径下没有这个类),就子加载器加载优势:避免类重复加载保护程序安全,防止核心Api被随意篡改。打破双亲委派机制的例子加载jdbc.jar包,核心接口由引导类加载器加载,接口实现类由外部提供,所以方向委托给子加载器,jdbc包用线程上下文加载器沙箱安全机制不能在jdk自带的包(rt.jar)下加载自定义类,保护java核

2021-07-08 02:20:07 118

原创 类加载器概述

类加载器概述ClassLoader(类加载器)只负责class(字节码)文件的加载,至于是否能运行则由执行引擎决定(execution engine)。字节码在物理磁盘上。加载到JVM的class文件,被称为DNA元数据模板,放在方法区,类加载器相当于搬运工。类加载的过程一、加载1.获得二进制字节流2.将此类的数据结构转换成方法区的数据结构3.生成这个类的Class对象,作为方法区这个类的各种数据的访问入口二、链接1.验证验证字节码的格式和数据2.准备为类变量(静态变量)分配内存,

2021-07-08 02:18:27 83

原创 JVM内存概述

Jvm整体结构java代码执行流程java源码.java—java编译器—字节码 —java虚拟机(类加载器—字节码校验器—翻译字节码(解析执行)—Jit编译器(编译执行))—操作系统翻译字节码,jit编译器:叫做执行引擎,作用是把高级语言翻译成机器指令Java指令根据栈来设计的:跨平台性,指令集小,指令多,执行性比寄存器差JVM生命周期虚拟机启动:引导类加载器创建一个初始类虚拟机执行:java程序启动时,虚拟机才执行,程序结束,虚拟机停止。只有虚拟机一个进程,我们写的程序都是虚拟机的线程。

2021-07-08 02:17:15 103

原创 快速排序

排序原理:1.首先设定一个分界值,把数组分成两部分2.将大于等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。3.将两数组重复1.2.步骤4.递归后,所有数据都排好了顺序,再将数据拼接起来。切分原理:1.找一个基准值,用两个指针分别指向数组的头部和尾部的后一位;2.从尾部向头部开始搜索一个比基准值小的数,搜索到即停止,并记录指针的位置;3.从头部向尾部开始搜索一个比基准值大的数,搜索到即停止,并记录指针的位置;4.交换当前左边指针位置和右边指针位置的数;5.重复2,3,4

2021-03-16 00:36:01 122

原创 插入排序和希尔排序

插入排序简单理解为把无序的序列插入到有序序列中第一步:是把无序数组划分成一个有序序列和一个无序序列第二步:依次把无序序列中的数插入有序序列,1比6和8小,把1存起来,8右移,6右移,1插入。总结一下:无序序列的数与有序序列的数依次比较,插入合适的位置。具体代码如下:插排适用的情况:1.序列基本有序2.元素数量较少时时间复杂度:O(n^2)空间复杂度:O(1)希尔排序希尔排序是插入排序的改进版。简单理解为分组的插入排序第一步:先引入gap变量,gap的意思就是增长量,将间

2021-03-13 23:28:07 136

空空如也

空空如也

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

TA关注的人

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