java基础
文章平均质量分 72
_xuzhi_
从事软件研发
展开
-
对象在堆内存中的结构 ? Object o = new Object();这样一行代码 会在内存占用多大空间?
java -XX:+PrintCommandLineFlags 打印可以看出-XX:InitialHeapSize=29844928 -XX:MaxHeapSize=477518848 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC默认是开启的对象指针压缩和 类指针压缩,用来提高内存的利用率,变量槽 长度 在没开启对象指针压缩 时, Obj...原创 2020-08-05 18:01:29 · 446 阅读 · 0 评论 -
垃圾收集器之-cms/G1 深入分析比较
CMS 一款具有时代意义的收集器,它是第一款可以与用户线程进行行的执行收集器,CMS 主要用于对年老代区域的堆进行垃圾回收,采用的是标记清除算法,标记清除收集效率高,但致命的缺陷就是产生内存碎片,当年老代的可用区域不足8%会触发其老年代的垃圾回收,由老年代需要 分配出一定比例的内存用于对新生代的分配担保所以会在达到92%时进行垃圾回收。 与CMS 搭配使用的新生代的收集器 为ParNew 是一款多线程并发的收集器 G1 收集器是采用化整为零的方式将 内存区域...原创 2020-07-27 14:47:02 · 227 阅读 · 0 评论 -
mybatis 查询请求流程详解
1. MapperProxyFactory 代理 Mapper 接口代理对象的生成类,当通过Sqlsession拿到Mapper接口对象,这个Mapper接口是JDK的动态代理生成的代理对象 【Configuration 中的MapperRegistry 中 knownMappers中存放 mapper接口的 Class<?> 和 代理对象工厂类的关系】从而在访问的时候:configurationb.getMapper(class<?>, sqlSes...原创 2020-07-19 11:28:27 · 515 阅读 · 0 评论 -
concurrentHashMap 1.8 核心原理详解
concurrentHashMap 的底层实现数据结构 为 数组 + 链表 (红黑树) 当链表长度大于 8时会触发 链表转红黑树,但如果 数组长度小于 64时是通过扩容 将 数据进行再散列,降低链表长度来降低 1.8 的插入和查询效率低,JDK1.8 采用的是尾插法(每次都要遍历整个链表)进行数据插入的,所以插入和查询效率当 链表长度小于等于8时,链表的效率是要高于红黑树O(log(n))时间复杂度的(1). 并发扩容 table 迁移数据并发 创建新数组为旧数组长度的 2 倍 n ...原创 2020-07-06 12:38:36 · 1863 阅读 · 0 评论 -
ThreadLocal 面试详解之必过ThreadLocal
ThreadLocal 线程本地变量,顾名思义 (1) 每个Thread 都会创建私有的变量的副本,存在Thread 的 ThreadLocals 变量中,ThreadLocals 是 ThreadLocalMap 类型 ,每个线程可能会有多个ThreadLocal变量。线程私有所以ThreadLocal 线程安全的ThreadLocalMap 中有个 Entry[]table数组用于存储的一个一个的Entry 对象,Entry key - value 键值对 key threadlocal 本身,..原创 2020-07-02 11:54:20 · 109 阅读 · 0 评论 -
javap -v 字节码指令全集(收藏)
常见的引用类型的指令:创建类实便: new创建新数组: newarray,anewarray,multianwarray访问类的域和类实例域: getfield,putfield,getstatic,putstatic把数据装载到操作数栈: baload,caload,saload,iaload,laload,faload,daload,aaload从操作数栈存存储到数组: bastore,castore,sastore,iastore,lastore,fastore,dastore,a原创 2020-05-28 10:46:34 · 1817 阅读 · 0 评论 -
JVM内存模型之程序计数器
什么是程序计数器?在java世界里,java程序天生是多线程运行的且现代CPU多采用时间片轮转LLRU调度,当线程的时间片到的时候,必然会有线程间的切换,就需要有一个东西来记录当前线程的执行到那一步,当此线程再次获得时间片时可以恢复到之前的执行行。 1) 程序计数器是JVM中一小块内存而且是JVM唯一一个没有定义OOM异常的区域 2)程序计数器属于线程私有,记录当前线程执行命令行号的地址...原创 2020-05-13 17:26:35 · 144 阅读 · 0 评论 -
ReentrantLock之源码解析
实现锁同步机制,我们一般可以通过 (1) 自旋死循环实现缺点也很明显 空耗cpu (2) 通过自旋加 当前线程调用yied() 释放cpu进入就绪状态,当然这样当下次仍有可能会被选择执行 (3) 通过自旋加 sleep() 让当前线程进入休眠状态 释放cpu , 这样似乎很完美,但是由于持有锁的线程执行时间不确定,可能造成当前线程的频繁唤醒 (4) 通过...原创 2020-04-15 18:31:20 · 348 阅读 · 0 评论 -
离线安装,Btrace;Btrace在线生产问题排查,无需重启服务
在线安装https://visualvm.github.io/pluginscenters.html查找对应版本的Btrace如:JDK 8 Update 40 - 121 /JDK 7 Update 79 - 80 使用:https://visualvm.github.io/archive/uc/8u40/updates.xml.gzJDK 8 Update 131 - 2...原创 2019-10-22 17:36:36 · 111 阅读 · 0 评论 -
@EnableXxxx类型的注解解释
@EnableXxxx 类型的注解是通过 @Import收集和注册特定场景相关的bean定义。如: @EnableScheduling 是通过 @Import (SchedulingConfiguration.class)将调度框架相关的bean加载到 ioc 容器 @EnableMBeanExport 是通过 @Import(MBeanExportC...原创 2019-10-18 14:05:55 · 451 阅读 · 0 评论 -
显示锁和synchronized的区别
这两种锁都是可重入锁。synchronized内置锁是一种非公平平锁排它锁,是jdk1.8对它做了大量的优化(偏向锁->轻量级锁->重量级锁),所以在没有特殊用途的情况下建议使用synchronized关键字(java语言内置的,加锁释放锁都是已经固化好的我们不需要处理,显示锁是语法层面的锁,有一个固定的范式)。 显示锁有一个固定的结构jdk源码给出的示例...原创 2019-10-08 09:54:33 · 145 阅读 · 0 评论 -
String和包装类是引用传递还是值传递?
String和包装类 都是final类型不能被继承。创建这种类型的对象也是在堆上对其分配内存的。所以他们变量属于是引用传递,但是由于value的final类型的特点,使得我们在使用的时候常常表明看起来他们是值传递,其实他们是引用传递 String存放值的 value 是一个final类型的字符数组,所以当String变量赋值后就是不可变的,值一旦发生改变其实是新建了一个Strin...原创 2019-09-26 16:43:20 · 539 阅读 · 1 评论 -
@sun.misc.Contended 伪共享
Java8中已经提供了官方的解决方案,Java8中新增了一个注解:@sun.misc.Contended。加上这个注解的类会自动补齐缓存行,需要注意的是此注解默认是无效的,需要在jvm启动时设置-XX:-RestrictContended才会生效。 jdk7以前版本为了避免由于false sharing 导致CacheLine从L1,L2,L3到主存之间重复载入,...原创 2019-09-17 10:07:46 · 163 阅读 · 0 评论 -
JVM 性能调优参数 -Xms -Xmx -Xss
-Xss256k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆 栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一 个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内...原创 2019-09-10 11:08:37 · 234 阅读 · 0 评论 -
java中形参和实参
形参在方法调用时才会对其进行分配空间,例如方法 public void compare(Integera, Integer b){......},那么 这里的a和b就称为形式参数,我们在进行方法调用是传递的不管是常量,数值,表达式,字符串 compare(12, 35),12,35就是实参。...原创 2019-08-15 10:01:09 · 150 阅读 · 0 评论 -
重写equals方法必须重写hashcode方法
首先判断两个对象实例是否相等,需要知道的前提:如果两个对象相等,那么他们的hashcode值一定相同;如果两个对象不相等,那么他们的hashcode值一定不相同。反之,如果两个对象的hashcode值相等,那么这两个对象不一定相同;两个对象的hashcode值不相同那么对象也肯定不相等。 如果重写了equals方法而没有重写hashcode方法,当两个对象...原创 2019-08-15 10:12:16 · 103 阅读 · 0 评论 -
synchronized 与显示锁 Lock的区别或优缺点
synchronized 和 Lock接口是jdk提供两种实现代码同步的方式,jdk1.8对synchronized 做了大量的优化,比如锁消除,锁粗化,使用偏向锁,轻量级锁、重量级锁、锁自旋等来提高同步的性能。 synchronized 又称为内置锁,支持可重入的非公平锁,使用起来方便也是推荐使用的同步方式。Lock是一个接口,有不同的实现类,基于AbstractQ...原创 2019-08-15 10:26:34 · 328 阅读 · 0 评论 -
junit测试用例启动报错java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig
报错的原因: spring 4与servlet2.5的兼容性问题,可以使用javax.servlet-api替换如下,scope为test<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</...原创 2019-08-15 15:06:38 · 898 阅读 · 0 评论 -
Integer 包装类面试深坑
Integer int1 = 120, int2 = 120, in3 = 140, int5 = 200;System.out.println(int1 == int2);System.out.println(int3 == int5);结果 int1==int2 trueint3==int5 false;解释:首先四个都是Integer 对象,基本数据类型和包装类有自动装箱...原创 2019-08-15 15:08:30 · 114 阅读 · 0 评论 -
你所熟悉的String,不熟悉的String可变性;字符串常量池变迁
String 这个大家在熟悉不过的基本数据类型,众所周知,String 类型的变量是一个不可变类型,是一个final 类不能有子类,而且多次拼接,会不断的新建String实例,引用不断地重新定位,那么究其根本为什么会是这样? public final class String implements java.io.Serializable, Comparable&...原创 2019-08-16 11:11:44 · 123 阅读 · 0 评论 -
java 和 javax 有什么区别
java诞生之初,所必须的包都在java包中定义,javax只是扩展javaApi 使用,随着时间的不断推进,javax逐渐成为java的组成部分,后期由于要合并的化对原有的类影响较大,所以最终javax也成了java的标准API,所以java和javax是一样的。...原创 2019-08-16 11:17:36 · 1766 阅读 · 0 评论 -
java之封装继承多态(is-a法则)
封装是将对象的属性封装起来私有化,并对外提供可访问的方法来访问操作属性。 继承是在已有类的基础上创建新的类,并且子类拥有父类的公有的属性和行为。子类也可以重写父类的方法实现子类自有的一些特性。 1、子类拥有父类的非private属性和方法 2、 子类可以有自己特有的方法,即可以对父类进行扩展 3、子...原创 2019-08-16 11:28:42 · 220 阅读 · 0 评论 -
java对象相等和引用相等
对象相等比较的是对象中的内容是否相同,而引用相等是引用变量指向的内存地址是否相等原创 2019-08-16 11:33:53 · 1655 阅读 · 0 评论 -
比较之 “==” 和 equals 最彻底的解释
== 基本类型比较的是其值是否相同,引用类型比较的是指向的内存是否相等 equals 比较分两种: 1.、重写equals方法的类,比较的是对象的内容是否相同 2、没有重写equals方法,他们比较等同与 == 比较,没有重写equals方法,使用的是Object类的equals方法,Object的hashcode 就是根据对象在内存中的地址生成...原创 2019-08-16 11:42:46 · 101 阅读 · 0 评论 -
面试之字符串之谜 - String.intern() 字符串常量池
一、String 变量创建分析(1)在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。(2) 在JDK6.0中,StringTable的长度是固...原创 2019-08-16 17:23:00 · 117 阅读 · 0 评论 -
java和javac cmd执行 javap 查看字节码文件
错误找不到主类或无法载入类别 Test这个的原因主要是因为 package 引起的可以使用 javac -d . Test.java 生成字节码class文件然后 java test/Test 执行class文件javap -c TargetClass...原创 2019-07-24 11:44:34 · 440 阅读 · 1 评论 -
SpringFactoriesLoader
使用SpringFactoriesLoader寻找jar包配置META-INF下的spring.fatories配置文件相应key的value类,然后通过spring的@Configuration对相应的bean进行有选择(@ConditionalOnClass)的实例化。...原创 2019-08-26 14:11:27 · 114 阅读 · 0 评论 -
双亲委派模型-类加载流程(加载、验证、准备、解析、初始化)
双亲委派模式是java的类加载机制,确保类的层次关系,当类收到类加载请求时,该类会委派给器父类进行加载,当父类反馈不能加载时,才会又子类来完成加载。当父类加载过某个类后,子类是不会再次加载,从而防止重复加载。 双亲委派模型可以保证java核心类库的安全性,同时防止类被重复加载。 类加载过程包括加载、验证、准备、解析、初始化。 首先类的...原创 2019-08-19 10:03:02 · 171 阅读 · 0 评论