
java
文章平均质量分 66
桃子orz
这个作者很懒,什么都没留下…
展开
-
死锁
简介 两个及以上的线程, 因资源争夺无法继续执行。 四个必要条件 互斥: 在相同时间下, 资源只能被一个进程所持有。 不剥夺: 资源只能被线程主动释放, 不可被抢夺。 请求和保持: 线程请求已被其他线程持有的资源, 无法获取,进入等待模式,且自身持有资源不释放。 循环等待: 存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个进程所请求。 原因 资源争夺 不可剥夺的资源,不足以满足多线程需要, 使得线程间相互争夺而陷入僵局。 推进顺序非法 进程在运行过程中,释放和请求资源的顺原创 2021-04-19 14:47:01 · 121 阅读 · 0 评论 -
JVM垃圾回收GC
垃圾回收介绍 java 的垃圾回收机制,程序员不需要关心内存的申请与释放。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。 回收判断标准 判断标准的最终目的就是判断对象是否还需要使用,如果不再需要使用了就会被回收。 一般有两种方法来判断: 可达性分析算法: 从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引原创 2021-04-07 14:50:54 · 150 阅读 · 0 评论 -
JVM对象创建
图示对象创建主要流程 分配内存 处理并发安全问题 对象的访问定位 Java程序需要通过 JVM 栈上的引用访问堆中的具体对象。对象的访问方式取决于 JVM 虚拟机的实现。目前主流的访问方式有 句柄 和 直接指针 两种方式。 句柄访问 Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据与对象类型数据各自的具体地址信息,具体构造如下图所示: 优势: 引用中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,原创 2021-04-07 10:53:42 · 106 阅读 · 0 评论 -
JVM类加载
类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。 JVM加载Class文件的原理机制 Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。 两种类装载方式: 隐式装载, 程序在运行过程中当碰到通过new 等方式原创 2021-04-06 16:28:19 · 98 阅读 · 0 评论 -
JVM内存管理
JVM 在执行 Java 程序的过程中会将其管理的内存划分为若干个不同的数据区域如下图所示,这些区域各自有不同的不同的用途、创建和销毁时间,有的区域随着虚拟机进程启动而存在,而有的则依赖用户线程的启动和结束而建立和销毁;有些区域是属于线程私有,而另外一些区域则是是线程共享。本篇将将根据各内存区域是属于线程私有还是线程共享将其分为两大类分别进行说明。 线程私有的内存区域 程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间(可能位于cpu的寄存器,有待确认),可以看原创 2021-04-06 15:59:39 · 225 阅读 · 0 评论 -
JVM组成
组成 ClassLoader(类加载器) Runtime Data Area(运行时数据区,内存分区) Execution Engine(执行引擎) Native Interface(本地库接口) 结构图 执行过程 首先需要准备好编译好的 Java 字节码文件(即class文件),计算机要运行程序需要先通过一定方式(类加载器)将 class 文件加载到内存中(运行时数据区),但是字节码文件是JVM定义的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解释器(执行引擎)将字节码翻译原创 2021-04-06 15:48:25 · 91 阅读 · 0 评论