Java
java基础、JVM、GC
Huangy远
github地址 https://github.com/yellowFarLu
展开
-
ThreadLocal全解析——你想要的这里都有
ThreadLocal概念ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以通过ThreadLocal对象查询到绑定在这个线程上的一个值。原理关于ThreadLocal的原理,理清四个角色关系:Thread,ThreadLocal,ThreadLocalMap,Entry在ThreadLocal中有个变量指向ThreadLocalMapThreadLocal.ThreadLocalMap thre原创 2020-06-22 23:03:03 · 391 阅读 · 0 评论 -
类加载器并行加载类 实战及代码解析
类加载器是如何加载一个类的?类加载器如何实现并行加载类?带着这2个问题,我们看下面的内容。类加载过程实战首先,准备一段测试代码,代码中使用应用程序类加载器去尝试加载一个类public class ClassLoaderDemo { public static void main(String[] args) throws Exception { System...原创 2020-04-11 10:43:21 · 846 阅读 · 0 评论 -
BIO、NIO、AIO原理及总结
BIO、NIO、AIO同步阻塞IO(BIO)原理同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。// 客户端import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamRe...原创 2020-04-01 22:13:32 · 360 阅读 · 0 评论 -
池化技术
池化技术概念池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能。在开发过程中我们会用到很多的连接池,像是数据库连接池、HTTP 连接池、Redis 连接池等等。而连接池的管理是连接池设计的核心,我就以数据库连接池为例,来说明一下连接池管理的关键点。数据库连接池数据库连接池有两个最重要的配置:最小连接数和最大连接数,它们控制着从...原创 2020-02-25 00:01:05 · 1087 阅读 · 0 评论 -
内存泄漏及解决方案
内存泄漏定义某些对象或者数据没有利用价值了,但是由于某些原因占用着内存,无法被回收,就造成了内存泄漏。例子:比如说有一个数组对象,占用内存很大,在使用完毕以后,还有强应用引用着该数组对象,那么这块内存就无法回收。内存泄漏种类Java使用的内存种类包含三种,这三种类型的内存都可能发生内存泄漏。堆内存泄漏:如果在JVM中没有足够的内存空间分配给java对象,将会抛出OOM错误。...原创 2020-02-23 19:06:14 · 423 阅读 · 0 评论 -
GC垃圾回收
GC垃圾回收JVM的垃圾回收机制,在内存充足的情况下,除非你显式调用System.gc(),否则它不会进行垃圾回收;在内存不足的情况下,垃圾回收将自动运行判断对象是否要回收的方法引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器减1。当计数器为0的时候,对象就可以被回收。缺点:存在循环引用的情况,导致2个循环引用对象的内存得不到释放。目前没...原创 2020-01-17 10:52:11 · 514 阅读 · 0 评论 -
JMM—详细总结
JMMJava并发的通信机制是通过共享内存实现的。线程之间共享程序的公共状态,线程通过读写内存中的公共状态进行隐式通讯。这对程序员是透明的,我们需要理解其工作机制,以防止内存可见性问题,从而编写出正确同步的代码。同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作。内存可见性问题:java中线程通过共享变量的方式进行通讯,那么一个线程要跟另外一个线...原创 2019-12-29 17:21:30 · 1556 阅读 · 1 评论 -
GC垃圾回收—详细总结
GC垃圾回收JVM的垃圾回收机制,在内存充足的情况下,除非你显式调用System.gc(),否则它不会进行垃圾回收;在内存不足的情况下,垃圾回收将自动运行判断对象是否要回收的方法引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器减1。当计数器为0的时候,对象就可以被回收。缺点:存在循环引用的情况,导致2个循环引用对象的内存得不到释放。目前没有...原创 2019-12-29 17:20:17 · 523 阅读 · 0 评论 -
JVM知识点整理
JVMJava虚拟机在执行java程序的过程中,会把它的内存划分为若干个不同的运行时数据区域,如图所示:程序计数器PC程序计数器是一块较小的内存空间,字节码解释器工作时,就是通过改变这个计数器的值来选取下一条要执行的字节码指令。如果线程执行的是java方法,计数器存储的正在执行的虚拟机字节码地址如果线程执行的是native方法,那么这个计数器值为空(Undefined)为了线程切换...原创 2019-12-26 14:40:05 · 339 阅读 · 0 评论 -
Guava学习:Cache缓存
摘要: 学习Google内部使用的工具包Guava,在Java项目中轻松地增加缓存,提高程序获取数据的效率。一、什么是缓存?根据科普中国的定义,缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。在这里,我们借用了硬件缓存的概念,当...原创 2018-07-22 00:00:00 · 246 阅读 · 0 评论 -
synchronized—深入总结
synchronized传统的锁(也就是下文要说的重量级锁)依赖于系统的同步函数,在linux上使用mutex互斥锁,这些同步函数都涉及到用户态和内核态的切换、进程的上下文切换,成本较高。对于加了synchronized关键字但运行时并没有多线程竞争,或两个线程接近于交替执行的情况,使用传统锁机制无疑效率是会比较低的。在JDK 1.6之前,synchronized只有传统的锁机制,因此给开发者...原创 2019-12-29 17:25:00 · 431 阅读 · 0 评论 -
String字符串—详细总结
String概念不可变的,每一次修改实际上生成新的字符串,并且该字符串的值是修改后的值。new String都是在堆上创建字符串对象String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承)在 Java 8 中,String 内部使用 char 数组存储数据。public final class String implements java.i...原创 2019-12-29 17:23:27 · 751 阅读 · 1 评论 -
类加载机制总结
类加载机制虚拟机把描述类的数据从class文件加载到内存,并且进行校验、解析、初始化。最终形成可以直接使用的Class对象,这就是类加载机制。类加载并不是一次性把所有的class文件都加载到JVM中,而是按照需要来加载。比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。类加载的时机...原创 2019-12-29 17:17:52 · 164 阅读 · 0 评论 -
Java集合总结
Java集合类主要有2大分支,Collection及Map。Collection体系如下:image.pngimage.pngMap体系如下:image.png** 补充图**image.png1、List接口和Set接口都继承自Collection接口,Collection接口继承Iterable接口(Iterable有一个Itera...原创 2018-10-02 21:44:00 · 145 阅读 · 0 评论