JVM
文章平均质量分 74
sofency
stay hungry stay foolish
展开
-
JAVA并发编程的底层实现原理
JAVA代码编译后会变成java字节码,字节码会被类加载器加载到JVM中,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。 Volatile的应用 volatile在多处理器中保证了共享变量的可见性,可见性的意思是当一个线程修改一个共享变量时,另一个线程能读到这个修改的值。如果volatile使用恰当,它比synchroized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。 volatile是如何确保可见性 使用volatil原创 2021-10-06 17:21:27 · 308 阅读 · 1 评论 -
ThreadLocal小结
整理自java多线程核心技术 变量的共享 public static 修饰的变量称为公共的变量,即应用产生的线程不仅可以访问到,而且可以修改(修改就涉及到了线程安全的问题). 存储区域: 这类变量跟随类一样放在方法区,生命力顽强.基本上不会被垃圾回收掉. 弊端: 对于共享的变量要处理好并发修改的线程安全问题. ThreadLocal实现了线程内部的共享变量,即线程内部的共享变量由ThreadLocal它来具体管理 声明改变量时一般为static类型的ThreadLocal 主要的作用就是给每个线程绑定自己的原创 2020-08-07 16:07:00 · 110 阅读 · 0 评论 -
java的对象头信息以及锁升级的过程
主要有三个部分 1.markword 2. 指向类的指针 3. 数组的长度 markword 锁状态 25bit 4bit 1bit 2bit 23bit 2bit 是否偏向锁 锁标志位 无锁 对象的hashcode 分代年龄 0 01 偏向锁 线程ID Epoch 分代年龄 1 01 轻量级锁 指向栈中锁记录的指针 00 重量级锁 指向重量级锁的指针 10 GC 空 11 锁升级的过程 1.当对象被当做同步锁并原创 2020-08-05 13:56:12 · 459 阅读 · 0 评论 -
JVM运行时数据区
JVM虚拟机定义了若干程序运行期间会使用的运行时数据区,其中有一些会随着虚拟机的启动而启动,随着虚拟机的退出而销毁,另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程的开始和结束而创建和销毁。 前面我们介绍过,运行时数据区中包含线程共有的方法区和堆空间,以及线程私有的本地方法栈,虚拟机栈以及程序计数器,下面我们一一介绍这些区域。 程序计数器 又叫做PC寄存器 线程私有的,生命周期和...原创 2020-08-04 10:10:48 · 99 阅读 · 0 评论 -
JVM垃圾回收算法与内存分析
聊到垃圾回收机制:就有必要说下为什么要进行垃圾回收,我们在项目中创建的对象都是在对空间分配内存的。如果程序运行的过程中,已经使用完毕的对象不会在接下来的程序中再使用,那么这块空间就肯定需要释放,不然就会发生内存溢出的异常。因此就需要垃圾回收。 内存溢出和内存泄漏的区别 内存溢出:需要4g内存,但是只支持3g内存,溢出 内存泄漏:定义很多静态变量 垃圾是不会回收的。这个对象没有被引用,再次申请会出现...原创 2020-04-28 19:49:09 · 281 阅读 · 0 评论 -
JVM双亲委派机制,沙箱安全机制
双亲委派机制的原理 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器(Bootstrap ClassLoader)中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。 具体流程: 当AppClassLoader加载一个cla...原创 2020-04-26 23:35:09 · 368 阅读 · 1 评论 -
JVM类加载机制学习
岁月悠悠,哀微只及皮肤;热枕抛却,颓废必致灵魂; 前序 对于JAVA语言来说,创建对象时并在堆上分配好内存,在使用之后,后续的代码不再引用刚创建的对象,那么在堆中的这块空间是由java自己回收的,不需要我们程序员自己去对无用的空间进行回收,但是什么时候回收?内存到达多少的时候启动垃圾回收?分配的运行内存是否合适?什么样的资源需要回收?如何让程序运行的更加高性能? 这就是需要考虑的问题。因此这也是我...原创 2020-04-26 22:30:49 · 173 阅读 · 0 评论