
java基础
文章平均质量分 67
chuixue24
这个作者很懒,什么都没留下…
展开
-
记一次java线程阻塞状态分析
以上4个线程都在等到同一把锁 lock <0x00000006c1d9aaf0>。而该锁被以下线程持有:原创 2025-01-02 18:01:12 · 1003 阅读 · 0 评论 -
零拷贝技术分类
Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.在 OS 层面上的Zero-copy通常指避免在 用户态(User-space) 与内核态(Kernel-space) 之间来回拷贝数据。Netty 中的 Zero-copy 与 OS 的 Zero-copy 不太一样, Netty的Zero-coyp。转载 2023-11-01 11:27:19 · 525 阅读 · 0 评论 -
logback-classic包中ThrowableProxy递归缺陷StackOverflowError解析
logback-classic(原创 2023-10-27 16:46:09 · 789 阅读 · 0 评论 -
尚硅谷-宋红康-JVM上中下篇完整笔记-JVM上篇_内存与垃圾回收篇
TIOBE语言热度排行榜世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言。java: 跨平台的语言JVM: 跨语言的平台随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序.原创 2023-05-06 11:02:36 · 5053 阅读 · 1 评论 -
硬核剖析ThreadLocal源码
ThreadLocal底层使用ThreadLocalMap存储数据,而ThreadLocalMap内部是一个数组,数组里面存储的是Entry对象,Entry对象里面使用key-value存储数据,key是ThreadLocal实例对象本身,value是ThreadLocal的泛型对象值。弱引用的对象拥有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。而线性探测法没有引入任何额外的数据结构,直接不断遍历数组。转载 2023-05-07 18:05:53 · 146 阅读 · 0 评论 -
Java 编码很难吗?看完这篇文章你就懂了
但有一点要注意,在 Windows 下使用 IDE 来运行时,比如 Eclipse,如果你的工程的缺省编码是 UTF-8,在 IDE 中运行你的程序时,会加上上述的 -Dfile.encoding = UTF-8 参数,这时,即便你在 Windows 下,缺省编码也是 UTF-8,而不是 GBK。在 UTF-16 设计之初,采用的是定长编码,尴尬的是,随着更多字符的引入,尤其是汉语、韩语和日文中的表意文字的引入,使得 Unicode 远远超出 16 比特编码的范围。这样,Java规定了字符的。转载 2023-04-24 17:39:43 · 438 阅读 · 1 评论 -
BlockingQueue阻塞队列的实现原理
ArrayBlockingQueue基于数组实现的阻塞队列,创建队列时需指定容量大小,是有界队列。ArrayBlockingQueue底层采用循环队列的形式,保证数组位置可以重复使用。ArrayBlockingQueue存取都采用ReentrantLock加锁,保证线程安全,在多线程环境下也可以放心使用。使用ArrayBlockingQueue的时候,预估好队列长度,保证生产者和消费者速率相匹配。转载 2023-04-21 09:10:27 · 257 阅读 · 0 评论 -
Java到底是值传递还是引用传递
就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。就是实际参数,用于调用时传递给方法的参数。实参在传递给别的方法之前是要被预先赋值的。/*** @author 一灯架构* @apiNote Java传递示例**/String name = "一灯架构";// 这里的name就是实际参数// 这里方法参数列表中name就是形式参数在Java方法调用的过程中,就是把实参传递给形参,形参的作用域在方法内部。转载 2023-04-19 17:59:08 · 70 阅读 · 0 评论 -
java-synchronized原理
介绍synchronized是一种独占式的重量级锁,在运行到同步方法或者同步代码块的时候,让程序的运行级别由用户态切换到内核态,把所有的线程挂起,通过操作系统的指令,去调度线程。这样会频繁出现程序运行状态的切换,线程的挂起和唤醒,会消耗系统资源,为了提高效率,引入了偏向锁、轻量级锁、尽量让多线程访问公共资源的时候,不进行程序运行状态的切换。synchronized实现原理synchronized是在jvm中实现,是基于进入和退出Monitor对象来实现方法和代码块的同步monitorenter指令插入到同步转载 2022-10-10 16:45:26 · 919 阅读 · 0 评论 -
Java Runtime.exec()的使用
Sun的doc里其实说明还有其他的用法:exec(String[] cmdarray, String[] envp, File dir)Executes the specified command and arguments in a separate process with the specified environment and working directory.那个dir就是调用的程序的工作目录,这句其实还是很有用的。Windows下调用程序Process proc =R转载 2022-01-05 14:27:25 · 1058 阅读 · 0 评论 -
线程状态切换
线程线程是调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型,JVM使用的KLT模 型,Java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有 一个对应的线程。Java线程有多种生命状态:NEW,新建 RUNNABLE,运行 BLOCKED,阻塞 WAITING,等待 TIMED_WAITING,超时等待 TERMINATED,终结协程协程(纤程,用户级线程),目的是为了追求最大力度的发挥硬件性能和提升软件的速.原创 2021-10-08 12:58:05 · 384 阅读 · 0 评论 -
类加载流程图
字符串是 字符串是 JavaJavaJavaJava程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 JavaJavaJavaJava中 StringStringStringStringString 类已经重载了 类已经重载了 类已经重载了 类已经重载了 "+""+""+"。也就是说,字符串可以直接 。也原创 2021-08-17 13:23:23 · 207 阅读 · 0 评论 -
类的显示加载与隐式加载
原创 2021-08-15 19:25:02 · 386 阅读 · 0 评论 -
java类加载器与Class实例和对象实例关系
原创 2021-08-15 19:15:36 · 155 阅读 · 0 评论 -
java类的主动使用和被动使用
原创 2021-08-14 16:02:54 · 203 阅读 · 0 评论 -
clinit方法的线程安全以及死锁
问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况。那么有没有一种方式可以让一个进程同时为多个客户端端提供服务?接下来要讲的IO复用技术就是对于上述问题的最好解答。对于IO复用,我们可以通过一个例子来很好的理解它。(例子来自于《TCP/IP网络编程》)某教室有10名学生和1名老师,这些学生上课会不停的提问,所以一个老师处理不了这么多的问题。那么学校为每个学生都配一名老师,也就原创 2021-08-12 14:11:06 · 347 阅读 · 0 评论 -
static+final变量显示赋值时机
synchronized使用方式我们知道并发编程会产生各种问题的源头是可见性,原子性,有序性。而synchronized能同时保证可见性,原子性,有序性。所以我们在解决并发问题的时候经常用synchronized,当然还有很多其他工具,如volatile。但是volatile只能保证可见性,有序性,不能保证原子性,参见我之前的文章面试官:volatile关键字用过吧?说一下作用和实现吧synchronized可以用在如下地方修饰实例方法,对当前实例对象this加锁修饰静态方法,对当前类的C原创 2021-08-12 14:00:09 · 174 阅读 · 0 评论 -
Java对象空间分配流程
对象空间分配流程如下:针对这个流程,分别解释一下每一个选项的使用场景。栈上分配:栈上分配的基础在于逃逸分析,逃逸分析可以得到三种对象的逃逸状态。全局逃逸:一个对象的引用逃出了方法或者线程。参数级逃逸:在方法调用过程中传递对象的引用到另一个方法。没有逃逸:一个可以进行标量替换的对象。基于分析结果,一般有如下3种优化:堆分配对象变成栈分配对象,栈分配的对象,不需要gc,在方法离开此方法栈后,栈空间的数据随之销毁。消除同步,逃逸分析可以判断出某个对象是否始终只被一个线程访问,.转载 2021-04-08 19:38:55 · 182 阅读 · 0 评论 -
new Object()到底占用几个字节,看完这篇彻底明白了!
前言Java虚拟机栈是线程私有的,没有数据安全问题,而堆相比较于Java虚拟机栈而言更为复杂,因为堆是所有线程共享的一块内存空间,会出现线程安全性问题,而垃圾回收也主要是回收堆内空间,所以堆内的布局我们非常有必要深入去了解一下。现在就让我们继续来分析一下堆内布局以及Java对象在内存中的布局吧。对象的指向先来看一段代码:package com.zwx.jvm;public class HeapMemory { private Object obj1 = new Object()转载 2021-04-06 10:05:24 · 236 阅读 · 0 评论 -
JOL:查看Java 对象布局、大小工具
一 概述最近需求,打算再内存缓存数据,数据量130000万并且还会增加,了解这些数据占用空间的大小是很常见的监控需要。常规方式,人工可以按照Java基础数据类型大小及内容大小估算出缓存对象的大概堆占用,但是麻烦还不准。OpenJDK,提供了JOL包,可以帮我们在运行时计算某个对象的大小,是非常好的工具官网:http://openjdk.java.net/projects/code-tools/jol/定位:分析对象在JVM的大小和分布依赖:<dependency>.转载 2021-03-22 12:26:03 · 387 阅读 · 0 评论 -
Java 代码是怎么执行的
结合 CPU 理解一行 Java 代码是怎么执行的根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器、控制器、存储设备,以及输入输出设备,如下图所示。我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单元,存储单元。控制单元是 CPU 的控制中心, CPU 需要通过它才知道下一步做什么,也就是执行什么指令,控制单元又包含:指令寄存器(IR ),指令译码器( ID )和操作控制器( OC )。 当程序被加载进内存后,指令就在内存中了,这个时候说的内存是转载 2021-01-04 00:15:52 · 351 阅读 · 0 评论 -
基础篇:深入JMM内存模型解析volatile、synchronized的内存语义
先介绍下多进程多线程在linux几种通信方式管道:管道的实质是一个内核缓冲区,需要通信的两个进程各在管道的两端,进程利用管道传递信息 信号:信号是软件层次上对中断机制的一种模拟,进程不必阻塞等待信号的到达,信号可以在用户空间进程和内核之间直接交互 消息队列:消息队列是消息的链表,存放在内存中并由消息队列标识符标识,允许多个进程向它写入与读取消息 共享内存:多个进程可以可以直接读写同一块内存空间,是针对其他通信机制运行效率较低而设计的 信号量:信号量实质上就是一个标识可用资源数量的计数器,它的值总转载 2021-01-02 18:25:15 · 175 阅读 · 0 评论 -
OpenJDK能替代Oracle JDK 吗
Oracle 要对JAVA收费了,许多人说可以用 OpenJDK替代,但这会对应用有影响吗?OpenJDK 项目主要基于 Sun 捐赠的 HotSpot 源代码。此外,OpenJDK 被选为 Java 的参考实现,由 Oracle 工程师维护。关于 JVM,JDK,JRE 和 OpenJDK 之间的区别,Oracle 博客帖子在 2012 年有一个更详细的答案:问:OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?答:非常接近 - 我们的 Oracle JD转载 2021-01-02 18:26:33 · 7125 阅读 · 2 评论 -
-XX:PretenureSizeThreshold的默认值和作用浅析
一、背景《深入理解Java虚拟机》第93页,3.6.2 大对象直接进入老年代。讲到大对象主要指字符串和数组,虚拟机提供了一个-XX:PretenureSizeThreshold参数,大于这个值的参数直接在老年代分配。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存复制(新生代采用复制算法)。但是这里没讲清楚默认值是多少,默认会不会“大”对象直接进入老年代。二、解析2.1 参考文章找到了一篇相关问题的文章《Frequently Asked Questions转载 2020-12-31 17:55:33 · 1711 阅读 · 1 评论 -
深入理解Java虚拟机-HotSpot虚拟机对象探秘
一、对象的创建过程虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那就先执行相应的类加载过程。 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来,划分方式有指针碰撞和空闲列表两种,划分方式的选择取决于垃圾回收算法是否支持压缩整理功能,因此,在使用Serial、ParNew转载 2020-12-31 10:35:33 · 166 阅读 · 0 评论 -
【重学计算机】计算机组成原理
目录一、计算机系统概论 二、数据表示 三、运算方法与运算器 四、存储系统 五、指令系统 六、中央处理器 七、总线 八、输入输出系统一、计算机系统概论1. 冯诺依曼计算机组成主机(cpu+内存),外设(输入设备+输出设备+外存),总线(地址总线+数据总线+控制总线)2. 计算机层次结构应用程序-高级语言-汇编语言-操作系统-指令集架构层-微代码层-硬件逻辑层3. 计算机性能指标非时间指标 【字长】机器一次能处理的二进制位数 ,常见的有32位或64位 【总线宽转载 2020-12-31 00:52:17 · 585 阅读 · 0 评论 -
计算机指令执行过程详解
一、计算机的基本组成冯·诺依曼计算机的特点(机器以运算器为中心)1. 计算机由控制器(分析和执行机器指令并控制各部件的协同工作)、运算器(根据控制信号对数据进行算术运算和逻辑运算)、存储器(内存存储中间结果,外存存储需要长期保存的信息)、输入设备(接收外界信息)和输出设备(向外界输送信息)五大部件组成2. 指令(程序)和数据以二进制不加区别地存储在存储器中3. 程序自动运行现代计算机由三大部分组成(已经转化为以存储器为中心)1.CPU(CentralProcessingUnit) ...转载 2020-12-31 00:40:55 · 15162 阅读 · 0 评论 -
volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volati.转载 2020-12-31 00:24:59 · 208 阅读 · 1 评论 -
ConcurrentHashMap底层实现原理(JDK1.7 & 1.8)
前言我们都知道HashMap在多线程情况下,在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。我们来了解另一个键值存储集合HashTable,它是线程安全的,它在所有涉及到多线程操作的都加上了synchronized关键转载 2020-12-31 00:02:42 · 338 阅读 · 0 评论 -
Java 可变对象和不可变对象
一、简单定义 不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。 不可变对象的类即为不可变类(Immutable Class)。Java平台类库中包含许多不可变类,如String、基本类型的包装类、BigInteger和BigDecimal等。二、优缺点 不可变对象有很多优点: 构造、测试和使用都很简单 线程安全且没有同步问题,不需要担心数据会被其它线程修改 当用作转载 2020-12-29 23:37:53 · 380 阅读 · 0 评论 -
String str = ““ 和 new String()的区别
两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。String str2 = new String("abc") ;在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过原创 2020-12-29 22:43:08 · 307 阅读 · 0 评论 -
在日志中记录Java异常信息的正确姿势
遇到的问题今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息。在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),如下所示:logger.error("error: {}, {}", params, e.getMessage());在日志中看不到任何信息,说明e.getMessage()返回值为空字符串。原因分析先来看一下Java中的异常类图:Throwable是Java中所有异常信息的顶级父类,其中的成员变量转载 2020-12-29 14:08:58 · 635 阅读 · 0 评论 -
一个正则表达式例子(用正则表达式来表示卫生行业元数据标准)
以上是卫生行业元数据标准,如果写正则表达式来表示可变换行字符串:其格式为AN..40X3(按 固定 长 度 或 可 变 长 度 的 规 定 给 出 每 行 的 字 符 长 度 数 后 加“X” 后 ,再 给 出 最 大 行 数 ,如AN..40X3)其正则表达式的写法为:(A[N]?)((..)?)([0-9]{1,})(X)([0-9]{1,})该正则表达式分为5部分,(A[N]?),((..)?),([0-9]{1,}),(X),([0-9]{1,}),每一部分用()表示。...原创 2020-12-18 10:51:29 · 238 阅读 · 0 评论 -
正则表达式校验日期时间格式
首先,我们先了解2个概念:1、合法的日期范围: DateTime值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间。2、平年和闰年地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分 46秒。因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688日,故每四年增加一日,这一年有366日,就 是闰年。但四年增加一...原创 2020-12-18 09:30:04 · 28910 阅读 · 5 评论 -
正则表达式匹配非负数字
public static void main(String[] args) throws Exception { String value_str = "0.000"; System.out.println(value_str.matches("([1-9]\\d*\\.?\\d*)|(0\\.\\d*)")); }用于匹配的正则表达式为:([1-9]\d*\.?\d*)|(0\.\d*)([1-9]:匹配1~9的数字;\d:匹配数字,包括...原创 2020-12-18 09:16:51 · 4694 阅读 · 0 评论 -
springmvc 分片上传+进度条
要实现分片上传+进度条,总体思路如下:前端处理:由前端js负责将要上传的文件分片,且定义分片总数,当前分片,每分片大小等参数,然后循环调用后端接口(每上传一次分片,调用一次后端接口,也就是while循环,条件是当前处理的分片小于等于最大分片数)。后端接口:接收到前端传来的每一个分片文件(springmvc下可以用MultipartFile接收文件),以及接收前端传来的分片参数,利用RandomAccessFile来将每一次传来的分片数据写入文件。具体实现:前端可以自定根据以上逻.原创 2020-12-09 14:48:26 · 522 阅读 · 0 评论 -
java序列化,看这篇就够了
目录一、序列化的含义、意义及使用场景二、序列化实现的方式三、序列化版本号serialVersionUID四、总结一、序列化的含义、意义及使用场景序列化:将对象写入到IO流中 反序列化:从IO流中恢复对象 意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。 使用场景:所有可在网络上传输的对象都必须是可序列化的,比如RMI(remote method转载 2020-12-09 14:24:03 · 111 阅读 · 0 评论 -
软引用、弱引用、虚引用-他们的特点及应用场景
为什么会有这4种引用Java中的引用的定义很传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。 这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态,对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。 我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。 很多系统的缓存功能都符合这样的应用场景。说白了传统的两种应用没法描转载 2020-11-24 14:38:17 · 195 阅读 · 0 评论 -
一个十六进制转储(dump)工具
// strings/Hex.java // {java onjava.Hex} package onjava;import java.io.*; import java.nio.file.*; public class Hex { public static String format(byte[] data) { StringBuilder result = new StringBuilder(); int n = 0...原创 2020-10-19 15:28:35 · 739 阅读 · 0 评论 -
Java值传递和引入传递
先看以下代码:/** * <p><b>Description:</b> </p> * @author wangzhj * @date 2020年10月14日 */public class T { public static void main(String[] args) { EventModel em = null; doo(em);原创 2020-10-14 16:27:04 · 134 阅读 · 0 评论