jvm
astronaut233
这个作者很懒,什么都没留下…
展开
-
枚举根节点 GC
GC Roots 枚举根节点描述:GC Roots 被虚拟机用来判断对象是否存活。一、可以做为GC Roots的对象位置 对象虚拟机栈 栈帧中的本地变量表本地方法栈 JNI(一般指的Native方法)引用的对象方法区 静态属性引用对象方法区 常量引用对象二、枚举根节点可达性分...转载 2019-02-27 18:33:12 · 271 阅读 · 0 评论 -
深入理解java虚拟机(二)jvm 垃圾收集器
可达性分析使用可达性分析来判断对象的存活,基本思路就是通过一系列成为“GC Roots”的对象作为起点,从这些起点开始向下搜索,搜索到所走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的比如图中Object5,6,7,虽然之间有关系,但是GC Roots不可达,所以他们将会被判断为可回收的对象。可作为GC Roots的对象有:虚拟机栈中引...原创 2019-03-01 16:13:57 · 133 阅读 · 0 评论 -
深入理解java虚拟机(一)java内存区域和内存异常
java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来写得好 jvm内存区域划分java的虚拟机(jvm)是运行java程序的地方,主要分为五部分:方法区,堆,虚拟机栈,本地方法栈和程序计数器程序计数器:是当前线程所执行的字节码的行号指示器,每个线程都需要有一个独立的程序计数器,为了线程切换后能恢复到正确的执行位置。...原创 2019-02-26 18:45:08 · 140 阅读 · 0 评论 -
深入理解java虚拟机(三)虚拟机类加载机制
1虚拟机类加载机制的概念虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化。最终形成可以被虚拟机最直接使用的java类型的过程就是虚拟机的类加载机制。Java语言的动态加载和动态连接另外需要注意的很重要的一点是:java语言中类型的加载连接以及初始化过程都是在程序运行期间完成的,这种策略虽然会使类加载时稍微增加一些性能开销,但是会为java应用程...原创 2019-03-10 17:48:33 · 116 阅读 · 0 评论 -
深入理解java虚拟机(四)java内存模型和线程
硬件的效率与一致性由于计算机的存储设备和处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存Cache来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速的执行,当运算结束后再从缓存同步回内存中,这样处理器就无须等待暖man的内存读写了。而这样就会引起“缓存一致性”的问题,因为在多处理系统中,每个处理器都...原创 2019-03-10 19:28:15 · 180 阅读 · 0 评论 -
深入理解java虚拟机(五)线程安全与锁优化
线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的。Java语言中的线程安全这里讨论的线程安全,就限定于多个线程之间存在共享数据访问的这个前提。按照线程安全的“安全程度”由强到弱排序,可以把Java中各个操作共享的数据分为...原创 2019-03-11 15:57:19 · 270 阅读 · 0 评论 -
ThreadLocal可能引起的内存泄露
ThreadLocal原理ThreadLocal的原理:每个Thread内部维护着一个ThreadLocalMap,它是一个Map。这个映射表的Key是一个弱引用,其实就是ThreadLocal本身,Value是真正存的线程变量Object。也就是说ThreadLocal本身并不真正存储线程的变量值,它只是一个工具,用来维护Thread内部的Map,帮助存和取。注意上图的虚线,它代表一...原创 2019-03-18 16:45:50 · 272 阅读 · 0 评论