java
文章平均质量分 93
Perkinl
但行好事,莫问前程
展开
-
JVM之方法区、永久代、元空间三者
方法区实在虚拟机规范里面被定义的,不同的虚拟机对这个定义的实现不同,在HotSpot 虚拟机中在 jdk1.7 版本之前的方法区实现叫永久代(PermGen space),jdk1.8 之后叫做元空间(Metaspace)。原创 2022-08-31 13:00:31 · 1786 阅读 · 1 评论 -
红黑树(基于2-3树等价)
红黑树是一种常见的自平衡二叉查找树,经常使用于关联数组、字典,在各类语言的底层实现中被普遍应用,Java的TreeMap和TreeSet就是基于红黑树实现的。转载 2022-06-28 19:17:36 · 337 阅读 · 0 评论 -
2-3查找树
2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的 两个键之间,右链接指向的2-3树中的键都大于该结点。...原创 2022-06-24 12:40:23 · 1147 阅读 · 3 评论 -
AVL平衡二叉搜索树
AVL树定义如下:是平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树:1. 每个节点的平衡因子只可能是 1、0、-1(绝对值 ≤ 1,如果超过 1,称之为“失衡”)2. 每个节点的左右子树高度差不超过 13. 因为每个结点的高度差不超过1,AVL树搜索、添加、删除的时间复杂度是 O(logn)......原创 2022-06-22 21:25:20 · 333 阅读 · 0 评论 -
零拷贝技术
磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。这次,我们就以「文件传输」作为切入点,来分析 I/O 工作方式,以及如何优化传输文件的性能。为什么要有 DMA 技术?在没有 DMA 技术前,I/O 的过程是这样的:CPU 发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到指令后,于是.转载 2022-03-21 15:20:46 · 254 阅读 · 1 评论 -
一文读懂Jvm垃圾回收机制
Java垃圾回收本文主要摘自《深入理解Java虚拟机》,内容较多,尽量全面概括了 Java 垃圾回收机制、垃圾回收器以及内存分配策略等内容。了解 Java 垃圾回收之前,需要先了解 Java内存区域Java 垃圾回收机制垃圾回收主要关注 Java 堆Java 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由 JIT 编译器进行一些优化),因此这转载 2022-02-21 18:41:43 · 215 阅读 · 0 评论 -
责任链模式(参照netty)
1. 概念讲解责任链模式(Chain of Responsibility Pattern)为请求创建了一个处理对象的链(就好比于工厂的流水线作业一样,工人干完一个程序交由下一个工人进行操作,下一个工人干完后又交由下下一个工人进行操作)。发起请求和具体处理请求的过程解耦:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递。2. 如何实现责任链模式?处理器抽象类:定义了处理请求的接口或者抽象类,提供了处理请求的的方法和设置下一个处理者的方法。具原创 2021-11-05 13:13:09 · 284 阅读 · 1 评论 -
TCP与UDP协议
1. OSI 网络七层模型为使不通计算机厂家的计算机能够互相通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。各层的主要功能低三层物理层:使原始的数据比特流能在物理介质上传输。数据链路层:通过校验、确认和反馈重发等手段,形成稳定的数据链路。(01010101)网络层:进行路由选择和流量控制。(IP 协议)承上启下传输层:提供可靠的端口到端口的数据传输服务(TCP/UDP 协议)高三层会话层:负责建立、管理和终止进程之间的会话和数据交原创 2021-08-25 14:42:54 · 653 阅读 · 3 评论 -
Java Future详解与使用
原文地址:https://dayarch.top/p/java-future-and-callable.html前言创建线程有几种方式?这个问题的答案应该是可以脱口而出的吧继承 Thread 类实现 Runnable 接口但这两种方式创建的线程是属于”三无产品“:没有参数没有返回值没办法抛出异常class MyThread implements Runnable{ @Override public void run() { log.info("my t.转载 2021-04-13 15:39:53 · 3003 阅读 · 4 评论 -
锁升级过程(偏向锁/轻量级锁/重量级锁)
锁的前置知识如果想要透彻的理解java锁的来龙去脉,需要先了解锁的基础知识:锁的类型、java线程阻塞的代价、Markword。锁的类型锁从宏观上分类,分为悲观锁与乐观锁。乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低。每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都是通过C翻译 2021-04-09 13:01:36 · 12854 阅读 · 8 评论 -
Java中long和double的原子性
Java中long和double的原子性java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗?JVM中对long的操作是不是原子操作?首先,通过一段程序对long的原子性进行判断。测试程序如下:public class LongAtomTest implements Runnable { private static long field = 0; private vo转载 2021-04-01 12:51:33 · 579 阅读 · 0 评论 -
用户模式和内核模式(线程级)
用户模式和内核模式区分主要是因为,为了计算机系统的正常安全运行,有些硬件资源(如:中断装置)和特权指令是不可以对用户进程开放的,所以区分了两种模式。内核模式和用户模式内核空间存放的是操作系统内核代码和数据,是被所有程序共享的,在程序中修改内核空间中的数据不仅会影响操作系统本身的稳定性,还会影响其他程序,这是非常危险的行为,所以操作系统禁止用户程序直接访问内核空间。要想访问内核空间,必须借助操作系统提供的 API 函数,执行内核提供的代码,让内核自己来访问,这样才能保证内核空间的数据不会被随意修改,才能原创 2021-03-31 11:46:34 · 8077 阅读 · 6 评论 -
(五) 数据结构 - 归并排序
归并排序归并排序是一种基于分而治之的排序技术。最坏情况下的时间复杂度为O(nlogn),它是最受人尊敬的算法之一。归并排序首先将数组分成相等的两半,然后以排序的方式将它们合并。核心思想为了理解合并排序,我们采用未排序的数组,如下所示我们知道归并排序首先将整个数组迭代地分成相等的一半,除非获得原子值。我们在这里看到一个由8个项目组成的数组分为两个大小为4的数组。这不会...原创 2019-12-08 20:17:20 · 4384 阅读 · 0 评论 -
优雅的处理Exception
在Finally块中清理资源或者使用try-with-resource语句当使用类似InputStream这种需要使用后关闭的资源时,一个常见的错误就是在try块的最后关闭资源。public void doNotCloseResourceInTry() { FileInputStream inputStream = null; try { File file = new File("./tmp.txt"); inputStream = new FileIn转载 2021-02-19 12:37:20 · 1510 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
原文地址:https://www.cnblogs.com/dolphin0520/p/3920397.html在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程工具类,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。一. CountDownLatch用法CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行.转载 2021-01-07 12:50:14 · 3901 阅读 · 0 评论 -
JAVA线程(状态、终止、通信、封闭)
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程状态线程几种状态线程的状态在java中有明确的定义,在java.lang.Thread.State中有6种。New:线程被创建,未执行和运行的时候Runnable:不代表线程在跑,两种:被cpu执行的线程,随时可以被cpu执行的状态。Blocked:线程阻塞,处于synchronized同步代码块原创 2020-08-30 12:48:51 · 4027 阅读 · 2 评论 -
JAVA垃圾回收机制
JAVA 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由 JIT 编译器进行一些优化),因此这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而 Java 堆不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才原创 2020-08-26 13:13:22 · 3990 阅读 · 0 评论 -
JAVA类加载机制
运行时数据区Java的程序要运行需要将编译好的class文件加载到JVM运行时数据区。JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。在虚拟机规范中,这是一个逻辑区划。具体实现根据不同虚拟机来实现。如:oracle的HotSpot在java7中方法去放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理那么class文件是怎么加载进去的?类生命周期在了解类的加载机制之前,我们需要了解一下类的生命周期。Java类从被加载到JVM内存开始,到卸载出内存为止,它的整个原创 2020-08-26 09:51:05 · 3900 阅读 · 0 评论 -
Reactor线程模型
1.Reactor线程模型传统阻塞IO模型存在以下问题:每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源采用阻塞IO模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费针对于存在的问题可以采取以下方案:基于线程池思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理。基于IO复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接...原创 2020-04-09 18:30:26 · 4171 阅读 · 0 评论 -
一文读懂Java NIO模型
Java IO读写原理在操作系统中,程序运行的空间分为内核空间和用户空间。应用程序都是运行在用户空间的,所以它们能操作的数据也都在用户空间。IO共分为两阶段:数据准备阶段(写入内核缓冲区)。内核缓冲区(内核空间)复制数据到用户进程缓冲区(用户空间)阶段。一旦拿到数据后就变成了数据操作,不再是IO操作。内核缓冲区与进程缓冲区缓冲区的目的,是为了减少频繁的系统IO调用。大家都知道...原创 2020-04-08 12:38:59 · 4181 阅读 · 1 评论 -
Java线程安全中的原子性操作
原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割,而只执行其中的一部分(不可中断性)。将整个操作视作一个整体,资源在该次操作中保持一致,这是原子性的核心特征。说到原子性,在Java中一共有两个方面需要学习和掌握一个是JDK中已经提供好的Atomic包,他们均使用了CAS完成线程的原子性操作。另一个是使用锁的机制来处理线程之间的原子性。锁包括synch...原创 2020-04-02 23:13:46 · 4191 阅读 · 0 评论 -
竞态条件与临界区
原文链接:http://ifeve.com/race-conditions-and-critical-sections/在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源...转载 2020-04-02 12:32:34 · 3990 阅读 · 0 评论 -
Happens-Before保证线程可见
前言熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。按照官方的说法:当一个变量被多个线程读取并且至少被一个线程写入时,如果读操作和写操作没有 happens-before 关系,则会产生数据竞争问题。要想保证操作 B 的线程看到操作 A 的结果(无...原创 2020-03-31 21:07:03 · 4171 阅读 · 0 评论 -
理解JIT编译与优化
对Oracle JRockit JVM如何生成、编译、执行代码进行了介绍。不仅仅是“黑匣子”从用户的角度来看,JRockit JVM只是一个黑盒子,它将Java代码“转换”为高度优化的机器代码:将Java代码放入JVM的一端,而另一端则是特定平台的机器代码。揭开黑匣子的盖子时,您会看到在针对特定操作系统优化代码之前采取的不同操作。在代码离开JVM之前,发生了以下的一些操作,数据结构更改...翻译 2020-03-31 13:41:23 · 4226 阅读 · 0 评论 -
Java线程池的使用
为什么要用线程池?线程是不是越多越好?线程在java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+小会时间>执行任务时间就很不合算。java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。操作系统需要频繁切换线程上下文(每个线都想被运行),影响性能。线...原创 2020-03-27 15:44:17 · 3921 阅读 · 0 评论 -
Java接口回调
回调的含义和用途什么是回调?一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类:同步调用、异步调用和回调。同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如 A通知 B后,他们各走各的路,互不影响,不用像同步调用那样, A通知 B后,非得等到 B走完后...原创 2020-01-03 13:48:30 · 8179 阅读 · 0 评论 -
(七) 数据结构 - 最大堆
最大堆堆是一种数据结构,一种叫做完全二叉树的数据结构。排序根据“堆属性”,其决定了树中节点的位置。堆的常用场景: 构建优先队列 支持堆排序 快速找出一个集合中的最小值(或者最大值) 二叉堆(Binary Heap) 二叉堆是一颗完全二叉树 堆中某个节点的值总是大于等于(或小于等于)其子节点, 对应的就是最大堆和最小堆 可以用数组存储二...原创 2019-12-28 20:41:51 · 4809 阅读 · 0 评论 -
(六) 数据结构 - 快速排序
快速排序快速排序是一种排序执行效率很高的排序算法,它利用分治法来对待排序序列进行分治排序,它的思想主要是通过一趟排序将待排记录分隔成独立的两部分,其中的一部分比关键字小,后面一部分比关键字大,然后再对这前后的两部分分别采用这种方式进行排序,通过递归的运算最终达到整个序列有序。核心思想快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sor...原创 2019-12-11 09:12:59 · 5721 阅读 · 0 评论 -
原始Pagination分页实现
本文章主要实现了原始方式和Pagination插件方式实现分页源码放在下面码云地址上。下面是效果图:1.jdbcSqlStudent.jsp页面<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE h...原创 2018-01-28 11:40:27 · 4665 阅读 · 0 评论 -
SpringMvc上传文件
1.引入jar包(添加maven依赖) commons-io commons-io 2.4 commons-fileupload commons-fileupload 1.3.12. springmvc中对多部件类型解析在 页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型原创 2018-01-17 21:58:06 · 4025 阅读 · 0 评论 -
mybatis入门篇(一)
Mybatis通过xml方式或注解方式将需要执行的各种statement(statement、preparedStatemnt、CallableStatement)对象配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架原创 2018-01-08 18:01:33 · 4088 阅读 · 0 评论 -
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
有时,使用idea开发SpringMvc发现调试时出现以下错误:12-Mar-2017 12:08:02.345 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Error configuring application listener of class原创 2018-01-17 13:05:09 · 4396 阅读 · 1 评论 -
SpringMVC基础篇
第一步:创建web工程第二步:导入jar包或者添加maven依赖可参考http://blog.csdn.net/lp284558195/article/details/79056951xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"原创 2018-01-16 17:01:48 · 4012 阅读 · 0 评论 -
hibernate注解开发
Hibernate注解开发在Hibernate中我们一般都会使用注解,这样可以帮助我们大大简化hbm映射文件的配置。下面我就来为大家详细介绍。PO类注解配置首先肯定是搭建好Hibernate的开发环境啦,我在此也不过多赘述,读者自行实践。接着在src目录下创建一个cn.itheima.domain包,并在该包下创建一个Book实体类,由于Book实体类中写有注解配置,所以就转载 2018-01-23 09:16:39 · 4171 阅读 · 1 评论 -
Mybatis逆向工程
逆向工程mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml、po..)使用逆向工程时,需要注意的是表之间的关系无法映射出来!也就是说mybatis的逆向工程生成的都是单表操作 企业实际开发中,常用的逆向工程方式:由原创 2018-01-15 22:02:47 · 3976 阅读 · 0 评论 -
Shiro学习--与SpringMVC整合(数据库,Shiro注解和Shiro标签)
转载于:http://blog.csdn.net/frankcheng5143/article/details/50836619关于Shiro的环境搭建和核心概念参考http://blog.csdn.net/frankcheng5143/article/details/50815495http://blog.csdn.net/frankcheng5143/article/d转载 2018-01-30 18:37:58 · 4117 阅读 · 0 评论 -
在jsp中引用Shiro(二)
首先,推荐一套完整的Shiro Demo,免费的。Shiro Demo:http://www.sojson.com/shiro 在页面上使用shiro标签的时候,会自动触发MyShiroRealm类中的用户授权方法doGetAuthorizationInfo,即在加载页面的时候,如果发现页面上有使用shiro标签(不是引入标签库的时候),那么,会返回回去先执行doGetAuthorizat原创 2018-01-30 18:30:22 · 5804 阅读 · 0 评论 -
Shiro安全框架(一)
一、框架介绍Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。下面是Shiro功能简介:Authentication:身份认证/登录,验证原创 2018-01-30 17:55:17 · 4643 阅读 · 0 评论 -
Spring框架入门篇(四)
事务管理非注解方式xml version="1.0" encoding="UTF-8"?>xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.原创 2018-01-15 11:14:10 · 3909 阅读 · 0 评论 -
maven配置Spring mvc(详细)
Maven配置springMvcxmlns="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 http://maven.apache.o原创 2018-01-14 15:40:34 · 4861 阅读 · 0 评论