- 博客(31)
- 资源 (1)
- 收藏
- 关注
原创 zookeeper的Java API模拟服务注册与发现
zookeeper的Java API模拟服务注册与发现构建服务提供者构建server1复制一份创建 server2创建服务消费者`Main`构建服务提供者构建server1/** * 返回唯一的zookeeper实例 * @author sheledon */public class ZkFactory { private static final int sessionTimeout = 7000; private static volatile ZooKeeper zkC
2021-05-04 16:38:28 258
原创 一文带你刨析class文件,反正学医的老同学是听懂了
一文带你认识class文件Write Once , Run AnyWherejava如何实现跨平台?为啥C程序不能跨平台?hello.cpp#include<stdio.h>int main(){ printf("Hello World\n"); return 0; } 下面是这个c程序的执行过程预处理会将hello.cpp文件中通过include引入的头文件插入到程序文本中,得到hello.i文件编译器将hello.i中的C代码翻译成汇编指令,得到文件hel
2020-10-04 14:24:28 297
原创 JVM运行时数据区域之最终章
JVM运行时数据区域之最终章JVM运行时数据区域之java虚拟机栈JVM运行时数据区域之程序计数器堆什么是堆堆是java运行时数据区域中最大的一块内存,与栈不同,堆是被所有线程所共享的数据区域;在java中几乎所有的对象都在堆上面分配内存,即大多数对象都存放在堆中,注意这里说的“大多数”,下面会提及为何是大多数。GC堆?堆也被称之为是GC堆,因为堆是java垃圾回收器管理的内存区域,因为有垃圾回收器所以java程序员才不用向C和C++程序员那样管理释放内存。也正是因为垃圾回收,所以堆
2020-09-27 00:06:29 283
原创 外行人都懂的单点登录,不看血亏!!!!
什么是单点登录单点登录的英文名 Single Sign On (SSO)。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。比如说淘宝和天猫都是阿里巴巴的子系统,在网页端,我们登录了淘宝,那么天猫也会自动登录;反之相同。下面看一下单点登录的大概的设计如上SSO的关键就是SSO认证中心,所有的子系统通过与SSO交互实现了一端登录其他端自动登录。单系统登录设计与实现在了解多系统SSO设计与实现之前我们先来看一下单系统登录的设计与实现在初学servlet和jsp的时
2020-09-23 22:15:32 456
原创 JVM系列之java虚拟机栈
JVM系列之java虚拟机栈tip:上面讲了JVM运行时数据区域的程序计数器器(PC),这篇文章带大家走进JVM的运行时数据区域JAVA虚拟机栈啥是java虚拟机栈 java虚拟机栈和程序计数器一样也是线程私有的,生命周期和线程相同;它是Java方法执行的线程内存模型。当一个方法被执行的时候,java会同步创建一个栈帧,这里的栈帧就是栈的元素;每一个栈帧包含局部变量表,操作数栈,动态连接,方法返回地址等信息,一个方法从开始到执行结束对应着虚拟机栈中一个栈帧的入栈和出栈。下面放一张图让大家直观的理
2020-09-16 21:29:53 160
原创 JVM热身之程序计数器
JVM运行时数据区域之程序计数器Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来-----------《深入理解java虚拟机》在用C编程的时候,我们malloc一块空间总是需要手动进行free,不然就会造成内存泄露即使用过的内存没被释放,造成内存不够用了;而在Java中,垃圾回收器会自动帮我们回收在后台回收那些不再“使用”的内存,所以在Java编程中不容易出现内存泄露和溢出的问题。但是一旦出现例如java.lang.OutOfMemoryE
2020-09-14 11:12:18 210
原创 类加载概述
加载加载过程主要完成以下几件事情类加载器根据类的全限定名获取类的二进制字节流将二进制字节流表示的静态结构转换为方法区的运行时数据结构在堆上面实例化一个该类的Class对象,作为方法区这个类的各种数据访问的入口验证阶段验证是连接阶段的第一步验证阶段主要目的是确保Class文件的字节流中包含的信息符合java虚拟机规范,确保这些信息被加载入内存不会危害到jvm自身的安全。主要包含以下几个步骤文件格式验证 验证字节流是否符合Claa文件格式的规范要求,确保字节流所表示的静态结构能
2020-08-08 11:30:52 136
原创 吐血带你分析AQS源码!!!
啥是AQS呢?AQS是一个用来构建锁和同步器的框架,可以帮助我们快速构建锁和同步队列器,ReebtrantLock,CountDownLatch,ReentrantWriteLock等都是基于AQS实现。AQS底层使用双端队列,CAS操作实现先来看一下AQS中重要的属性//双端队列的头节点,是当前共享资源的持有线程,不再阻塞队列之内private transient volatile Node head;//阻塞队列的尾节点private transient volatile Node ta
2020-08-01 22:03:41 167
原创 HotSpot到底是咋有那么多对象的
本文参照与《深入理解jvm》首先介绍一下,HotSpot中对象的内存布局对象头:包括Mark Word 和 类型指针俩部分,markword是肯定有的,而类型指针是否存在依赖于引用的实现方式MarkWord里面存储着对象运行时候的数据,例如分代年龄,哈希值,偏向锁ID等MarkWord在32位和64位机器中分别占用32比特和64比特,他会根据对象的状态对空间进行复用,尽量在最小的空间中存储最多的数据实例数据存放对象的实例数据,是对象存储的真正有效的信息。实例数据包括类中的实例变
2020-07-27 18:21:07 147
原创 并发下的Integer陷阱
自动装箱的陷阱:https://blog.csdn.net/weixin_44799092/article/details/107322013今天在阅读 《实战java高并发》的时候看到一个案例,特此记录public class BadLockInteger implements Runnable{ public static Integer i=0; static BadLockInteger instance=new BadLockInteger(); @Override
2020-07-19 15:12:04 389
原创 自动装箱的陷阱
今天在阅读 jvm关于自动装箱部分的内容时,对最后一个案例 自动装箱的的陷阱感到疑惑。解决后特此记录 Integer a=1; Integer b=1; Integer c=128; Integer d=128; Integer e=127; System.out.println(a==b); System.out.println(c==d); System.out.println
2020-07-13 18:43:43 248
原创 谈一谈为啥指针在32位中是4个字节,64位中是8个字节
虚拟内存我们先来了解什么是虚拟内存机器级程序将内存看作是一个字节数组,而这个数组就是虚拟内存。数组中的每一个字节都有一个唯一的数字来标识,称之为这个字节的地址(虚拟地址)。地址的集合就是虚拟地址空间。所以我们知道计算机中字节为最小的可寻址单位。字长在计算机中,通过字长来对虚拟地址编码。即 如果 字长为 4位 ,那么虚拟地址的大小 为 0 ~ 15 。而指针中存储的是什么,不就是地址吗。在64位机器上面,字长为 64 ,32位机器上面字长为 32 。所以64位机器上面 指针需要 8个字节的大小来完整的
2020-07-08 12:33:52 3802 2
原创 谈一谈 JIT
前言今天在看 《深入理解JVM》的时候,有这样一段内容执行引擎在执行字节码指令的时候,通常会有解释执行和编译执行俩种选择,也可能俩者兼备。对解释执行和编译执行的理解感觉欠缺所以记录下了如下内容编译执行与解释执行编译执行源代码 编译成 本地机器码,然后执行。典型的 C 和 C++ 程序采取这样的方式执行。优点但是运行时,由于直接执行本地机器码所以执行很快。缺点编译执行在编译的过程比较慢,大型的 C和 C++程序 编译时会非常慢。而且基于寄存器架构,可移植性很差解释执行在每条代码执行
2020-07-06 18:37:30 333
原创 synchronized 加锁
处理器层面加锁 :刷新处理器缓存刷新处理器缓存处理器通过缓存一致化协议,从除自身外的其他处理器的高速缓存中读取数据,并将结果更新到自己的缓存中锁的释放:冲刷处理器缓存冲刷处理器缓存将对变量的修改结果写入缓存或者主存中,而不是在寄存器或者写缓冲器中JMM加锁:清空工作内存中该变量的副本,从主内存中读取锁释放:将变量写回主内存中,并且通知其他线程的工作线程该变量的副本无效...
2020-06-19 15:28:46 214
原创 TCP/IP概述
什么是互联网 俩个以太网段通过路由器相连起来就是互联网关联 互联网的协议就是tcp/ip,tcp/ip为互联网而生具体含义见名知义,很多人认为 tcp/ip协议就是 tcp和ip协议,其实不然。tcp/ip协议其实是利用ip进行网络通信过程中所依赖的协议的统称,包括 TCP ,IP,UDP,ICMP,ARP等协议分层模型硬件 ------》网络接口层(驱动) --------》互联网层(ip)------》传输层(tcp。UDP等)-------》应用层(ssl,ssh,http....
2020-06-07 10:17:59 168
原创 java fail-fast 与 java.util.ConcurrentModificationException 及踩坑 subList
fail-fast复现异常什么是 fail fast原理通过源码知原理迭代器for each 语句,直接看 target下的class文件解决方法多线程下异常复现另一种会抛出异常的情景分析复现异常 List<Integer> list=new ArrayList<>(); for(int i=0;i<5;i++){ list.add(i); } Iterator<Integer>
2020-06-01 11:20:38 1370 1
原创 tomcat之坑:指定jvm的编码
背景在项目中需要调用 小程序开发提供的http api,在web端将数据写入小程序的云数据库,但是代码单元测试在idea上没问题。正常写入。但是将项目部署在tomcat上面发现写入数据失败,错误码 47001,即请求体解析失败,请求体的格式出错,于是怀疑是编码导致的问题尝试过的方法 PrintWriter out=new PrintWriter(connection.getOutputStream()); JSONObject jsonObject=new JSONObject();
2020-05-30 14:21:24 215
原创 Spring Data Redis教程及使用过程的一些问题
Spring Data Redis简单使用及使用过程的一些问题spring data redis 使用步骤1,导入依赖2,创建连接redis连接工厂3,构建sprinig data redis ,来简化我们redis的读取等操作4,使用模板提供的 opsForList ,opsForValue 等方法操作数据,具体方法不在这里赘述。使用过程中踩的一些坑背景:在一个项目中,需要调用小程序的端提供的api,获取到云数据库中的数据,然后再web端进行一些分析。由于数据交互使用json格式,而且需要数据需要频繁的从
2020-05-30 00:54:32 297
原创 java String字符串解析为JSON格式
导入所需要的jar包,maven坐标 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.9</version> </dependency>使用 JSONObject jsonObject=JSONObject
2020-05-27 08:39:47 756
原创 wait(),notify()方法详解
使用场景在单线程下,要实现程序执行某操作必须满足某一条件可以将这个操作放在一格if的语句体中。在多线程下,一个线程执行的某个操作必须满足某个条件,且这个条件不满足只是暂时的,这个条件只是需要另一个线程来改变。在这种情况下,我们可以在条件不满足的时候将线程暂停进入WAIT,当条件满足的时候,再去将线程唤醒。使用wait()和notify()实现上述场景someObject.wait()/someObject.wait(long)每一个对象都有此方法,对象调用此方法会使得对象所在的线程暂停进入WAIT
2020-05-23 22:13:18 1124
原创 Unable to prase template Class Error message: Index 0 out of bounds for length 0
解决办法打开idea安装目录的bin中找到如下俩个 文件然后在末尾添加-Djdk.util.zip.ensureTrailingSlash=false重启idea
2020-05-21 17:01:40 624
原创 堆的分代
分代收集理论分代收集理论是多个收集器的设计原则,它的具体内容是弱分代假说:大多数对象朝生夕灭,弹指一挥间,人生短暂强分代假说:熬过GC次数愈多的对象,在GC的过程中越难被消亡跨代引用假说:存在跨代引用的对象是非常少数的 如果新生代的对象被老年代所引用,而jvm要进行 minorGC, 这时就不得不在固定的GCroot之外,再遍历所有的老年代对象来保障 ,这样会大大的降低GC的效率。所以可以在新生代中使用 RememberSet来 存储老年代中存在跨代引用的内存,在mino
2020-05-19 11:05:29 220
原创 多线程之内存屏障
内存屏障线程的同步机制底层实现依靠的就是:内存屏障我们知道保障可见性依靠 刷新处理器缓存和冲刷处理器缓存。锁的获得释放,volatile关键字都可以保障对共享变量的操作包含这俩个动作含义:内存屏障是对一类仅针对读写指令的跨处理架构的比较底层的抽象,它被插到俩个指令之间,来禁止编译器,处理器重排序,其伴随着 冲刷处理器缓存和刷新处理器缓存分类(处理器层面):load barrier --》读屏障 ,存储屏障作用:刷新处理器缓存,阻止屏障俩侧的指令重排序jvm会在申请锁指令之后插入load
2020-05-13 12:49:39 424
原创 浅谈线程安全问题的几个方面
线程安全问题的三个方面原子性可见性有序性导致线程安全问题的原因多个线程在不加任认为限制的情况下,并非的操作同一个共享变量原子性俩个含义:对共享变量的访问操作在其执行线程之外的其他线程下来看,该操作要么完成,要么没完成。即其他线程不会看到该操作的中间部分对同一共享变量的俩个原子操作不可以交错进行,一次只能进行一个java中实现原子性锁:锁是排他性资源。为共享变量加锁,可以保证共享变量在任意时刻只能被一个线程所访问CAS: 处理器实现的一种锁机制,它在硬件方面保障原子性…
2020-05-12 10:12:34 433
原创 线程安全之重排序
重排序一个处理器上面执行的多种操作,在其他处理器看来与该处理器上面程序指定的操作顺序不同重排序是处理器,编译器,存储子系统为了改善程序执行性能而对内存访问操作执行的操作,它可以在不影响程序(单线程下)正确执行的条件改善程序执行性能分类:指令重排序存储子系统重排序(内存重排序)一些与重排序相关的概念源代码顺序:源代码中所指定的内存访问操作程序顺序:给定处理器中目标代码的执行顺序执行顺序:处理器中代码的真正执行顺序感知顺序:给定的处理器感知到的该处理器和其他处理器的内存访问操作指令
2020-05-11 14:23:45 533
原创 java中的arrayList以及vector的最大容量
2020-5-8 删除了以前写的垃圾博客,记录阅读stack源码 public E push(E item) { addElement(item); return item; } public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[ele
2020-05-08 18:42:29 759
原创 java中的toString方法
在java中所有的类都是Object的子类,而toString又是Object中的方法,所以,所有的类都会继承toString方法, 而当我们使用System.out.println()时会自动调用toString方法, 如果我们在子类中重写了toString方法,那么就会调用重写的方法具体用法:https://www.cnblogs.com/huan-guo/p/8404891...
2019-12-24 09:12:01 236
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人