![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 73
NO0b
小白
展开
-
mybatis 一级缓存二级缓存要点
惯例,不介绍概念,这里记录需要记录的要点: 缓存通过HashMap实现 一级缓存作用域是sqlSession,默认开启,在高并发或者分布式(每个节点有自己的缓存)的情况下会产生脏数据。所以建议 一级缓存级别调成 statement,每次查询结束都会清掉一级缓存 mybatis集合spring一级缓存失效问题:https://www.cnblogs.com/zemliu/...原创 2019-09-20 09:37:29 · 186 阅读 · 0 评论 -
可承载千万级用户的 RPC框架结 构详解
RPC(Remote Promote Call): 一种进程间通信方式。允许像调用本地服务一样调用远程服务。RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式(XML/JSON/二进制)和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。RPC结构图如下:...原创 2018-12-03 23:02:17 · 310 阅读 · 0 评论 -
并发与并行的区别
只是一个概念问题, 并不是很复杂, 网络上大多数的解释是:并发(concurrency):指应用能够交替执行不同的任务例:吃完饭-->喝口水-->继续吃饭-->再喝口水-->再吃饭......这时候时候就算是喝水和吃饭并发执行并行(parallellism):指应用能够同时执行不同的任务例:吃饭的时候边吃饭边打电话,这两件事情可以同时执行这...原创 2018-12-12 21:45:07 · 325 阅读 · 0 评论 -
JVM----G1垃圾收集器
本篇来自周志明的<<深入理解java虚拟机>>G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一,早在JDK 1.7刚刚确立项目目标,Sun公司给出的JDK 1.7 RoadMap里面,它就被视为JDK 1.7中HotSpot虚拟机的一个重要进化特征。从JDK 6u14中开始就有Early Access版本的G1收集器供开发人员实验、试用,由此...原创 2018-12-08 23:49:35 · 201 阅读 · 0 评论 -
JVM----CMS垃圾收集器
本篇来自周志明的<<深入理解java虚拟机>>CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。从名字(包含“Mark Sweep”...原创 2018-12-08 23:31:22 · 268 阅读 · 0 评论 -
JVM----根节点的枚举, 安全点与安全区域
本篇来自周志明的<<深入理解java虚拟机>>枚举根节点 以可达性分析中从GC Roots 节点找引用链这个操作为例,可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在的很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间。 另外,可达性分析对执行时间的敏感还体现...原创 2018-12-08 22:45:49 · 815 阅读 · 1 评论 -
JVM----JVM 垃圾收集算法
本篇来自周志明的<<深入理解java虚拟机>>标记-清除算法标记-清除(Mark-Sweep)算法是最基础的算法,就如它的名字一样,算法分为”标记”和”清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。它主要有两个缺点:一个是效率问题,标...原创 2018-12-08 22:29:15 · 143 阅读 · 0 评论 -
JVM----关于方法区的垃圾回收
本篇来自周志明的<<深入理解java虚拟机>>很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区中进行垃圾收集 的“性价比” 一般比较低:在堆中 ,尤其是在新生代中,常规应用进行一次垃圾收集一般可以回收70%〜95%的空间,而永久代的垃圾收集效率远低于此。永久代的垃圾...原创 2018-12-08 22:08:07 · 1251 阅读 · 0 评论 -
JVM----对象回收过程: 记一次对象的自我救赎
本篇来自周志明的<<深入理解java虚拟机>>预备知识: 如何判定对象存在活引用? https://blog.csdn.net/q5706503/article/details/84899581即使在可达性分析算法中不可达的对象,也并非是“非死不可”的 ,这时候它们暂时处于“缓刑” 阶段 ,要真正宣告一个对象死亡 ,至少要经历两次标记过程 : 如 果对象在进行可达性...原创 2018-12-08 22:05:01 · 354 阅读 · 0 评论 -
JAVA----四种引用: 强软弱虚
本篇来自周志明的<<深入理解java虚拟机>>无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。在JDK 1.2以前,Java中的引用的定义很传统 :如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种...原创 2018-12-08 21:59:17 · 210 阅读 · 0 评论 -
JVM----判断对象是否存活 : 引用计数算法OR可达性分析算法?
本篇来自周志明的<<深入理解java虚拟机>>在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着 ,哪些已经“死去”(即不可能再被任何途径使用的对象)。引用计数算法很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有—个地方引用它时,计数器值就加1 ; 当引用失效时...原创 2018-12-08 21:54:47 · 274 阅读 · 0 评论 -
利用 反射 检查类的结构 Class类和java.lang.reflect包的使用 ( 含demo )
先上运行效果: 输入我们想分析检查的类(全类名, 带包名), 以java.lang.Double为例可以看到Double类的结构一览无余,无论公有私有 是否为final和static, 即使native的本地方法都被我们的火眼金睛发现了, 这就是java反射机制的威力, 其实更可怕的是反射不仅仅用于编译程序时可以使用的类, 更多的是在程序运行的时候动态地分析类的结构并创建实例, 再通...原创 2018-12-08 15:56:12 · 2261 阅读 · 0 评论 -
Java多线程notify/notifyAll唤醒的是谁
涉及JAVA线程的状态问题, 不清楚的可以参考我的另一篇:https://blog.csdn.net/q5706503/article/details/84350887我们知道notify是Object的本地final方法,无法被重写, 用来唤醒线程, 那么该怎么用, 唤醒的又是谁呢?用一句话做答复 : notify唤醒的是其所在锁所阻塞的线程不理解看下面的分析和例子:wait...原创 2018-11-28 20:51:45 · 9349 阅读 · 9 评论 -
Direct Memory堆外内存
JVM可以使用的内存分外2种:堆内存和堆外内存. 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。 使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。作为JAVA...原创 2018-11-28 19:44:00 · 6526 阅读 · 0 评论 -
序列化和反序列化
把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。序列化的目的:1、以某种存储形式使自定义对象持久化;2、将对象从一个地方传递到另一个地方。3、使程序更具维护性。应用:对象的序列化主要有两种用途:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 在网络上传送对象的字节序列。在很多应用中,需要对某些对象进行序列化,让它...原创 2018-12-01 19:16:58 · 207 阅读 · 0 评论 -
JAVA中String.intern的理解
intern() 方法返回字符串对象的规范化表示形式。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。What---String.intern方法究竟做了什么:Returns a canonical representation for the string obje...原创 2018-11-28 17:53:15 · 2486 阅读 · 2 评论 -
JDK1.8关于运行时常量池, 字符串常量池的要点
网上关于jdk 1.8的各种实验, 结论鱼龙混杂 , 很多都相矛盾,网上有的实验也被后人测试出了不同的结果很多都分辨不了真假, 这里记录一下网络上正确的结论, 欢迎指正!首先自行区分运行时常量池与Class文件常量池(静态常量池)的概念, JVM内存模型 ,方法区与永久代的区别, 有些在我的其他博客有介绍, 连接在文尾在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在...原创 2018-11-29 22:53:13 · 28538 阅读 · 45 评论 -
通俗易懂happens-before理解
在JMM(JAVA内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happensbefore关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。 happen...原创 2018-12-13 23:02:28 · 4560 阅读 · 1 评论 -
JAVA----静态方法上加锁 和 非静态方法加锁 区别
Synchronized修饰非静态方法,是对调用该方法的对象加锁,俗称“对象锁”。这里的对象加锁并非是说执行该加锁方法的时候整个对象的所有成员都不允许其他线程访问了,而是说该对象内所有的加锁的非静态方法共用这一把锁, 一个加锁非静态方法执行, 另一个加锁非静态方法不能执行,要等持有锁的线程释放锁, 不同对象之间的方法不互相作用这里举第一个例子:两个线程执行同一个对象的不同加锁非静态...原创 2018-12-14 00:24:15 · 8049 阅读 · 2 评论 -
可达性分析算法中,哪些可以作为 root?
java垃圾回收的可达性分析算法, 列举可以作为root的对象:由于网上的博客回答都不全, 找了份来自help.eclipse.org的, 先上原文与连接供大佬参考, 后边挂上垃圾翻译, 不接受关于翻译的质疑! (认真脸)https://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%...原创 2019-03-16 17:59:19 · 1956 阅读 · 0 评论 -
sql语句正确mybatis查找不出结果不报错----映射关系不能加表名.列名
问题描述:项目中需要多表查询时相同的列起了别名, 在mybatis中查询无法得到left join的表中对应信息, 只有主表的信息在数据库中直接测试sql语句排除了语句问题, 也没有报错, 所以不是哪里敲错了最后关注在别名的问题上, 发现mybatis的映射关系中列名有别名必须用别名, 不能用表名. 列名的形式, 否则不会报错但就是查询不到该表的结果省略了很多无关列, 用一列说...原创 2019-01-19 16:51:36 · 2592 阅读 · 0 评论 -
Mybatis中and和循环or混用 (or转换成in)
这次项目用到一个and和or混用的场景 , 因为用到多个or(循环), 没想到好的办法最终转换成用 IN实现:场景:用left join链接多个表, 多个条件and筛选, 其中状态(state)条件筛选出多个可选状态的条目,本来想用and 和 or 但是 or的条件是个数组参数, 需要遍历states , 可能0个可能多个, 拼了半天没有成功 , 最后发现用 IN 和FOREACH...原创 2019-01-19 14:14:40 · 14007 阅读 · 1 评论 -
Java并发编程----ThreadLocal详解
ThreadLocal是什么首先,它是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量, 在高并发场景下,可以实现...原创 2019-01-03 14:19:03 · 2196 阅读 · 0 评论 -
java中 Map, List与Set的 区别和联系
集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引(reference)。集合的主要分为三种类型:Set(集) List(列表) Map(映射)三者关系Collection├List│ ├LinkedList│ ├ArrayList│ └Vector│ └Stack└SetMap...原创 2018-12-24 16:52:25 · 2183 阅读 · 0 评论 -
Java中 ( Iterator ) 迭代器 详解 ( JDK8源码 )
Java集合框架的集合类,我们有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作...原创 2018-12-24 12:18:58 · 3041 阅读 · 1 评论 -
JVM----重载 与 重写的本质 : 分派
本篇来自周志明的<<深入理解java虚拟机>>众所周知,Java是一门面向对象的程序语言,因为Java具备面向对象的3个基本特征:继承、封装和多态。本节讲解的分派调用过程将会揭示多态性特征的一些最基本的体现, 如“重载”和“重写”在Java虚拟机之中是如何实现的,这里的实现当然不是语法上该如何写, 我们关心的依然是虚拟机如何确定正确的目标方法。1.静态分派在开始...原创 2018-12-18 10:32:27 · 576 阅读 · 1 评论 -
Java语言是" 解释执行" 的语言吗
本篇来自周志明的<<深入理解java虚拟机>>许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,在本章中,我们先来探讨一下在解释执行时,虚拟机执行引擎是如何工作的。解释执行Java语言经常被人们定位为“解释执行”的语言,在Java初生的JDK 1.0时代 ,这种定义还算是比较准...原创 2018-12-22 11:50:14 · 3498 阅读 · 0 评论 -
单例模式 的 双重检查锁定 错在哪?
在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的错误根源 。双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化(单例)。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出...原创 2018-12-27 17:50:15 · 2132 阅读 · 0 评论 -
ConcurrentHashMap详解 ( JDK6,7,8 区别 )
线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环(导致CPU利用率接近100%), 数据丢失等情况 , HashMap是线程不安全的 ,所以在并发情况下不能使用HashMap。关于HashMap参考:https://blog.csdn.net/q5706503/article/details/85123141效率低下的HashTable容器...原创 2018-12-21 22:19:19 · 2997 阅读 · 0 评论 -
HashMap详解( JDK8 之前与之后对比)
HashMap简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。HashMap 的实例...原创 2018-12-21 19:23:12 · 3066 阅读 · 0 评论 -
JVM----类加载的过程
本篇来自周志明的<<深入理解java虚拟机>>上一篇介绍了类加载的时机:https://blog.csdn.net/q5706503/article/details/85012392这篇详细讲解一下 Java 虚拟机中类加载的全过程,也即是加载、验证、准备、解析和初始化这 5 个阶段所执行的具体动作加载 “加载” 是 “类加载”(Class L...原创 2018-12-15 17:11:10 · 281 阅读 · 0 评论 -
JVM----类加载的时机
本篇来自周志明的<<深入理解java虚拟机>>类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析三个部分统称为连接(...原创 2018-12-15 11:20:35 · 1590 阅读 · 1 评论 -
Java中Map的 entrySet() 详解以及用法(四种遍历map的方式)
Entry由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系。 Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也就是一个Entry)Map.Entry里面包含getKey()和getValue()方法Iterator<Map.Entry<Integer, Integer>> ...原创 2018-12-20 15:09:52 · 154030 阅读 · 17 评论 -
java 代理的原理与实现
Java中的动态代理,涉及到一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。静态代理静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成静态代理简单实现静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将...原创 2018-12-14 17:10:28 · 382 阅读 · 0 评论 -
深入理解 hashcode() 和 HashMap 中的hash 算法
前言Java中的HashMap非常常用也非常重要, 提到HashMap是离不开hashcode()方法的, 整天嘴边挂着HashMap、Hashtable、TreeMap、LinkedHashMap、IdentityHashMap、ConcurrentHashMap和WeakHashMap等词, 也许用起来简单, hash的原理也很简单, 经常不以为然, 但是细想下来总觉得有哪里有疑惑, 这里...原创 2018-12-20 12:09:13 · 19262 阅读 · 3 评论 -
JVM 1.8 永久代---元空间 的变动
介绍JVM的内存模型的博客:https://blog.csdn.net/q5706503/article/details/84614158JDK8 HotSpot JVM 将移除永久区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)以下是JVM内存模型中方法区的变动1.新生代:Eden+From Survivor+To Survivor2.老年代:OldG...原创 2018-11-29 19:07:25 · 10997 阅读 · 4 评论 -
JAVA中 try - finally 与return的爱恨情仇
首先看finally :无论try语句发生了什么,无论抛出异常还是正常执行。finally语句都会执行。先看一个现象: public class TestMain { public static void main(String[] args) { System.out.println( test() ); } public static String test() ...原创 2018-11-26 15:31:40 · 8830 阅读 · 2 评论 -
什么是Java字节码?
什么是Java字节码?它是程序的一种低级表示,可以运行于Java虚拟机上。将程序抽象成字节码可以保证Java程序在各种设备上的运行Java号称是一门“一次编译到处运行”的语言,从我们写的java文件到通过编译器编译成java字节码文件(.class文件),这个过程是java编译过程;而我们的java虚拟机执行的就是字节码文件。不论该字节码文件来自何方,由哪种编译器编译,甚至是手写字节码文件...原创 2018-11-18 22:10:14 · 12943 阅读 · 0 评论 -
JAVA中Forward和Redirect的区别
Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。用户向服务器发送了一次HTTP请求,这个请求可能被直接请求转发(Forward)和间接请求转发(Redirect),两种转发方式有何区别呢?直接转发就相当于:“A找B借钱,B没有,B去找C借,并告诉C把钱给A”间接转发就相当于:"A找B借钱,B没有,告诉A去找C借" 直接转发方式(Forward)客...原创 2018-11-18 19:01:41 · 1951 阅读 · 0 评论 -
Cannot switch on a value of type String for source level below 1.7. Only
switch语句的判断条件可以接受int,byte,char,short,不能接受其他类型只有JDK版本1.7以上才可以支持String你可能会说我的jdk是1.7以上啊,这里说的版本是java解释器的版本,eclipse修改办法:项目右键 > project > properties > java compiler > compiler> c...原创 2018-11-05 11:15:41 · 3902 阅读 · 1 评论