
java
文章平均质量分 91
Yanní_G
这个作者很懒,什么都没留下…
展开
-
Java垃圾收集器超详细解析
1.随线程而生的内存程序计数器、虚拟机栈、本地方法栈栈中的栈帧随着方法的进入和退出可以进行自动分配栈帧内存与回收2.堆区内存回收2.1 可达性分析2.1.1 GC Roots虚拟机栈本地变量表中的引用对象,包括传递的参数、局部变量、临时变量等类中静态属性和常量引用的对象(方法区中)本地方法栈中引用的对象虚拟机内部引用synchronize 锁定的对象2.1.2 引用类型与垃圾回收强引用:软引用:内存不够时进行第一次垃圾回收,先保留,看此次收集完之后够不够分配,如果仍然不够再回原创 2021-05-22 22:26:31 · 592 阅读 · 0 评论 -
Java虚拟机字节码执行引擎详解
1. 栈帧结构局部变量表、操作数栈、动态链接、方法返回地址、附加信息2. 局部变量表用于存放方法参数和方法内部定义的局部变量。编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量。局部变量表的容量以变量槽为最小单位,局部变量表中的变量槽是可以重用的。如果访问的是32位数据类型的变量,索引N就代表了使用第N个变量槽,如果访问的是64位 数据类型的变量,则说明会同时使用第N和N+1两个变量槽。对于两个相邻的共同存放一个64位数据 的两个原创 2021-02-22 19:32:41 · 259 阅读 · 0 评论 -
Java虚拟机的类加载机制详解
类的生命周期1. 加载加载过程总览通过一个类的全限定名来获取定义此类的二进制字节流。通过字节流的方式把 .class文件放入MetaSpace在堆中生成一个Class对象,指向这个.class文件的地址动态代理类的加载java.lang.reflect.Proxy或者CGLib都是在运行时生成字节码,也可以把这个直接在堆内存中的字节码加载进到MetaSpace,同样堆中生成一个Class对象指向这块内存。数组类的加载如果数组的元素类型是引用类型,而且这个类还没有被放入MetaSp原创 2021-02-21 19:03:43 · 186 阅读 · 0 评论 -
Java类文件结构详解
类文件结构package com.szu.jvm.learn01_bytecode;/* * @Author 郭学胤 * @University 深圳大学 * @Description * @Date 2021/2/20 13:33 */public class L01_EmptyClass {}下图为一个空文件编译出来的class文件1. 魔数和version前四个字节:CA FE BA BE,类文件固定开头,名字叫做魔数(magic number)第五六七八字节:0原创 2021-02-20 16:36:17 · 288 阅读 · 0 评论 -
Java List详解-从Vector到CopyOnWriteList
Vectorpublic class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ protected Object[] elementData; protected int elementCount;}这是两个核心变量,可以发现Vector的底层容器是一个Obje.原创 2021-02-19 21:59:43 · 497 阅读 · 1 评论 -
Java Map详解-从HashMap到concurrentHashMap
1. HashMap源码注释中有这么一句话:In usages with well-distributed user hashCodes, tree bins are rarely used.意思是说只要hash算法做得好,hash冲突少,红黑树基本用不上属性值一览public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializa.原创 2021-02-19 21:55:59 · 1078 阅读 · 0 评论 -
Java Queue详解-从普通Queue到ConcurrentQueue
队列类关系总览1. ArrayQueue环形队列public class ArrayQueue<T> extends AbstractList<T> { private int capacity; // 对象数组长度 private T[] queue; // 对象数组 private int head; // 头指针 private int tail; // 尾指针}常用方法代码很简单,不多赘述,一看就能明白。不支持迭代原创 2021-02-19 21:53:45 · 853 阅读 · 0 评论 -
AQS ReentrantLock ReentrantReadWriteLock CountDownLatch源码阅读
1. AQS源码阅读1.1 AQS简介AbstractQueuedSynchronizer 简称AQS,是实现JUC包中各种锁的关键,此类是一个模板类,具体的ReentrantLock、CountDownLatch、ReadWriteLock等等都是自己去实现里边变量的使用规则。各种类型的锁都有自己的锁类型信息比如ReadWriteLock就肯定会有当前的锁状态是读锁模式还是写锁模式static final Node SHARED = new Node(); // 当前锁状态是 共享锁(读锁原创 2021-02-19 21:30:48 · 197 阅读 · 0 评论 -
Java中的强软弱虚四种引用和ThreadLocal
1 强引用1.1 什么是强引用// 情况1static Object o = new Object();// 情况2public void get(){ Object o = new Object();}就是最普通的创建对象方式,当使用new关键字经过创建对象的三个步骤完成之后,对象o此时就有了一个指向堆内存中这个对象的一个引用。1.2 与垃圾回收的关系1.2.1 什么可以作为GC Root由于Java使用的垃圾回收机制是根可达算法,使用为GC Root的对象都有以下几种原创 2021-02-12 21:27:19 · 363 阅读 · 0 评论 -
select、poll、epoll - IO模型超详解
Linux操作系统有关IO的知识铺垫1. PagecacheLinux内核所使用的的主要磁盘高速缓存。内核读写磁盘的时候都要用到这个PageCache。如果程序想要读的部分不在高速缓存,则先申请一个4KB大小的新页框加到PageCache,然后再用磁盘读到的数据填充。写操作的时候,先把要写的数据写到pageCache,标记当前页面为脏,然后要么程序自己调用系统调用刷盘,要么就等着内核到了自己的默认设置去给你刷回去。如果没有及时写出现了断电,那么你就白写了。2. 文件描述符创建文件描述符,文件描述原创 2021-01-24 20:17:36 · 10596 阅读 · 34 评论 -
JVM 内存模型与线程
1 硬件的效率与一致性为了解决CPU与内存的速度差异,引入了高速缓存,如果有多个CPU而且他们又共享同一主存,所以引入了一个新的问题:缓存一致性。为了解决这个问题,需要CPU在访问缓存时都要遵循一定的协议,比如MESI协议(文末有粗略的解释MESI协议,并未深入研究)。2 Java内存模型每条线程有自己的工作内存(类似于cache),工作内存中包括主存中数据的副本,但是不包括线程私有的局部变量和方法参数。如果局部变量是一个reference,他引用的对象在Java堆中被各个线程共享,但是refe原创 2020-12-09 12:17:25 · 213 阅读 · 0 评论 -
JVM 内存区域和对象创建过程
1. 运行时数据区1.1 程序计数器每条线程都有自己的程序计数器,各条线程之间计数器互不影响,独立存储1.2 Java虚拟机栈每个线程start的时候都会创建一个虚拟机栈,每个方法执行的时候虚拟机为其创建栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。方法调用到执行完毕都是栈中入栈到出栈的过程线程的创建数量是与随着栈内存的增多而减少的:这也很容易理解,线程会有一个私有的虚拟机栈,栈内存越大,虚拟机可以创建的线程数越少。栈中的局部变量表基本数据类型,对象引用(reference原创 2020-12-09 00:03:46 · 203 阅读 · 0 评论 -
JVM 线程安全和轻量级锁、重量级锁、偏向锁及其优化
1. 线程安全的实现方法1.1 互斥同步(悲观锁)synchronized特性重量级,Java线程映射到操作系统内核线程,所以会导致用户态到内核态的切换同一条线程是可重入的monitorenter执行时吧对象的锁计数器加一,monitorexit会把计数器减一,减为0时才真正释放锁无法强制已获取锁的线程释放锁,也无法强制正在等待锁的线程中断或者退出This Monitor 和 Class Monitor根据修饰的方法类型来决定取所在的对象实例this还是取类型对应的Class对象原创 2020-12-08 23:53:44 · 448 阅读 · 0 评论 -
Java线程的定义
1. exec()当进程调用exec()函数时,该进程的执行程序完全替换成新程序,而新程序则从其main()函数开始执行。调用exec()并不创建新进程,前后的进程ID并未改变,只是用磁盘上的新程序替换了当前程序的正文段、数据段和堆栈2. exit()2.1 进程终止的5种正常方式main函数执行return语句,等效于调用exit()调用exit()函数。但是exit()并不处理文件描述符、多进程(父进程和子进程)和作业控制调用_exit或者 _Exit ,目的是为进程提供一种无需运行终止原创 2020-12-05 22:25:28 · 206 阅读 · 0 评论