Java
文章平均质量分 92
讲解一些JAVASE方面的基础核心知识,我们总是会学习一些框架来方便实际开发,因此往往是忽略了最基础的知识,但是真正与人拉开差距的地方还是基础知识,有扎实的基础知识也是非常重要的。
唉.
后端、云计算、大数据
展开
-
ZGC垃圾收集器
1、简述2、原创 2020-12-07 16:24:47 · 1583 阅读 · 0 评论 -
深入理解JIT
文章目录1、简介2、HotSpot编译寄存器和主存3、初级调优:客户模式或服务器模式4、中级编译器调优4.1、优化代码缓存4.2、编译阈值4.3、检查编译过程5、高级编译器调优编译线程1、简介即时编译器,使用即时编译器可加速Java程序执行速度。Java代码执行时候是边解释边执行,执行速度比可执行二进制字节码慢。JIT会将翻译后的机器码保存起来以备下次使用.JIT默认是启用的,JVM读入.class文件解释后发给JIT编译器,JIT编译器将字节码翻译成本机机器代码.JIT工作原理:2、HotSp原创 2020-06-27 21:17:25 · 793 阅读 · 0 评论 -
Java——IO流
文章目录1、IO流四个基本抽象父类2、java.io.File类中一些方法的作用3、FileInputStream从父类继承的如下几个方法4、FileOutputStream从父类继承的如下几个方法5、一些流的用法5.1、FileInputStream5.2、FileOutputStream5.3、FileReader5.4、FileWriter5.5、BufferedInputStream5.6...原创 2019-12-07 23:28:26 · 294 阅读 · 0 评论 -
Java——GC
文章目录1、GC简介2、GC四大算法2.1、总体概述2.2、四大算法引用计数法复制算法标记清除标记压缩2.3、总结1、GC简介GC是分代收集算法特点:次数上频繁收集Young区次数上较少收集Old区基本不动元空间2、GC四大算法2.1、总体概述JVM在进行GC的时候,并非每次都对上面三个内存区域一起回收的,大部分时候回收都是指新生代。因此GC按照回收的区域又分为了两种类型,...原创 2019-12-06 13:28:14 · 139 阅读 · 0 评论 -
Java——JVM(二)
文章目录三、堆参数调优入门3.1、Java垃圾收集3.2、堆内存调优三、堆参数调优入门3.1、Java垃圾收集Java7Java8JDK1.8之后就将最初的永久代取消了由元空间取代。Java8中永久代已经被移除,被一个称为元空间的区域所取代。元空间的本质和永久代类似。元空间与永久代之间最大的区别在于:永久代使用的JVM的堆内存,但是Java8以后的元空间并不在虚拟机中而是使用本...原创 2019-12-06 11:28:30 · 136 阅读 · 0 评论 -
Java——JVM(一)
文章目录一、JVM体系结构1.1、JVM位置1.2、JVM体系结构概览1.3、类加载器1.4、双亲委派1.5、Native本地接口1.6、PC寄存器1.7、Method Area方法区1.8、Stack1.9、栈帧中保存的数据1.10、栈运行原理1.11、栈+堆+方法去的交互关系二、堆体系结构概述2.1、堆简介2.2、Heap堆(Java7之前)2.3、新生区2.4、Sun HotSpot内存管理...原创 2019-12-05 12:58:02 · 457 阅读 · 1 评论 -
Java——JUC深入理解
文章目录1、八锁问题2、生产者消费者问题3、Condition演示4、Callable演示本文涉及代码以上传到https://github.com/xtxxtxxtx/JUC_JVM1、八锁问题锁也是我们在编写多线程程序时候不可避免的一个话题,那么问题来了,如何确定要使用的锁。何时上锁何时释放锁,并且加上static修饰之后运行结果会有什么区别。这只是一个简短的demo示例:public...原创 2019-12-03 23:31:07 · 681 阅读 · 0 评论 -
Java——JUC初识
文章目录1、简介2、线程3、Lambda表达式4、锁分段机制ConcurrentHashMap本文涉及到的代码已经上传到https://github.com/xtxxtxxtx/JUC_JVM1、简介在Java中,线程部分是一个重点,本文JUC也是关于线程的,JUC是(java.util.concurrent)工具包的简称,这是一个处理线程的工具包,JDK1.5之后出现的,接下来简要介绍一下...原创 2019-12-03 08:07:55 · 244 阅读 · 0 评论 -
互斥锁(上):解决原子性问题
在前面的文章中提到,一个或者多个操作在CPU执行的过程中不被中断的特性叫做“原子性”。前一篇文章中说到应该如何解决有序性和可见性的问题,就是借助volatile,final,synchronized等关键字,或者Happens-Before的六大原则来解决。原子性问题到底该如何解决???原子性问题的源头是线程切换,如果能够禁用线程切换就能解决这个问题。。操作系统做线程切换是依赖CPU中断的,...原创 2019-08-24 20:16:31 · 187 阅读 · 0 评论 -
JVM优化Java代码时都做了什么?
专栏的前几篇文章了解了JVM的内存模型,GC调优的思路,让我们对于Java底层有了一定的了解,那么采用这种思路去提高JVM的性能,减少JVM额外消耗的同时,JVM究竟做了哪些工作,使我们的Java代码得到了优化呢?今天主要将关于Java的生命周期和JVM运行时候的优化方法进行一下描述,让大家知道JVM优化时,究竟在Java运行中,JVM究竟做了什么???简述Java程序运行起来之后,JVM对...原创 2019-08-05 21:20:43 · 1083 阅读 · 0 评论 -
请介绍类加载过程,什么是双亲委派模型?
前面的文章已经介绍过很多关于JVM、线程方面的相关知识了,这是都是在面试中很容易被问到的,之后还会介绍GC调优,分布式事务,SQL锁等相关知识。希望大家可以在一起多交流交流,能够多学一点东西。今天介绍一下类加载过程和双亲委派模型。概述一般来说,Java类加载过程分为三个主要步骤:加载、链接、初始化。接下来,对这三个方面简要介绍一下:1、加载是Java将字节码数据从不同的数据源中读取到JV...原创 2019-07-27 16:49:09 · 566 阅读 · 0 评论 -
"等待-通知"机制优化循环等待
专栏的上一篇文章介绍过在破坏占用且等待条件的时候,如果转出和转入账本不满足同时在文件架上时就要使用循环的方式来循环等待,核心代码如下: // ⼀次性申请转出账⼾和转⼊账⼾, 直到成功 while(!actr.apply(this, target)) ;如果apply()操作耗时非常短并发冲突量也不是很大,还是可以使用的,因为循环几次或者几十次就能一次性获取转出账户和转入账户了。但是如果...原创 2019-08-26 19:33:45 · 264 阅读 · 0 评论 -
谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
JVM这个话题是面试的时候经常问到一个难点,今天将会从内存管理的角度来介绍一下jvm,垃圾收集机制为我们打理了很多繁琐的事情,但是也仍然不是万能的,懂得JVM的内部内存结构,工作机制,是设计高扩展性应用和诊断运行时问题的基础。今天的问题是,从内存角度看,哪些区域会产生OutOfMemoryError概述通常会将JVM内存划分为几个方面:第一,程序计数器(PC)。在JVM中,每个线程都有自己...原创 2019-07-26 22:04:11 · 1171 阅读 · 0 评论 -
互斥锁(下):如何用一把锁保护多个资源?
上一篇文章中提到一把锁可以保护多个资源,受保护资源和锁之间合理的关联关系应该是N:1的关系,阐述了如何正确保护一个资源,但是如何正确保护多个资源没说。最后说到两把锁保护两个资源,一个this一个所属类,但是不互斥会造成并发问题。。。产生问题最主要的原因是this对象和所属类存在必然关联关系。当我们要保护多个资源时,首先要区分这些资源是否存在关联关系。。。保护没有关联关系的多个资源现实世界中...原创 2019-08-24 21:22:09 · 371 阅读 · 0 评论 -
一不小心就死锁了——怎么办?
上一篇文章中,用Account.class做互斥锁来解决银行中的转账问题,虽然不存在并发问题但是所有操操作都是串行的,其实在现实世界里是可以并行的,使用串行操作导致性能太差。。互联网支付盛行的现在,如果所有的交易操作都是串行的那么性能完全不能接受。。下面尝试将性能进行优化。。向现实世界要答案现实世界里,账户转账操作是支持并发的而且绝对是真正的并行,银行所有窗口都可以做转账。只要能仿照现实世...原创 2019-08-25 20:31:50 · 238 阅读 · 0 评论 -
可见性、原子性和有序性问题:并发编程Bug的源头
可见性、原子性、有序性,往往这些多线程的三要素都会出现在高级编程知识中。并且涉及到了很多操作系统的知识,如果多操作系统不是很熟悉的话,就会出现很多的问题。。。多线程编程经常会出现一些玄学问题,所以编写正确的并发程序是一件极困难的事情,今天就重点来聊聊这些Bug的源头。。。并发程序幕后的故事这些年,我们的CPU、内存、I/O设备都在不断迭代,不断朝着更快的方向努力。但是还是有一个核心矛盾一直存...原创 2019-08-21 21:57:18 · 247 阅读 · 0 评论 -
Java内存模型:看Java如何解决可见性和有序性问题
专栏的上一篇文章简单介绍了一下导致原子性、可见性、有序性的很容易看到的问题(可能是违背我们的意愿的出现),现在来说一下如何解决其中的可见性和有序性导致的问题,引出了今天的问题——Java内存模型。Java内存模型,不要和JVM内存模型混淆,但是二者确实是有联系的,Java内存模型更倾向于Java并发方面的知识,JVM内存模型在Java方面全都会涉及的。。。什么是Java内存模型之前提到过vo...原创 2019-08-22 12:06:03 · 171 阅读 · 0 评论 -
谈谈Spring Bean的生命周期和作用域?
在企业应用开发软件中,Java是毫无争议的主流语言,开放的Java EE规范和强大的开源框架功不可没,其中Spring是企业软件开发的事实标准之一。本文主要来看一下Spring的典型面试题,谈谈其中部分设计细节。。。典型回答Spring Bean生命周期比较复杂,可以分为创建和销毁两个过程。首先创建Bean会经过一系列步骤主要包括:实例化Bean对象设置Bean属性通过Aware接口...原创 2019-09-08 15:10:15 · 524 阅读 · 0 评论 -
Java向上转型和向下转型
相信学Java的人在学习的时候都了解过向上转型和向下转型,但是很多人有的时候都分不清哪个是向上转型哪个是向下转型,因此本文给大家简单介绍一下,希望能对大家有帮助。。。向上转型:父类引用指向子类对象。。向下转型:子类引用指向父类对象。。举例说明:Father是父类,Son是子类。。Father f1 = new Son(); // 这个叫做upcasting(向上转型), 现在f1引用指...原创 2019-09-11 20:14:38 · 204 阅读 · 0 评论 -
String、 StringBuffer、 StringBuilder的区别
典型回答String是Java语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的Immutable类,被声明成为final class,所有属性也都是final的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的String对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。StringBufer是为解决上面提到拼接产生太多中间对象的问...原创 2019-07-18 16:00:35 · 168 阅读 · 0 评论 -
谈谈你的GC调优思路?
上一篇专栏简单介绍了一下GC,使我们对Oracle JDK的GC有一定的了解,有Serial GC这种古老简单的单线程计算模式,也有CMS并行计算收集机制,还有新型调优思路G1 GC。之后我们又介绍了单线程集中式的GC流程。简单来说,就是程序运行的过程中,对当前周期使用到堆内部的对象实训,进行标记,其他进行清除不断循坏,并且在这个过程中进行一定的内存管理。最后成为老年代。而老年代的GC不论是诞...原创 2019-07-31 21:49:23 · 249 阅读 · 0 评论 -
什么情况下Java程序会产生死锁?如何定位、修复?
初步了解:死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,大多都是聚集在多线程场景中的死锁,指两个或多个线程之间,由于互相有对方需要的锁,而永久处于阻塞状态。下图理解基本的死锁:定位死锁最常见的方式就是利用jstack等工具获取线程栈,然后定位互相之间的依...原创 2019-07-23 01:27:07 · 599 阅读 · 0 评论 -
一个线程两次调用start()方法会出现什么情况?
问题的引入: 一个线程两次调用start()方法会出现什么情况?谈谈线程的生命周期和状态转移。初步了解Java线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误。关于线程生命周期的不同状态,在Java 5之后线程状态被明确定义在其公共内部枚举类型java.lang.Thread.State...原创 2019-07-22 22:54:16 · 492 阅读 · 0 评论 -
并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue的区别
初步了解有的时候将并发包下面的所有容器习惯叫作并发容器,但是严格来讲类似ConcurrentLinkedQueue这种“Concurrent”容器才是真正代表并发。两种的区别:Concurrent类型基于lock-free,在日常的多线程访问场景,一般可以提供较高吞吐量。而LinkedBlockingQueue内部则是基于锁,并提供了BlockingQueue的等待性方法。不知道大家...原创 2019-07-23 23:07:45 · 322 阅读 · 0 评论 -
final、 finally、 finalize的区别
初步了解典型回答final可以用来修饰类、方法、变量,分别有不同的意义, final修饰的class代表不可以继承扩展, final的变量是不可以修改的,而final的方法也是不可以重写的( override)。finally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock锁...原创 2019-07-16 17:48:51 · 193 阅读 · 0 评论 -
使用ASM的Java字节操作步骤
文章目录1、简介2、依赖3、ASM API基础知识<1>、基于事件的API<2>、基于树的API4、使用基于事件的ASM API<1>、使用字段<2>、使用方法<3>、使用类5、使用修改后的类<1>、使用TraceClassVisitor<2>、使用Java Instrumentation6、结论1、简介本篇文...原创 2019-07-18 22:22:18 · 895 阅读 · 0 评论 -
动态代理是基于什么原理?
典型回答反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省( introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。动态代理是一种方便运行时动态构建代理、动态处理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装RPC调用、面向切面编程(AOP)。实...原创 2019-07-18 17:25:43 · 245 阅读 · 0 评论 -
Exception和Error的区别
初步了解以一道在面试中经常被问到的面试题入手:请对比Exception和Error,另外,运行时异常与一般异常有什么区别?Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以抛出(throw)或者捕获(catch),是异常处理机制的基本组成类型。Exception和Error体现了Java平台设计者对不同异常情况的分类。Excep...原创 2019-07-16 13:18:50 · 524 阅读 · 0 评论 -
ConcurrentHashMap如何实现高效的线程安全
此前已经介绍了Java集合框架的典型,并且也分析了比较流行的Map实现方法HashMap,让大家进一步的了解了使用方法和底层原理,并且简单讲述了线程方面的问题,此文章将主要围绕线程,亦或是并发的角度去介绍。之前所介绍大多数都是线程不安全的,但也有像HashTable这样安全,但是性能很差,成本很高的,所以Java内部也提供了并发包,为高度并发需求提供了更加全面的工具支持。那么,应该如何保证线程...原创 2019-07-11 21:12:06 · 710 阅读 · 0 评论 -
JavaIO流及NIO如何实现多路复用
初学Java的时候大家都会接触到各种各样的IO流,IO流的扩展方式是多种多样的,并且流的相关知识也是非常重要的,在面试和实际开发时候用的也是很多的,现在主要的来介绍一下IO流。简介Java IO流方式多种多样,可以从IO抽象模型和交互方式,进行简单的划分。第一,传统的java.io包,完全基于流模型实现,提供了一些我们熟知的IO功能,比如File抽象、输入输出流等等。交互方式是同步、阻塞的方...原创 2019-07-11 20:25:06 · 1077 阅读 · 0 评论 -
HashTable、HashMap、TreeMap的区别
在不考虑线程安全使用的时候,HashMap使用的时候居多,是因为它具有的api都很直接很方便,在面试的时候这些集合属性也是面试的焦点,但是也多半是问一下线程安全方面的问题,对比之间的不同,现在不会主要去讲述线程安全,而是从基础的角度出发,对这三种集合属性进行一下简单的介绍。简介三者都是一些常见的集合属性的具体实现,以键值对的方式进行存储并进行对数据的操作。HashMap是应用十分广泛的一个哈...原创 2019-07-11 20:11:16 · 453 阅读 · 0 评论 -
Vector、 ArrayList、 LinkedList区别
对比Vector、 ArrayList、 LinkedList有何区别?典型回答:这三者都是实现集合框架的List,就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。Vector是Java早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,...原创 2019-07-19 13:14:19 · 120 阅读 · 0 评论 -
Executors与线程池:如何创建正确的线程池
在很多公司的面试中,线程池的题目往往都是比较多且较难的,并且线程相关的对象和其他业务API是不相同的,区别在于一个直接操作操作系统,使用的是操作系统相关的API,一个单纯只占用内存。从Java核心技术专栏线程中的相关知识我们可以知道,线程产生与销毁都会消耗一定的性能,因此要避免频繁的创建与销毁。因此解决这个问题的关键就是创建线程池。概述线程池的需求很普遍,从一般使用的池化角度来看:当需要资...原创 2019-07-24 12:51:53 · 487 阅读 · 0 评论 -
Java常见的垃圾收集器有哪些?
在专栏中总结一下GC调优的相关思路和解决措施,本篇专栏将对GC有一个入门的概念介绍,下一篇专栏将更一步的去写GC的调优和核心思路。垃圾收集机制是Java的招牌能力,极大地提高了开发效率,并且目前也在不断的发展,这也是面试的热点。问题是:Java常见的垃圾收集器有哪些?概述实际上,GC是和具体JVM实现紧密相关的,不同厂商(IBM、Oracle),不同版本的JVM,提供的选择也不同。接下来主...原创 2019-07-31 17:34:01 · 700 阅读 · 0 评论 -
synchronized底层如何实现?什么是锁的升级、降级?
初步了解:先来简单复习一下之前的知识,synchronized代码块是由一对儿monitorenter/monitorexit指令实现的,Monitor对象是同步的基本实现单元。在Java6之前,Monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户状态到内核状态的切换,所以同步操作是一个无差别的重量级操作。现代的(Oracle)JDK中,JVM对此进行了很大的改进,提供了三...原创 2019-07-22 13:13:23 · 447 阅读 · 0 评论 -
synchronized和ReentrantLock的区别
初步了解:synchronized是Java内建的同步机制,所以也有人称其为Intrinsic Locking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里。在Java 5以前, synchronized是仅有的同步手段,在代码中, synchronized可以用来修饰方法,也可以使用在特定的代码块儿上,本质上synchronized方法等...原创 2019-07-21 12:06:55 · 197 阅读 · 0 评论 -
有哪些方法可以在运行时动态生成一个Java类?
之前的文章中,提到了动态代理,先举一个比较常见的应用场景,在JPA中仅仅是实现了Jps两个接口,就自动生成了类,帮助我们完成Sql基本操作,并且层层封装,从配置、驱动、到SQL语句的写入都帮我们完成,换句话说,动态的生成了一个方法完成了操作,这也就是动态代理操作,但是文章中并没有很仔细的进行说明,因此在本文中将进行深入的分析。概述我们从原始的java类来进行源分析,通常是我们编写完程序,调用j...原创 2019-07-25 01:18:03 · 1014 阅读 · 0 评论 -
强引用、软引用、弱引用、幻象引用的区别和使用场景
典型回答不同的引用类型,主要体现的是对象不同的可达性状态和对垃圾收集的影响。所谓强引用( “Strong” Reference),就是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为null,就是可以被垃圾收集的了,当然具体回收时机还是要看...原创 2019-07-18 00:24:33 · 471 阅读 · 0 评论 -
如何监控和诊断JVM堆内和堆外内存使用?
专栏的上一篇文章介绍了JVM内存区域的划分,总结了相关的一些概念,今天的专栏将结合JVM参数、工具等方面,进一步分析JVM内存结构,包括外部资料相对较少的堆外部分。今天我想要大家的问题是:如何监控和诊断JVM堆内和堆外内存使用?概述了解JVM内存方法有很多,具体能力范围也有区别,简单总结如下:可以使用综合性的图形化工具,如JConsole、 VisualVM(注意,从Oracle JDK...原创 2019-07-29 20:50:31 · 1550 阅读 · 0 评论 -
AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
本文主要围绕CAS技术来说一下,分析并发包的内部结构,看看内部结构、线程池是基于哪一种原理实现的。今天问题主要是:AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?概述AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS(compare-and-swap)技术CAS(compare-and-swap...原创 2019-07-24 17:23:07 · 438 阅读 · 0 评论