自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

yinweicheng的博客

如有错误,敬请指正,我会修改的

  • 博客(40)
  • 资源 (4)
  • 问答 (1)
  • 收藏
  • 关注

原创 Mybatis和Spring源码解析

内容实在太多,不在做搬运,本人原文:https://shiker.tech/s/yuan-ma-jie-xi-xi-lie。最近看代码总结了一下,各位朋友可以看看是否更便于理解了。

2023-06-10 10:18:56 132

原创 maven拆分ssh项目之文件通配符

今天用maven对之前做过的一个springMVC+spring+hibernate项目进行了拆分,在拆分时文件通配符这个东西弄的有点儿懵。。。经过几个小时的调试,终于将通配符弄明白了,话不多说,先看项目目录:雷区一-----spring中的classpath将ssh项目拆分时,spring的配置文件也随之进行拆分。但是spring中依赖的个properties、xml文件依旧在子项目中,因此不需...

2022-01-23 23:51:18 313

原创 理解和对比BIO、NIO、AIO的特性

示例代码:https://gitee.com/shiker/Stream同步阻塞式--BIO一个客户端(连接)对应一个线程,只有一个服务线程为每个连接分配处理线程缺点:缺乏弹性伸缩能力,服务端与客户端并发访问数呈1:1的正比关系,并发访问量过大,系统会产生线程堆栈溢出,创建新线程失败的问题,导致宕机或者僵死,不能对外提供服务。核心代码实例:TimeServerTimeServerHandler:T...

2022-01-23 23:51:10 445

原创 spring整合hibernate获取currentSession

首先,在spring中配置hibernate的数据源和sessionfactory工厂<!-- 配置组件扫描器 --> <context:component-scan base-package="edu.hrbeu" /> <!--扫描配置文件(这里指向的是之前配置的那个config.properties) --> <context:prop...

2022-01-23 23:50:58 1244

原创 jvm运行时数据区与内存管理机制

提纲运行时内存区域 1.程序计数器 1. 当前线程所执行的字节码的行号指示器。 2. 如果线程郑在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器的值则为空。 3. 此内存区域是唯一一个在Java虚拟机规范中没有定义任何out of memory情况的区域 2. Java虚拟机栈 1. 每个方法在执行时都会创...

2022-01-23 23:50:48 221 2

原创 自己动手在Cent OS6.9上编译OPENJDK

之前看jvm的时候就尝试编译一下jdk(为什么要自己编译openjdk呢,一方面可以帮助我们了解jvm的运行机制,另一方面我们可以得到jdk的debug版本,而debug版本的调试工具更丰富),但是时间有限,没成功之后也没再管(考试周。。。==||),今天终于有时间把这个坑补上了。看网上都是ubuntu上编译的jdk,为了不雷同,就换个环境吧。没想到换了个环境之后各种坑都有遇上了,实际上并不一帆风...

2022-01-23 23:50:29 328

原创 jvm垃圾收集器与内存分配策略

提纲判断对象的存活状态垃圾收集主要区域:Java堆和方法区。因为只有在程序运行时才能知道创建哪些对象,所以这部分的内存分配和回收都是动态的。1.引用计数算法:定义:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器值就减1;任何时候计数器为0的对象是不可能在被使用的。 优点:实现简单,判定效率高。 缺点:很难解决对象之间相互循环引用的问...

2022-01-23 23:50:19 255 1

原创 JVM故障诊断与性能优化--运行时数据区(一)

Java对象之家--Java堆java堆一般被分为新生代和老年代。其中新生代存放新生对象,老年代存放老年对象(年龄判断见深入理解jvm二),新生代有可能分为eden区,s0区,s1区,s0和s1区也被称为from区和to区,他们是两块大小相等、可以互换角色的内存空间(实际上是为了进行垃圾回收,即复制算法)。下面通过示例展示java堆、方法区、java栈之间的关系:public class Simp...

2022-01-23 23:49:47 363

原创 esplise更新maven报错java.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52

当点击maven进行更新(主要是war工程)时,有时会遇到下面异常:原因:maven默认使用jdk1.5进行项目编译,而我们所需要的jar或者tomcat需要更高版本的jdk,也就是说maven默认的环境达不到项目要求。此处的原因是因为工作环境默认选择用jdk1.8(52.0)进行编译,而spring版本不支持1.8,所以出现错误解决方法:在maven仓库的配置文件(conf/setting.xm...

2022-01-23 23:49:34 281

原创 springboot整合ssm项目纪实

昨天学完了springboot,感觉没什么困难,好多东西都是spring简化来的,今天于是就上手将自己之前写过的一个spring项目进行改进,改进到springboot项目,没想到还是遇到各种突发bug。哎,还是写一些,让后人少采坑吧。注意:我的maven编译是jdk1.8,注意修改!!详情戳:https://blog.csdn.net/yinweicheng/article/details/...

2022-01-23 23:49:23 731

原创 JVM故障诊断与性能优化--jvm参数了解(二)

跟踪垃圾回收和类加载信息1.跟踪垃圾回收示例---读懂日志:package chapter3;/** * 创建实例,演示垃圾回收,进行4次minorGC * * @author shiker * 预设参数:-verbose:gc -Xms20M -Xmx20M(设置堆容量为20M) -Xmn10M(新生代容量10M) -XX:SurvivorRatio=8(survivor占比8:...

2021-12-18 21:29:31 610

原创 虚拟机性能监控与故障处理

提纲JDK的命令行工具1.进程状况查看工具jps -l输出主类的全名 Jps -q省略主类的名称 Jps -m输出进程启动时传递给主类main()函数的参数 Jps -v输出进程启动时jvm的参数2.虚拟机统计信息监视工具jstat [ option vmid [interval(查询间隔)[s|ms] [count(次数)]] ]例:C:\U...

2021-12-18 21:29:13 433

原创 JVM故障诊断与性能优化--垃圾回收概念与算法(三)

认识垃圾回收垃圾:指的是存在于内存中的、不会再使用的对象。如果垃圾不会收会占用大量内存导致内存溢出。常用的垃圾回收算法1.引用计数法只要有其它对象引用了此对象,该对象的引用计数器+1,当引用失效时计数器-1。当计数值为0时,对象就可能不再使用。缺点:无法处理循环引用的情况,加法操作和减法操作对系统性能有影响。2.标记清除法标记阶段,首先通过根节点,标记所有根节点...

2021-12-18 21:28:57 136

原创 JVM调优分析与实战

提纲案例分析1. 高性能硬件上的部署策略 在高性能硬件上部署程序,目前主要有两种方式: 通过使用64位JDK来使用大内存 使用若干个32位虚拟机建立逻辑集群来利用硬件资源。使用64位JDK来使用大内存的缺点:1. 内存回收导致的长时间停顿2. 现阶段,64位JDK的性能测试效果普遍低于32位JDK3. 需要保证程序足...

2021-12-18 21:28:42 239

原创 JVM故障诊断与性能优化-垃圾收集器与内存分配(四)

1.垃圾收集器相关概念见:深入理解jvm--垃圾收集器与内存分配策略(二)垃圾收集器的开关 参数 新生代使用的GC 老年代使用的GC -XX:+UseSerialGC serialGC serialOldGC -XX:+UseParNewGC ...

2021-12-18 21:28:21 386

原创 JVM故障诊断与性能优化-性能监控工具(五)

Linux下的性能监控工具1.显示系统整体资源使用情况-top命令2.监控内存和CPU-vmstat命令vmstat 1 3示例1--使用vmstat查看java程序占用内存情况package chapter6;import java.util.Random;//去package名放入linux中运行public class HoldLockMa...

2021-12-18 21:28:08 161

原创 反射、内省与动态代理

反射:jdk中关于对java.util.reflect的叙述:提供类和接口,以获得关于类和对象的反射信息。在安全限制内,反射允许编程访问关于加载类的字段、方法和构造方法的信息,并允许使用反射字段、方法和构造方法对其底层对等项进行操作。Class类没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。Method...

2021-12-18 21:27:54 146

原创 jvm类文件结构

提纲无关性的基石字节码构成了平台无关性的基石虚拟机和字节码存储形式是语言无关性的基础Class文件的结构无符号数:属于基本的数据类型,以u1、u2、u4、u8来分别代表一个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用描述数字、索引应用、数量值或者按照UTF-8编码构成字符串值。表:是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以...

2021-12-18 21:27:36 110

原创 jvm类加载机制

提纲类加载的时机类的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。加载、验证、准备、初始化和卸载顺序确定。虚拟机规范严格规定了有且只有5种情况必须立即对类进行初始化:1. 遇到new、getstatic、putstatic或invokestataic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的代码场景是:使...

2021-12-18 21:27:24 104

原创 jvm字节码执行引擎

提纲运行时栈帧结构栈帧是用于支持虚拟机进行方法调用个方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始到执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,成为当前栈帧,与这个栈帧相关联的方法称为当前方法。执...

2021-12-18 21:26:49 300

原创 jvm类加载与执行子系统

提纲案例tomcat:正统的类加载器结构web服务器要解决的问题:部署在同一个服务器上的两个web应用程序所使用的java类库可以实现相互隔离。部署在同一个服务器上的两个web应用程序所使用的java类库可以实现共享。服务器需要尽可能的保证自身的安全不受部署的web应用程序影响。支持jsp应用的web服务器,大多数需要支持hotspot功能。java类库放置在t...

2021-12-15 23:09:59 163

原创 jvm类的早期优化

提纲概述java编译器分类:前端编译器:把*.java文件转变成*.class文件的过程后端运行期编译器(JIT编译器):把字节码转变成机器码的过程静态提前编译器(AOT编译器):把*.java文件编译成本地机器码的过程javac编译器编译过程:解析与填充符号表词法分析:将原代码的字符流转变为标记(Token)集合。程序编写的最小元素是单个字符,编译过程的最小元素是标记。关键字、变量名...

2021-12-15 23:09:47 108

原创 jvm晚期优化

提纲即时编译器解释器与编译器解释器优点:解释执行节约时间编译器优点:编译执行提高效率即时编译器:将热点(运行频繁的)代码编译成与本地平台相关的机器码,并进行各层次的优化。完成这个任务的编译器成为即时编译器。hotspot虚拟机内置两个即时编译器,client compiler和server compiler,简称为C1编译器和C2编译器。hotspot会根据自身版本与宿主机的性能自行选择运行模式。...

2021-12-15 23:09:33 135

原创 java内存模型

提纲Java内存模型设计规则:这个模型必须定义的足够严谨,才能让java 的并发访问操作不会产生歧义,也必须定义的足够宽松,使虚拟机有足够的自由空间去利用硬件的各种特性来获取更好的执行速度。主内存与工作内存Java内存模型的主要目标时定义程序中各个变量的访问规则,即在虚拟机中将变量(不包括局部变量和方法参数)存储到内存和从内存中取出变量这样的底层细节。Java内存模型规定了...

2021-12-15 23:09:15 131

原创 线程安全与锁优化

提纲、1. 锁的基本概念和实现线程安全面向过程的编程思想:把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理数据。面向对象的编程思想:站在现实世界的角度去抽象和解决问题,把数据和行为都看做是对象的一部分。当多个线程访问一个对象时,如果不用考虑这些线程在运行环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其它的协调操作,调用...

2021-12-15 23:09:01 262

原创 通过dubbo对ssh进行整合

最近学完了maven和dubbo,在将之前的项目进行整合拆分成maven+dubbo的时候,遇到了很多麻烦,在这里将步骤粗略的写一下。以方便其他人或者日后在遇到此类问题。由与篇幅较长,本片先写maven拆分子项目。项目demo:https://gitee.com/shiker/bookstore整合后的项目(maven拆分+dubbo):https://gitee.com/shiker/b...

2021-12-15 23:08:40 304

原创 jvm故障诊断与性能优化(六)--分析Java堆

找到内存溢出的原因1.堆溢出当对象的大小之和大于由Xmx指定的堆空间大小时,会发生溢出错误。示例1--堆溢出(8G内存环境下)public class SimpleHeapOOM { public static void main(String[] args) { ArrayList<byte[]> list = new ArrayList<byte...

2021-12-15 23:08:20 505 1

原创 AOP的底层实现--ASM

在ASM的核心组件中,Opcodes接口定义了一些常量,尤其是版本号、访问标识符、字节码等信息。ClassReader用于读取Class文件,它的作用时进行Class文件的解析,并可以接受一个ClassVisitor,ClassReader会将解析过程中产生的类的部分信息,比如访问提示符、字段、方法逐个送入ClassVisitor,Class Visitor在接受到对应的类信息后,可以进行各自的处...

2021-12-15 23:08:07 344

原创 hadoop--环境搭建

搭建Hadoop需要的基本条件要有虚拟机,我用的时vm14pro,linux版本用的是centOS6.9。jdk版本用的是jdk1.7。为了方便配置,我们第一步应该先配置主机名和映射,防止在配置yarn配置文件的主机名时找不到相关映射。修改主机名和映射查看网卡配置:[cent@localhost etc]$ cd /etc/sysconfig/network-scripts/[cent@loca...

2021-12-15 23:07:38 386

原创 IntegerCache、longCache缓存策略与String.intern()用法说明

一道经典面试题:public class Main { private Integer a = 123; private Integer b = 128; private Long c = 123L; private Long d = 1000L; String str = "abc"; public static void main(String[] args) { Mai...

2021-12-15 23:07:11 279

原创 字节码角度看异常处理与线程安全

从字节码看异常处理举例,有如下方法,问该方法返回值为多少?public int a() { try { return 1; } catch (Exception e) { return 2; } finally { return 3; }}这道问题大部分都容易把返回1,还是返回3弄混了,我们通过jclasslib查看该方法的字节码:0 goto 8 (+8...

2021-12-09 22:43:49 123

原创 从字节码角度看对象创建与参数传递

对象的创建上篇文章从字节码的角度分析了异常处理和线程安全中的原子性,现在我们再从字节码的角度看一下对象的创建是一个怎样的过程,先从一简单的面试题开始。假如有如下方法:public String string() { String str = new String("abc"); return str;}问整个方法用到了哪些运行时数据区域?看到这道题,大...

2021-12-09 22:43:20 260

原创 JDK1.8源码解析-ArrayList

关系图可以看到,ArrayList继承了AbstractList,而AbstactList有继承了AbstractCollection,实现了list。并且ArrayList实现了Cloneable支持对象的克隆,也实现serializable支持序列化。内置属性:private static final long serialVersionUID = 868345258112...

2021-12-09 22:42:59 154

原创 JDK1.8源码解析-CopyOnWriteArrayList

类关系图属性因为CopyOnWriteArrayList最主要的功能是实现写时复制,而实现写时复制的关键就是要在实现在并发情况下数据的遍历与修改能够同步进行,这就需要通过可重入锁实现修改时的数组同步。/** 保护所有存取器的锁 */final transient ReentrantLock lock = new ReentrantLock();/** 只能通过 get...

2021-12-09 22:42:28 182

原创 leetcode--不同的二叉搜索树

不同的二叉搜索树给定一个整数n,求以1 ...n为节点组成的二叉搜索树有多少种?生成所有由 1 ...n为节点所组成的二叉搜索树。示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ ...

2021-12-09 22:42:06 205

原创 JDK1.8源码解析-HashMap.TreeNode

在JDK 1.8 以前 HashMap 的实现是数组+链表,哈希函数很难保证元素的均匀分布。当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。针对这种情况,JDK 1.8 中引入了 红黑树(查找时间复杂度为 O(logn))来优化这个问...

2021-12-09 22:41:51 590

原创 JDK1.8源码解析-HashMap

jdk1.8对hashmap进行了优化,1.8之前hashmap的构成是由数组和链表组成的,而jdk1.8则对bucket容器中的元素结构进行了优化,若使用链表则在大量元素进行查找时会降低效率。我们不妨从它的源码入手,了解jdk1.8对hashmap所作的优化。---------------------------------------------------------------更新...

2021-12-09 22:41:29 256

原创 JDK1.8源码解析-LinkedList

类关系图类属性//列表大小transient int size = 0;/** * 首节点指针 */transient Node<E> first;/** * 尾节点指针 */transient Node<E> last;private static class Node<E> { E item;//结点中的元素...

2021-12-09 22:41:04 232

原创 JDK1.8源码解析-AbstractQueuedSynchronizer

AQS是jdk中锁机制的重要框架,我们在通过继承AQS,进行队列的操作时,方法的作用位置大体如下:Api中对该类的描述如下:为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。此类的设计目标是成为依靠单个原子 int 值来表示状态的大多数同步器的一个有用基础。子类必须定义更改此状态的受保护方法,并定义哪种状态对于此对象意味着被获取或被释放...

2021-12-09 22:40:46 829

原创 JDK1.8源码解析-ReentrantLock

上一篇文章我们分析了AQS的原理及源码,在开始解读ReentrantLock之前我们先来回顾以下之前学习的AQS的常用方法。等待线程获取资源的方法:public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE),...

2021-12-09 22:39:38 295

eclipse启动时间源码

sclipse启动时间源码,java虚拟机调优时用到,方便学习

2018-01-15

eclipse启动时间插件

eclipse启动时间插件,可查看eclipse启动时间,放到plugins里即可

2018-01-15

mybatis离线说明文档

mybatis说明文档

2017-08-17

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

TA关注的人

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