JavaCore
文章平均质量分 92
MayMatrix
J2EE .
展开
-
java反射性能-调研
在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO、DTO、Entity、DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护。通常情况下,这类转换都是同名属性的转换(类型可以不同),我们更多地会使用 bean copy 工具,例如 Apache Commons BeanUtils、Cglib BeanCopier 等。在使用 bean copy 工具时,我们更多地会考虑性能,有时也需要考虑深浅复制的问题。本文将。转载 2023-03-01 11:35:33 · 1232 阅读 · 0 评论 -
Java8内存模型及溢出场景—永久代(PermGen)和元空间(Metaspace)
从上述结果可以看出,JDK 1.6下,会出现“PermGen Space”的内存溢出,而在 JDK 1.7和 JDK 1.8 中,会出现堆内存溢出,并且 JDK 1.8中 PermSize 和 MaxPermGen 已经无效。方法区也是所有线程共享。注意,这里我指定了堆内存的大小为16M,所以这个地方显示的count=14(这个数字不是固定的),至于为什么会是14或其他数字,需要根据 GC 日志来判断,具体原因会在下篇文章中给大家解释。这段程序以2的指数级不断的生成新的字符串,这样可以比较快速的消耗内存。转载 2023-02-23 15:21:58 · 1864 阅读 · 0 评论 -
Java中transient关键字的详细总结
本文要介绍的是Java中的transient关键字,transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。1. 序列化Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输。转载 2023-02-23 15:13:00 · 270 阅读 · 0 评论 -
Java volatile关键字最全总结:原理剖析与实例讲解
即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。Java中的原子性操作包括:(1)基本类型的读取和赋值操作,且赋值必须是值赋给变量,变量之间的相互赋值不是原子性操作。(2)所有引用reference的赋值操作。转载 2023-02-23 15:11:00 · 145 阅读 · 0 评论 -
Java8虚拟机内存模型JVM
参考资料:《深入理解Java虚拟机 JVM高级特性与最佳实践》第二版。转载 2023-02-23 15:08:53 · 661 阅读 · 0 评论 -
Java 泛型中的通配符
extends Animal>,指定了范围只能是Animal的子类,但是用List,没法做到缩小范围。我们说Java的泛型是伪泛型,那是因为泛型信息只存在于代码编译阶段,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程为类型擦除。首先其实我们并不关心传进来的集合内是什么对象,我们只关系我们需要转换的集合内是什么对象,所以我们传进来的集合就可以用List转载 2023-02-17 17:30:55 · 188 阅读 · 0 评论 -
面向对象设计的五个基本原则:细说 SOLID 原则
在程序设计领域,SOLID是由 Robert C. Martin(敏捷宣言作者之一,曾任敏捷联盟主席)在21世纪早期提出的便于记忆的首字母缩写,指代面向对象编程和面向对象设计的五个基本原则:单一功能、开闭原则、里氏替换、接口隔离以及依赖反转。在这一章我们只关注这些原则各自的定位和它们之间的关系。见下图:概括地讲(下文会具体展开):单一职责是所有设计原则的基础,开闭原则是设计的终极目标。里氏替换原则强调的是子类替换父类后程序运行时的正确性,它用来帮助实现开闭原则。转载 2023-01-09 12:18:42 · 947 阅读 · 0 评论 -
org.apache.http.NoHttpResponseException: failed to respond-服务端响应异常
多次上传文件时,偶尔会出现一次failed to respond异常,但是重试一次又正常了。转载 2022-08-15 10:42:09 · 9827 阅读 · 0 评论 -
java并发编程基础:CLH锁的原理及实现
CLH、MCS 队列锁简介一、自旋锁简介通常情况下解决多线程共享资源逻辑一致性问题有两种方式:互斥锁:当发现资源被占用的时候,会阻塞自己直到资源解除占用,然后再次尝试获取; 自旋锁:当发现占用时,一直尝试获取锁(线程没有被挂起的过程,也就没有线程调度切换的消耗);对于这两种方式没有优劣之分,只有是否适合当前的场景;具体的对比就不在继续深入了,如果你很感兴趣可以查看《多处理器编程的艺术》提取码:rznn ;但是如果竞争非常激烈的时候,使用自旋锁就会产生一些额外的问题:可能导...转载 2021-03-12 16:27:38 · 334 阅读 · 0 评论 -
java并发编程之核心:AQS进阶
如果你想深入研究Java并发的话,那么AQS一定是绕不开的一块知识点,Java并发包很多的同步工具类底层都是基于AQS来实现的,比如我们工作中经常用的Lock工具ReentrantLock、栅栏CountDownLatch、信号量Semaphore等,而且关于AQS的知识点也是面试中经常考察的内容,所以,无论是为了更好的使用还是为了应付面试,深入学习AQS都很有必要。CASCAS是乐观锁的一种思想,它假设线程对资源的访问是没有冲突的,同时所有的线程执行都不需要等待,可以持续执行。如果有冲...转载 2021-03-12 16:21:12 · 141 阅读 · 0 评论 -
java并发编程核心:AQS详解#总结
AQS概述:AQS原理AQS:AbstractQuenedSynchronizer抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制。AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机.转载 2021-03-12 16:17:18 · 196 阅读 · 0 评论 -
java并发编程核心:AQS原理及API
从ReentrantLock的实现看AQS的原理及应用前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQ.转载 2021-03-12 16:15:58 · 209 阅读 · 0 评论 -
Java并发之AQS原理浅析
锁是最常用的同步方法之一,在高并发的环境下激烈的锁竞争会导致程序的性能下降,所以我们自然有必要深入的学习一下锁的相关知识。 在介绍Lock之前,我们需要先熟悉一个非常重要的基础组件,JUC包下的核心基础组件。也是实现大部分同步需求的基础。学习该组件是学习JUC绕不开的一块内容。该组件就是AQS。AQS简介AQS:AbstractQueuedSynchronizer,即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWrite...转载 2020-06-10 15:59:52 · 243 阅读 · 0 评论 -
jstack定位线程堆栈信息【案例汇总】
1.CPU利用率过高,代码定位找到CPU利用率持续比较高的进程, 命令:top找到CPU使用率较高的线程ID(TID):命令:ps p 16480 -L -o pcpu,pid,tid,time,tname,cmd此处为:16498将获取的线程号(十进制数)转换成十六进制printf "%x\n" 16498结果:4072结合进程号和线程号,利用jstack查到异常代码所在行jstack -l <pid> | grep <thr...转载 2020-06-10 10:18:26 · 3502 阅读 · 0 评论 -
Java线程池【二】深入分析,Java线程池实现原理及其在美团业务中的实践
一、写在前面1.1 线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。转载 2020-06-04 11:14:11 · 298 阅读 · 0 评论 -
Java线程池【一】实现原理
1.深入源码分析Java线程池的实现原理程序的运行,其本质上,是对系统资源(CPU、内存、磁盘、网络等等)的使用。如何高效的使用这些资源是我们编程优化演进的一个方向。今天说的线程池就是一种对CPU利用的优化手段。通过学习线程池原理,明白所有池化技术的基本设计思路。遇到其他相似问题可以解决。池化技术前面提到一个名词——池化技术,那么到底什么是池化技术呢?池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等.转载 2020-06-04 11:11:55 · 271 阅读 · 0 评论 -
什么是内存屏障(Memory Barrier)以及在java中的应用
1. 指令重排序程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。内存乱序访问行为出现的理由是为了提升程序运行时的性能。这种内存乱序问题主要是由两种原因引起的:编译器在编译时进行了编译优化,导致指令重排; 在多cpu环境下,为了尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能。在这种模型下会存在一个现象,即缓存中的数据与主内存的数据并不是实时同步的,各CPU(或CPU核心)间缓存的数据也不是实时同步的。这导致在同一个时间点,各转载 2020-06-02 15:05:28 · 2464 阅读 · 0 评论 -
JAVA中的阻塞队列和非阻塞队列-简介
队列是一种数据结构,它有两个基本操作:在队列尾部加入元素和从队列头部移除元素。在我们日常开发中,经常用来并发操作数据。java包中有一些应用比较广泛的特殊队列:一种是以ConcurrentLinkedQueue为代表的非阻塞队列;另一种是以BlockingQueue接口为代表的阻塞队列。通过这两种队列,我们保证了多线程操作数据的安全性。java集合中的Queue继承collection接口,Dueue、LinkedList、PriorityQueue、BlockingQueue等类都实现了它。.转载 2020-05-29 14:21:31 · 997 阅读 · 0 评论 -
Java中的BlockingQueue
1 Java中的阻塞队列1.1 简介一种支持两个附加操作的队列,是一系列阻塞队列类的接口当存取条件不满足时,阻塞在操作处 队列满时,阻塞存储元素的线程,直到队列可用 队列空时,获取元素的线程会等待队列非空 阻塞队列常用于生产者/消费者场景,生产者是向队列里存元素的线程,消费者是从队列里取元素的线程.阻塞队列就是生产者存储元素、消费者获取元素的容器BlockingQueue继承体系阻塞队列不可用时,两个附加操作提供了4种处理方式 抛出异...转载 2020-05-29 14:18:07 · 599 阅读 · 0 评论 -
※HashMap底层实现原理(全)
HashMap底层实现原理(上)本来想先在专栏里简单的说一下二叉树,红黑树的内容后再说HashMap的,但看到评论区里不断的出现HashMap这个词,怕大家等得着急,本篇文章就先说说HashMap吧,前面讲ArrayList和LinkedList时把源码说得很细,只要理解了这两块内容,本篇内容也很好理解,先来看看HashMap在Map这个大家族中的位置。上图中,白色部分是接口,黄色部分是要重点了解的,最好是看一遍源码,绿色部分已经过时,不常用了,但是面试中可能会问到。这里先简单的说一下这几个Ma转载 2020-05-29 12:48:03 · 494 阅读 · 0 评论 -
深入理解HashMap底层原理剖析(JDK1.8) 扩容方法resize()
接下来会从以下几个方面介绍 HashMap 源码相关知识: 1、HashMap 存储结构 2、HashMap 各常量、成员变量作用 3、HashMap 几种构造方法 4、HashMap put 及其相关方法 5、HashMap get 及其相关方法 6、HashMap remove 及其相关方法 7、HashMap 扩容方法 resize() 介绍方法时会包含方法实现相关细节。 先来看一下 HashMap 的继承图: HashMap 根据键的转载 2020-05-29 12:41:59 · 1858 阅读 · 0 评论 -
Java中HashMap底层原理源码分析
在介绍HashMap的同时,我会把它和HashTable以及ConcurrentHashMap的区别也说一下,不过本文主要是介绍HashMap,其实它们的原理差不多,都是数组加链表的形式存储数据,另外本文所介绍的都是JDK1.8版本的。在介绍之前,先看下Map家族的继承体系图:其中,TreeMap是基于树实现...转载 2020-05-07 21:31:09 · 200 阅读 · 0 评论 -
Java高效并发之乐观锁悲观锁、(互斥同步、非互斥同步)
乐观锁和悲观锁首先我们理解下两种不同思路的锁,乐观锁和悲观锁。这两种锁机制,是在多用户环境并发控制的两种所机制。下面看百度百科对乐观锁和悲观锁两种锁机制的定义:乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,原创 2017-02-10 10:48:23 · 79326 阅读 · 6 评论 -
程序员必读书单1.0
原文:http://lucida.me/blog/developer-reading-list/本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。前言Reading makes a full man; conference a ready man; an转载 2016-11-11 10:24:55 · 1133 阅读 · 0 评论 -
JAVA程序员必读之书
1.经典书籍一、Java从入门到精通《Java从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。《Java从入门到精通(第3版)》编辑推荐:“软件开发视频大讲堂”丛书系清华社“视频大讲堂”重点大系之一。该大系包括多个子系列,每个子系列的图书在其同品种的图书中销售名列前茅,二、Java核心技转载 2016-11-11 10:21:48 · 303 阅读 · 0 评论 -
使用本地JConsole监控远程JVM(最权威的总结)
使用本地JConsole监控远程JVM(最权威的总结)问题背景 Tomcat经常崩溃crash,想看看JVM内存使用情况,就想到了用Jconsole监控,以前只是监控本地的JVM,这次要监控远程的,遇到了不少问题。 经过几个小时的努力,参考了众多网友的资料之后,才最终解决了这个问题。 比较坑爹的是,网上的资料,竟然没有一个是:完美无缺的,没有一篇文章提到了“jmxre转载 2015-10-28 17:20:00 · 974 阅读 · 0 评论 -
Java中堆内存和栈内存详解
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器转载 2015-07-21 11:15:33 · 402 阅读 · 0 评论 -
java中堆和堆栈的区别及实例
1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收转载 2015-07-21 11:10:22 · 1529 阅读 · 1 评论 -
Java虚拟机学习 - 体系结构 内存模型
一:Java技术体系模块图二:JVM内存区域模型1.方法区也称"永久代” 、“非堆”, 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。运行时常量池:是方法区的一转载 2015-08-13 21:57:28 · 370 阅读 · 0 评论 -
深入理解JVM—JVM内存模型
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变成了下面的样子转载 2015-08-13 21:54:51 · 269 阅读 · 0 评论 -
Java 多线程 并发编程
一、多线程1、操作系统有两个容易混淆的概念,进程和线程。进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。线程:表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中的线程共用相同的地址空间转载 2016-12-06 10:41:06 · 257 阅读 · 0 评论 -
(java多线程并发)控制并发线程数的Semaphore、ScheduledThreadPoolExcutor、BlockingQueue、ReadWriteLock
控制并发线程数的Semaphore1.简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。2.概念 Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三转载 2016-12-06 11:17:45 · 1633 阅读 · 0 评论 -
java中关键字volatile的作用
volatile让变量每次在使用的时候,都从主存中取。而不是从各个线程的“工作内存”。volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执行的有序性。也就是说,volatile变量对于每次使用,线程都能得到当前volatile变量的最新值。但是volatile变量并不保证并发的正确性。=======...转载 2019-08-28 16:41:07 · 202 阅读 · 0 评论 -
剖析Disruptor:为什么会这么快?(三)揭秘内存屏障(validate关键词解析)
主题是什么?我写这个系列的博客主要目的是解析Disruptor是如何工作的,并深入了解下为什么这样工作。理论上,我应该从可能准备使用disruptor的开发人员的角度来写,以便在代码和技术论文[Disruptor-1.0.pdf]之间搭建一座桥梁。这篇文章提及到了内存屏障,我想弄清楚它们到底是什么,以及它们是如何应用于实践中的。什么是内存屏障?它是一个CPU指令。没错,又一次,我们在讨...转载 2019-08-28 16:59:53 · 402 阅读 · 0 评论 -
AtomicLong与LongAdder对比
前言《阿里巴巴 Java开发手册》读后感—拥抱规范,远离伤害:https://blog.csdn.net/f641385712/article/details/84930279写这篇博文的原因,是因为我今天在看阿里的规范手册的时候(记录在了这里:《阿里巴巴 Java开发手册》读后感—拥抱规范,远离伤害),发现了有一句规范是这么写的:如果是count++操作,使用如下类实现: Atomi...转载 2019-08-28 17:29:40 · 1048 阅读 · 0 评论 -
JDK8 JVM内存模型
正文内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行不同的JVM对于内存的划分方式和管理机制存在着部分差异结合JVM虚拟机规范,来探讨经典的JVM内存布局运行时内存:1 Program Counter Register (程序计数寄存...转载 2019-09-04 08:52:53 · 5479 阅读 · 1 评论 -
Java8内存模型—永久代(PermGen)和元空间(Metaspace)
从jdk开始,就开始了永久代的转移工作,将譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。但是永久在还存在于JDK7中,直到JDK8,永久代才完全消失,转而使用元空间。而元空间是直接存在内存中,不在java虚拟机中的,因此元空间依赖于内存大小。当...转载 2019-09-04 09:48:16 · 179 阅读 · 0 评论 -
源码阅读:全方位讲解LongAdder
高并发下计数功能最好的数据结构就是LongAdder与DoubleAdder,低并发下效率也非常优秀,这是我见过的java并发包中设计的最为巧妙的类,从软硬件方面将java并发累加操作优化到了极致,所以应该我们应该弄清楚它的每一行代码为什么要这样做,它俩的实现大同小异,下面以LongAdder类为例介绍下它的实现。Striped64类public class LongAdder extend...转载 2019-09-05 10:00:50 · 224 阅读 · 0 评论 -
Java中的Unsafe
Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。Unsafe类是"final"的,不允许继承。且构造函数...转载 2019-09-05 09:44:06 · 305 阅读 · 0 评论 -
jdk1.8 LongAdder源码学习
LongAdder是jdk8新增的用于并发环境的计数器,目的是为了在高并发情况下,代替AtomicLong/AtomicInt,成为一个用于高并发情况下的高效的通用计数器。高并发下计数,一般最先想到的应该是AtomicLong/AtomicInt,AtmoicXXX使用硬件级别的指令 CAS 来更新计数器的值,这样可以避免加锁,机器直接支持的指令,效率也很高。但是AtomicXXX中的 CAS ...转载 2019-09-05 09:57:29 · 113 阅读 · 0 评论