Java基础
文章平均质量分 75
Saintyyu
这个作者很懒,什么都没留下…
展开
-
妈妈再也不用担心我搞不懂——log4j/logback/log4j2原理了
本文深入浅出地介绍log4j、logback、log4j2的核心原理,通俗易懂。原创 2022-12-02 15:11:18 · 735 阅读 · 1 评论 -
使用JVM工具:HSDB查看动态代理生成的代理类
利用JVM工具:HSDB查看动态代理类对象的实现:既可以看jdk生成的动态代理对象,也可以查看cglib生成的动态代理对象。转载 2022-09-28 21:01:31 · 602 阅读 · 0 评论 -
Java读写文件
private List<String> readListFromFile() { List<String> list = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader("/tmp/list.txt"))) { String tmpStr; while ((tmpStr = .原创 2021-08-19 09:55:35 · 233 阅读 · 0 评论 -
基于aop的注解对方法调用前后打日志
注解:@Target({METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MethodLog { /** * 请求是否打日志 * @return */ boolean reqLog() default true; /** * 返回是否打日志 * @return */ boolean respLog() default true;}原创 2021-08-18 22:25:34 · 311 阅读 · 0 评论 -
ThreadLocal原理简介
ThreadLocal的原理每个Thread内部维护着一个ThreadLocalMap,它是TheadLocal的一个内部类,如下为部分代码:static class ThreadLocalMap { static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */转载 2020-09-27 11:55:40 · 366 阅读 · 0 评论 -
偏向锁与hashcode能共存吗?
我们都知道,Java对象头的结构如下:内容 说明 备注 Mark Word 存储对象的Mark Word信息 - Class Metadata Address 存储指向对象存储类型的指针 - Array Length 数组的长度 只有数组对象有该属性 其中,在32位机器下,Mark Word的存储结构如下:锁状态 23 bits 2 bits 4 bits 1 bit 2 bits 轻量级锁 指向原创 2020-08-29 23:36:57 · 4249 阅读 · 8 评论 -
微服务下rpc调用的客户端和服务端实现原理
一个端口对应一个服务的情况(客户端每个rpc client对应一个连接池,服务端每个服务对应一个线程池):图中红色竖线代表rpc调用的客户端stub和服务端skeleton,每个rpc服务对应一个端口。客户端每个服务对应一个连接池,服务端每个服务对应一个线程池,用于响应客户端的请求。通常情况下,客户端和服务端是长连接。单端口多服务场景下,默认配置的情况(客户端每个rpc client对应一个连接池,服务端一个端口下的所有服务共用一个线程池):单端口多服务是指rpc调用的服务端多个服.原创 2020-08-27 22:02:33 · 1510 阅读 · 0 评论 -
jvm之safepoint、safeRegion和OopMap
前情说明本博客只是对文末的参考博客进行一个简单的汇总整理,不能算原创,但无奈csdn没有“整理”这种类型,因而还是挂成了原创。将这些零散的博客整理到一起有两方面的考虑:一方面是方便自己以后回顾,另一方面也方便大家进行系统性地学习。正文safepointJVM在很多场景下使用到safepoint,最常见的场景就是GC的时候。对一个Java线程来说,它要么处在safepoint,要么不在safepoint。Garbage collection pauses Code deoptimizat原创 2020-08-09 17:32:55 · 717 阅读 · 1 评论 -
java中断机制深入分析之Thread源码跟踪
Thread.interrupt()源码中有这样一句注释:Just to set the interrupt flag。如果说Thread.interrupt()方法只是修改了中断标记_interrupted的值,那么已经放弃cpu、处于阻塞状态的thread线程如何能感知到这个变量已经被改变,从而立即抛出InterruptedException呢?真相只有一个,那就是这个注释是错的!!!原创 2020-08-02 21:49:38 · 709 阅读 · 1 评论 -
Unsafe类park和unpark方法源码深入分析(mutex+cond)
转发一张经典的mutex和condition配合使用的图:参考博客:1、http://blog.sina.com.cn/s/blog_967817f20101bsf0.html原创 2020-07-18 11:36:22 · 2918 阅读 · 1 评论 -
Java反序列化源码深入追踪
众所周知,Java 原生的序列化方法可以分为两种:实现 Serializable 接口:可以自定义 writeObject、readObject、writeReplace、readResolve 方法,会通过反射调用。 实现 Externalizable 接口:需要实现 writeExternal 和 readExternal 方法。实际上,Externalizable接口继承自Seria...原创 2020-02-08 21:40:15 · 899 阅读 · 0 评论 -
JAVA ClassLoader双亲委派机制细节研究
我们都知道,Java类都是靠ClassLoader来加载的,而类加载器也是java类,因而java类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这个加载器正是BootstrapClassLoader。由于它不是Java类,因此它不需要被别人加载,而嵌套在Java虚拟机内核里面,也就是JVM启动的时候Bootstrap就已经启动,它是用C++写的二进制代码(不是字节码),它...原创 2019-11-25 21:11:44 · 385 阅读 · 0 评论 -
Spring如何解决循环依赖问题
在关于Spring的面试中,我们经常会被问到一个问题,就是Spring是如何解决循环依赖的问题的。这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。本文主要针对这个问题,从源码的角度对其实现原理进行讲解。1. 过程演示关于Spring bean的创建,其本质上还是一个对象的创建,既然是对象,读者朋友一...转载 2019-11-12 10:38:36 · 328 阅读 · 0 评论 -
JDK8 Metaspace元数据区介绍
Java 启动参数分为三类:1. 标准选项:这类选项的功能是很稳定的,在后续版本中也不太会发生变化,即使有变化也必须保证向后兼容。运行java或java -help可以看到所有的标准选项。所有的标准选项都是以“-”开头,比如-version,-server等。2. X选项:比如-Xms。这类选项以“-X”开头,它们也被称为X选项。运行java -X命令可以看到所有的X选项。这类选项的功能还...转载 2019-06-07 14:18:52 · 5907 阅读 · 0 评论 -
Hotspot JVM常用选项
一、选项的分类Hotspot JVM提供以下三大类选项:1. 标准选项:这类选项的功能是很稳定的,在后续版本中也不太会发生变化,即使有变化也必须保证向后兼容。运行java或java -help可以看到所有的标准选项。所有的标准选项都是以“-”开头,比如-version,-server等。2. X选项:比如-Xms。这类选项以“-X”开头,它们也被称为X选项。运行java -X命令可以看...原创 2019-06-03 23:02:06 · 569 阅读 · 0 评论 -
cas vs mutex
并发环境下最常用的同步手段是互斥锁和读写锁,例如pthread_mutex和pthread_readwrite_lock,常用的范式为:void ConcurrencyOperation() { mutex.lock(); // do something mutex.unlock();}这种方法的优点是:编程模型简单,如果小心控制上锁顺序,一般来说不会有死锁的问题; 可以通...转载 2019-07-02 22:49:05 · 1502 阅读 · 2 评论 -
lock 指令前缀与mutex锁
lock指令前缀原子操作是不可分割的操作,在执行完毕时它不会被任何事件中断。在单处理器中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断只发生在指令与指令之间。在多处理器系统中情况有所不同,由于系统中有多个处理器在独立运行,即使在能单条指令中完成的操作也可能受到干扰。在所有的X86的CUP上都具有锁定一个特定内存地址的能力,当这个特定内存地址被锁定之后,它就可以阻止其他的系统...转载 2019-07-02 23:00:37 · 3833 阅读 · 0 评论 -
Java volatile修饰符的用法及作用详解版
要深刻理解volatile这个关键字的用法及作用,需要补充以下知识:1、 内存访问操作/指令执行操作的乱序:假设每个CPU都分别运行着一个会触发内存访问操作的程序。那么对于这样一个CPU,其内存访问顺序是非常松散的,在保证程序上下文逻辑关系的前提下,CPU可以按它所喜欢的顺序来执行内存操作。类似地,编译器也可以将它输出的指令安排成任何它喜欢的顺序,只要保证不影响程序...原创 2019-06-29 08:30:21 · 2459 阅读 · 0 评论 -
Java finalize函数与软引用、弱引用、虚引用
一、finalize函数的作用 它不是C/C++中的析构函数,而是Java刚诞生时为了使C/C++程序员更容易接受它所做出的一个妥协”。也就是说,finalize函数最初被设计的用途是类似于C/C++的析构函数,用于在对象被销毁前最后的内存回收。Java与C/C++的相似性和不同之处在于:在C++中,对象的内存在哪个时刻被回收,是可以明确确定的(假设程序没有缺陷),一旦C++的对象...原创 2019-06-29 16:05:33 · 972 阅读 · 0 评论 -
从一起GC血案谈到反射原理
前提说明:以下为转载内容,因找不到原文地址了,转载也是从他人的转载博客上转的,再次对原文作者表示感谢。概述 公司之前有个大内存系统(70G以上)一直使用CMS GC,不过因为该系统对时间很敏感,偶尔会因为gclocker导致remark特别长(虽然加了-XX:+CMSScavReengeBeforeRemark参数,但是gclocker会导致remark前的YGC被delay),无法忍受...转载 2019-07-25 11:50:12 · 215 阅读 · 0 评论 -
Object类中的registerNatives方法的作用深入介绍
一直以来,对Object类中的registerNatives()方法感到十分好奇,想知道它的作用到底是什么。但查阅了不少博客,目前还没找到全面彻底且浅显易懂地介绍该方法作用的博客。于是就有了写本文的想法。本文不会直接给出结论,而是按照探索的过程为线索,娓娓道来。 其实,细心的你可能会发现,不光是Object类,甚至System类、Class类、ClassLoade...原创 2019-06-06 19:03:18 · 14926 阅读 · 21 评论