- 博客(9)
- 收藏
- 关注
原创 Java中的强软弱虚引用
Java中的强软弱虚引用 强引用 强引用内存示意图: Java中最普遍的引用,比如有个A类,我们使用new关键字去创建A的实例的时候 A a = new A(); 栈中变量a指向堆中A的实例这个引用就是强引用。 public class TestForceReference { public static void main(String[] args) { A a = new A(); // 创建出A的实例对象,变量a指向堆中的A对象实例 System.out.p
2020-11-02 19:48:01
235
原创 Java中对象怎么分配?
Java中对象的分配过程 优先在栈中分配,对象不大,而且对象不会逃逸(对象只会在当前方法中引用)。随着方法调用结束弹栈,对象也就释放了。不需要GC!!! 不满足栈上分配,看这个对象够不够大,够大直接进Old区,由FGC清除对象 这个对象不够直接进Old区,优先分配在TLAB上(其实也是Eden区,JVM为了避免多线程并发分配内存空间进行抢占,提前在Eden区给每个线程单独分配一块内存区域) 如果在TLAB上分配失败了,就会在Eden区进行分配。 ...
2020-10-26 20:36:42
767
原创 对象在内存中的存储布局
对象在内存中的存储布局 普通对象: 在64位虚拟机中: markword占8字节,klasspointer跟虚拟机是否开启指针压缩有关,默认开启,占用4个字节否则是8个字节,instance data 实例数据, padding 一个对象补齐8字节的整数倍。 数组对象 : 相比普通对象,多了一个4字节的长度用来表示数组长度。仅此而已 Markword主要包含对象的三个信息: HashCode GC信息(主要是4位来表示GC年龄) 锁信息 ...
2020-10-26 19:59:25
335
原创 DCL单例要不要加volatile关键字
DCL单例要不要加volatile关键字? 首先得知道volatile关键字的作用,其次什么是单例,最后DCL是怎么实现的单例? (一) volatile关键字在java中用来修饰成员变量,有两个语义: 被volatile修饰成员变量,在多个线程之间可见 volatile禁止指令重排序 (二) 单例,在程序中某个类的实例有且只能有一个。 (三)DCL,Double Check Lock的首字母缩写,实现单例的一种方式 上代码: public class B { private volatile
2020-10-26 19:19:55
297
原创 Java中一个对象的创建过程
Java中一个对象是怎么创建的? 在Java代码层面,创建一个对象最常用的方式就是使用new关键字,那么我们在new某个对象的时候JVM是怎么帮我们创建出来这个对象的呢?今天从ByteCode层面看下其中的奥秘。 A类是个普通的Java类 public class A { private String name = "小明"; private Integer age = 18; public A() { } public A(String name, Integ
2020-10-23 22:27:06
494
原创 网络IO模型之BIO与NIO
BIO模型(Blocking-IO) BIO最大的特点是单线程无法处理并发请求除非每连接每线程。每个请求服务器的客户端,对于服务器来讲,都要开辟一个线程去处理该客户端的IO事件。在操作系统中线程是个开销不小的资源,如果客户端只是与服务器建立了连接,并没有产生IO事件,那么对于服务器来讲,为这个客户端开辟这个线程岂不是在浪费资源?虽然可以使用线程池对服务端进行优化,但是治标不治本图示: 在JAVA中JDK提供了BIO的相关实现-ServerSocket示例代码如下: public class BIOServ
2020-08-16 15:24:11
413
原创 AQS源码(三)
手把手教你阅读AQS源码(三) ReentrantLock的公平锁和非公平锁的释放锁的逻辑从源码层面上来看是相同的,我们跟进源码看下具体流程。 还是之前的调试Demo public class ReentrantLockDemo { public static void main(String[] args) { final ReentrantLock lock = new ReentrantLock(true); try { lock.loc
2020-08-12 20:36:56
132
原创 AQS源码(二)
手把手教你阅读AQS源码(二) 上篇文章笔者从源码层面总结了ReentrantLock的非公平锁加锁流程,这次继续看下ReentrantLock的公平锁如何加锁,这里放一下链接传送门->非公平加锁源码分析 还是老样子,不能调试的源码尽量不要去读,我们先来搞一个公平锁的调试Demo public class ReentrantLockDemo { public static void main(String[] args) { // 构造方法传入true是公平锁的创建方式
2020-08-10 21:43:23
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
4