Java
文章平均质量分 86
Java 是几乎所有类型的网络应用程序的基础,也是开发和提供嵌入式和移动应用程序、游戏、基于 Web 的内容和企业软件的全球标准。Java 在全球各地有超过 900 万的开发人员,使您能够高效地开发、部署和使用精彩的应用程序和服务。
试剑江湖。
做你没做过的事叫成长,做你不愿意做的事叫改变,做你不敢做的事叫突破。
展开
-
Java 常见经典问题及解析
相关问题不通过 GC ROOT,仍使用引用计数方式,怎么解决它的循环引用问题?快速访问可以通过强、弱引用计数结合方式解决引用计数的循环引用问题,实际上 Android 的智能指针就是这样实现的。...原创 2020-11-12 20:53:54 · 260 阅读 · 0 评论 -
在windows 安装JDK17 指南
在win10 安装jdk17原创 2023-09-04 23:10:51 · 534 阅读 · 0 评论 -
Java RSA加解密算法学习
RSA加密默认密钥长度是1024,但是密钥长度必须是64的倍数,在512到65536位之间即可。RSA加密数据有长度限制,如果加密数据太长(大于密钥长度)会报错,此时的解决方案是 可以分段加密。RSA如果采用分段加密,当密钥对改为2048位时,RSA最大加解密文大小也需要调整:RSA密钥长度=1024时, 最大加密明文长度是117,解密明文长度是128;RSA密钥长度=2048时, 最大加密明文长度是245,解密明文长度是256;原创 2023-04-13 02:00:20 · 3665 阅读 · 0 评论 -
【深入理解JVM】CMS垃圾收集器
GC 问题处理能力能不能系统性掌握?一些影响因素都是互为因果的问题该怎么分析?比如一个服务 RT 突然上涨,有 GC 耗时增大、线程 Block 增多、慢查询增多、CPU 负载高四个表象,到底哪个是诱因?如何判断 GC 有没有问题?使用 CMS 有哪些常见问题?如何判断根因是什么?如何解决或避免这些问题?阅读完本文,相信你将会对 CMS GC 的问题处理有一个系统性的认知,更能游刃有余地解决这些问题,下面就让我们开始吧!前言想要系统性地掌握 GC 问题处理,笔者这里给出一个学习路径,整体文章的框架也转载 2021-02-21 11:01:05 · 237 阅读 · 0 评论 -
Java之JVM内存模型理论
Java并发是一个很大的主题,包含很多方面的知识。本文从内存模型的角度分析,从概念理论上尽量精确理解Java内存模型,及其对并发的影响。1. 前言在计算机技术领域。从冯·诺依曼提出计算机的五大组成部分开始,后来进一步抽象到主要由CPU、内存和I/O组成运转的体系,一直存在的问题就是速度差异巨大且一直存在,表现为 CPU 的速度 > 内存的速度 > I/O 设备的速度。为了充分开发利用计算机的潜能,体系结构、操作系统、编译程序等都做出了改变,比如CPU多核、流水线技术、进程线程概念、数据库转载 2021-03-11 09:01:09 · 198 阅读 · 0 评论 -
Java之JVM体系结构和工作方式
《深入分析Java Web 技术内幕》原创 2020-04-20 09:28:25 · 302 阅读 · 1 评论 -
Java之JVM 垃圾回收算法与 垃圾收集器扫盲
Java 虚拟机 垃圾回收算法,垃圾收集器原创 2020-04-24 11:13:25 · 207 阅读 · 1 评论 -
Java之JVM内存区域与内存溢出异常概述(一)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。原创 2020-07-04 14:42:05 · 242 阅读 · 1 评论 -
【深入理解JVM】JVM垃圾收集器
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的 “高墙”,墙外面的人想进去,墙里面的人却想出来。原创 2020-08-23 23:36:14 · 307 阅读 · 0 评论 -
【深入理解JVM】JVM类加载机制
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。原创 2020-08-19 00:07:59 · 206 阅读 · 0 评论 -
【深入理解JVM】JVM-卡表(Card Table)
我们知道,JVM在进行垃圾收集时,需要先标记所有可达对象,然后再清除不可达对象,释放内存空间。那么,如何快速的找到所有可达对象呢?最简单粗暴的实现,就是每次进行垃圾收集时,都对整个堆中的所有对象进行扫描,找到所有存活对象。逻辑是简单,但性能比较差。简单粗暴的实现方式,通常都是不可取的。那JVM是如何实现快速标记可达对象的?答案是GC Roots。简介现代JVM,堆空间通常被划分为新生代和老年代。由于新生代的垃圾收集通常很频繁,如果老年代对象引用了新生代的对象,那么,需要跟踪从老年代...转载 2020-11-22 15:20:23 · 2224 阅读 · 1 评论 -
【JVM】Idea打包项目以及JVM线上调优
使用 mvn clean package 打包 在有包的路径下,运行jar命令,公式如下 java -server 【jvm的各种调优参数参数】 -jar 第一步上面的jar/war包名字例如: java -server -Xms1024m -Xmx1024m -XX:+UseG1GC -jar推荐博客:Idea打包项目并运行的方式...原创 2019-11-04 17:37:59 · 332 阅读 · 0 评论 -
【深入理解JVM】JVM 运行时数据区域
对于Java程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。原创 2021-01-12 23:11:34 · 145 阅读 · 0 评论 -
【深入理解JVM】JAVA线上故障排查全套路
线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。一、CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用js转载 2020-10-02 16:50:54 · 339 阅读 · 0 评论 -
【深入理解JVM】G1 垃圾收集器
G1垃圾回收器是在Java7 update 4之后引入的一个新的垃圾回收器。G1是一个分代的,增量的,并行与并发的标记-复制垃圾回收器。它的设计目标是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。转载 2021-02-20 23:13:57 · 801 阅读 · 0 评论 -
Java性能调优:利用VisualVM进行性能分析
JVisualVM 简介 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6....转载 2019-10-12 23:32:08 · 315 阅读 · 0 评论 -
Java之深入理解Java虚拟机
阅读《深入理解Java虚拟机》后,收获很多,在阅读过程记录了笔记前言首先,java程序可以“一次编写,到处运行”就是因为有Java虚拟机这个东西作为容器。Java虚拟机作为一个中间层,向上接受由我们编写的代码生成的字节码,向下给机器提供可以被直接执行的目标代码,这就有了Java的“平台无关性”的基础。通过这个定义我们知道,一切可以编译出字节码的语言都可以获得这种“平台无关性”,也就是说像一些类Java语言比如Groovy Scala等,因为用他们也可以生成字节码,所以也可以用Java虚拟机来执行,也转载 2020-11-22 14:21:58 · 253 阅读 · 0 评论 -
Java 之并发编程 Synchronized 同步锁
一个对象是否安全取决于它是否被多个线程访问(访问是访问对象的方式)。要使对象线程安全,name需要采用同步的机制来协同对对象可变状态的访问。(java这边采用synchronized,其他还有volatile类型的变量,显式锁以及原子变量)原创 2020-04-20 18:32:25 · 870 阅读 · 1 评论 -
【并发编程】ThreadLocal类 解决共享变量的问题
1.ThreadLocal简介 “水能载舟,亦能覆舟”,形容ThreadLocal最为贴切,因为它的初衷是在线程并发时,解决变量共享的问题,但是由于过度设计,比如弱引用、哈希碰撞,导致理解难度大,使用成本高,反而成为故障高发点,容易出现内存泄漏,脏数据、共享对象更新等问题。也许你认为它包治共享变量的问题,然而并不是。下面从内...原创 2020-04-01 14:42:09 · 696 阅读 · 0 评论 -
【并发编程】HashMap 实现原理
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初原创 2020-04-26 10:51:08 · 277 阅读 · 0 评论 -
【并发编程】LinkedHashMap
由于 LinkedHashMap 是 HashMap 的子类,所以其具有HashMap的所有特性,这一点在源码共用上体现的尤为突出。因此,读者在阅读本文之前,最好对 HashMap 有一个较为深入的了解和回顾,否则很可能会导致事倍功半。特别地,如果读者需要要深入了解 HashMap注明:以下源码分析都是基于jdk 1.8.0_221一、LinkedHashMap使用与实现HashMap是无序的,也就是说,迭代HashMap所得到的元素顺序并不是它们最初放置到HashMap的顺序。HashMap的转载 2021-01-02 15:07:18 · 937 阅读 · 1 评论 -
【并发编程】wait()和sleep()的区别
sleep()和wait()是使线程暂停执行一段时间的方法。 例如: 当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。并且可以调用notify()方法或者notifyAll()方法通知正在等待的其他线程。notify()方法仅唤醒一个线程(等待队列中的第一个线程)并允许他去获得锁。notifyAll()方法唤醒所有等待这个对象的线程并...转载 2020-04-11 11:14:24 · 213 阅读 · 0 评论 -
【并发编程】Java 线程池
一、概述线程池实现了线程可以复用机制 如果不用类似线程池的容器,每当我们需要执行用户任务的时候都去创建新的线程,任务执行完之后线程就被回收了,这样频繁地创建和销毁线程会浪费大量的系统资源。 优点:线程池通过线程复用机制,并对线程进行统一管理,具有以下优点 降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗; 提高响应速度。当有任务到达时,无需等待...原创 2020-04-16 09:40:40 · 471 阅读 · 0 评论 -
【并发编程】并发编程的基础一
一、Object 的wait()和notify() 方法下图为线程状态的图 Object 对象中的 wait()和notify()是用来实现等待 / 通知模式,等待状态和阻塞状态是不同的,等待状态的线程可以通过notify() 方法唤醒并继续执行,而阻塞状态的线程则是等待获取新的锁。 调用 wait()方法后,当前线程会进入等待状态,直到其他线程调用notify()或notifyAll() 来唤醒。 调用 ...原创 2020-07-06 23:14:20 · 207 阅读 · 0 评论 -
【并发编程】并发编程的基础二
一、什么是多线程的并发编程原创 2020-07-18 17:24:26 · 99 阅读 · 0 评论 -
【并发编程】LockSupport类
1. 前置知识1.1为什么要使用LockSupport?3种让线程等待唤醒的方法:使用Object中的wait()方法让线程等待,使用Object中的notify方法唤醒线程 使用JUC包中Condition的await()方法让线程等待,使用signal()方法唤醒线程 LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程1.2Object类中wait( )和notify( )实现线程的等待唤醒wait和notify方法必须要在同步块或同步方法里且成对出现使用。w...原创 2021-02-13 15:46:59 · 106 阅读 · 2 评论 -
【并发编程】并发进阶
1、Synchronized 关键字(1)说一说自己对于 synchronized 关键字的了解 Synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证它修饰的方法或代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是...转载 2020-04-27 10:20:47 · 221 阅读 · 0 评论 -
【并发编程】Java并发包中锁原理剖析
(1)ReentrantLock和synchronized的相同点原创 2020-04-16 11:32:05 · 183 阅读 · 0 评论 -
【并发编程】HashMap 答疑解惑
1.介绍下 HashMap 的底层数据结构我们现在用的都是 JDK 1.8,底层是由“数组+链表+红黑树”组成,如下图,而在 JDK 1.8 之前是由“数组+链表”组成。2.为什么要改成“数组+链表+红黑树”?主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。3.那在什么时候用链表?什么时候用红黑树?对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后达到9个(阈值8):如果此时数组长度大...转载 2021-02-11 16:38:22 · 270 阅读 · 0 评论 -
【并发编程】AbstractQueuedSynchronizer(AQS)同步器
1. 前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点。2. ReentrantLockReentrantLock支持公平锁和非公平锁,并且R转载 2021-02-14 15:47:09 · 234 阅读 · 0 评论 -
【并发编程】变量可见性线程安全解密
一、什么是并发中变量可见性问题问题1:变量分为哪几种?原创 2020-11-21 08:39:17 · 69 阅读 · 0 评论 -
【并发编程】线程池参数设置与动态调整
人生需要一场马拉松,你可以迟到,但是你不能缺席。转载 2021-01-10 10:27:07 · 1399 阅读 · 1 评论 -
【并发编程】ForkJoinPool 线程池
Java 7 引入了一种新的并发框架—— Fork/Join Framework。同时引入了一种新的线程池:ForkJoinPool(ForkJoinPool.coomonPool)@sun.misc.Contendedpublic class ForkJoinPool extends AbstractExecutorService {}本文的主要目的是介绍 ForkJoinPool 的适用场景,实现原理,以及示例代码。说在前面可以说是说明,也可以说下面是结论:ForkJoinP转载 2021-01-18 11:57:10 · 1919 阅读 · 0 评论 -
【并发编程】谈谈你对锁的理解
本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底层实现浅尝辄止,但是在需要时能够知道去查什么。首先要打消一种想法,就是一个锁只能属于一种分类。其实并不是这样,比如一个锁可以同时是悲观锁、可重入锁、公平锁、可中断锁等等,就像一个人可以是男人、医生、健身爱好者、游戏玩家,这并不矛盾。OK,国际惯例,上干货。转载 2021-02-13 14:46:36 · 434 阅读 · 4 评论 -
【Java基础知识】Maven 的使用
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。转载 2020-03-19 15:15:23 · 185 阅读 · 0 评论 -
【Java基础知识】java调用并执行shell脚本
1. 背景我们在开发过程中,大部分是java开发, 而在文本处理过程中,主要就是脚本进行开发。脚本开发的特点就是在进行批处理的时候非常方便。 前阵子我遇到这么一个需求场景:有一些特殊文件需要特殊环境才能操作,而部署上线后必须要在Linux环境执行,所以一直用Java开始发为主的我们,强大的新势力(Go、Python)估计就很难施展,总不能重新用Go或者Python重新构建项目吧!所以我们需要借助Java的Process类调用shell脚本处理一些任务!2. 理论知识2.1直接Runtime.原创 2021-05-10 00:48:46 · 32062 阅读 · 17 评论 -
【Java基础知识】谈谈你对序列化的理解
0. 前言客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累大量的HttpSession对象,消耗大量的服务器内存,即使用户已经离开或者关闭了浏览器,web服务器仍要保留与之对应的HttpSession对象,在他们超时之前,一直占用web服务器内存资源。web服务器通常将那些暂时不活动但未超时的HttpSession对象转移.转载 2021-03-05 16:02:54 · 181 阅读 · 0 评论 -
【Java基础知识】几种常见的位运算
你将收获可以理解进制的概念可以学会不同进制之间的转换方法可以学会按位与、按位或、按位取反知识可以理解数据的原码、反码、补码是什么原创 2021-01-17 22:54:17 · 250 阅读 · 0 评论 -
【Java基础知识】final 关键字解析
final 修饰类不能被继承 ,方法不能被重写,修饰变量不可更改原创 2021-02-09 15:40:53 · 436 阅读 · 0 评论 -
【Java基础知识】IO 初识
select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长,它是基于bitmap实现的,有连接数限制。poll 具有O(n)的复杂度,本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的。epoll 具有O(1)的复杂度,虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接, epoll使用“事件”的就绪通知方式,所以不会随着FD数目的增加效率下降转载 2021-01-23 23:02:16 · 228 阅读 · 0 评论