ThreadLocal的使用与原理 1. 使用场景 如果我们需要在内存中,存储session信息,而由于session会存储一些附加信息,例如用户登录id等等,那么这个时候session就必须做到隔离,使用ThreadLocal就可以实现各个线程修改的Session之间不会相互影响。2. 使用方法@Testpublic void testThreadLocal() throws InterruptedException {
java 类加载机制 背景 类加载可以将一个用全限定名来描述的类加载到虚拟机中,了解类加载机制可以帮助更快的解决一些日常的jar包冲突等问题。双亲委派模型 在java中,这些类加载器都由java语言实现,并且都继承自java.lang.ClassLoader。绝大部分java程序都会使用到下面三种类加载器:启动类加载器:加载\lib目录下的jar包扩展类加载器用来加载\lib\ext目录下jar应用程序类加载器
虚拟机字节码执行引擎学习 概要 执行引擎是java虚拟机最核心的组件之一,栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、冬天连接和方法返回地址等信息局部变量表 局部变量表用于存放方法参数和内部定义的局部变量。以变量槽为基本单位。操作数栈 java的指令集都是面向栈的,所有的指令集的参数都是要从栈中间取出值。里面存储的方法执行过程中的数据。栈内的数据必须有着严格的顺序。动态链
JVM学习-java class文件的 学习(一) 概要 对于任何java程序而言,只要编译出来的class文件符合JVM虚拟机规范,那么就可以正常被执行。 那么为什么我们要了解class文件呢,不了解class文件我们业务代码不也写的好好的吗?我们学习class文件,一是当我们可以深入的了解我们所写的代码是怎样被编译,整个流程如果出错我们能够定位问题,例如当我们发现线上的业务逻辑执行地有问题的时候,我们在排查完主干上的代码,发现主干的代码没有任
java 中一个char包含几个字节 背景 char包含几个字节可能记得在上学的时候书上写的是2个字节,一直没有深究,今天我们来探究一下到底一个char多少个字节?Char char在设计之初的时候被用来存储字符,可是世界上有那么多字符,如果有1个字节,那么就意味着只能存储256中,显然不合适,而如果有两个字节,那么就可以存储65536种。这个数量符合大多数国家的语言字符的个数。于是java团队默认使用unicode作为编码,一个c
AtomicLong和LongAdder的区别 前言 最近在看到不少框架里面使用到了LongAdder这个类,而并非AtomicLong,很是困惑,于是专门看了LongAdder的源码,总结一下这两个的区别。AtomicLong原理 就像我们所知道的那样AtomicLong的原理是依靠底层的cas来保障院子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的。那么LongAdder又是使用到了什么原
第二章:java内存区域与内存溢出异常 目的 最近在学习<<深入理解Java虚拟机>>一书,特整理成学习笔记。概要 对于java而言,我们在编码的时候不需要显式的编码分配内存和回收内存,可以节约我们大量的时间去关注业务。但是不需要显式的编码,并不意味着我们不需要去了解其中的原理,如果不了解的话,我们在进行编码的时候可能无法选择更加高效正确的实现方法,从而影响系统的性能。譬如当我们选择一个技术方法的时候,该技术方法会导致内存中产生巨量的
系统稳定性---监控指标 1. 背景 对于一个正在运行的系统,可能会碰到各种各样的问题,如依赖的应用宕机、程序bug、负载过高等问题,当遇到问题的时候,我们应该第一时间远程登录到服务器上,找到相关的日志进行分析或者查看对应的监控指标,以找到问题的根源。2.系统问题分析 不同的业务的日志都不同,因此本文中不对特定的业务日志进行分析,而从linux系统的常用命令的角度来排查问题。2.1 指标监控 系统运行的繁忙程度、健康程
AtomicInteger AtomicInteger AtomicInteger是java自带的原子操作的类,调用unsafe的 public final int getAndAddInt(Object var1, long var2, int var4) ;来完成自增操作。 “`public final int getAndAddInt(Object var1, long var2, int var4) { i
AtomicLongFieldUpdater VSAtomicLong AtomicLong AtomicLong是一个对象,因此我们创建的时候需要的内存大小(对象的大小+对象的引用);AtomicLongFieldUpdater AtomicLongFieldUpdater需要的内存大小为(引用的大小+一个long对象的大小);结论 在大量需要大量的long实例,并且需要需要进行对应的原子操作的时候,AtomicLongFieldUpdater节省内存。一个At
Mysql的锁 Mysql的锁 在mysql中为了支持并发,提供了两种级别的锁,行锁和表锁,行锁并发性好但是加锁需要的时间更久,表锁并发性非常低但是加锁快。在innodb存储引擎中,行锁锁住的是索引,因此操作没有索引的话,就会导致大量的表锁,降低性能
Timer的scheduleAtFixedRate和schedule区别 Timer类 Timer类是进行任务调度的类,用来管理周期性任务的执行。scheduleAtFxiedRate和schedule 在Timer类中有两个方法用来提交周期性任务, public void schedule(TimerTask task, long delay, long period) ;和 public void scheduleAtFixedRate(TimerTask t
关于synchronized以及ReetrantLock、ReentrantReadWriteLock的选择 synchronized和ReetrantLock的区别 synchronized是java的内置锁,相对于ReetrantLock使用更加方便,如果实现自己的Lock,可以继承ReetrantLock来实现,在性能上,两个差异不是特别大。ReetrantLock仅仅高一点。 ReetrantReadWriteLock和上面两个相比,性能优越主要体现在读方面,因为多个线程同时读的时候是共享锁
jar包下的MANIFEST.MF文件 MANIFEST.MF 当我们在打包成jar包的时候,默认会产生一个MANIFEST.MF,这个文件包含了基本的信息,包含该jar包的版本,创建人等信息,如果是可运行jar包,那么就会有main-class属性,用来指定main函数所在的类。MAINFEST.MF用来定义jar的信息,提供给JVM在加载这个类的时候的一些描述信息
JAVA Agent的原理和使用 JAVA Agent Java Agent是在jdk1.5引入的,可以动态修改方法的字节码实现动态修改类代码。这通常是在类的方法调用之前进行的预处理,Agent执行的时间的是类的字节码加载进入JVM之前,实现AOP,这个AOP的好处是不会像动态代理那样产生一个新类。 因为在Agent执行的时候类的字节码还没有加入JVM,因此如果要分析该类的信息,需要利用到ASM(byte code anal
java守护线程 守护线程与非守护线程 JVM中存在两种线程,用户线程和守候线程。 所谓的守护线程,是指用户线程在运行的时候后台提供的一种通用服务的线程,比如用于垃圾回收的垃圾回收线程。 当一个线程由守护线程创建的时候它也是守护线程,当JVM退出的时候,剩余的线程直接被禁用,finally块也不会使用,栈信息也不会退出,由于这个原因,守护线程谨慎使用,尤其是在线程中使用到IO的时候。如何设置一个线程为守