深入理解JVM虚拟机
qq_27378875
哈哈
展开
-
深入理解Java虚拟机-JVM内存泄漏
JVM内存泄漏内存泄漏就是存在一些对象没有被回收,这些对象是可达的,但是这些对象是无用的,那么这些对象就存在内存泄漏,即不会被GC回收但是却占用内存。内存溢出主要分为以下几种: 1.静态集合类引起内存泄漏:像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着 ...原创 2018-07-23 11:45:54 · 215 阅读 · 0 评论 -
CMS收集器与G1收集器
CMS(Concurrent Mark Sweep): 以获取最短回收停顿时间为目标的收集器,是基于“标记-清除”算法的,整个四个步骤包括: (1)初始标记 (2)并发标记 (3)重新标记 (4)并发清除 初始标记和重新标记仍需要"Stop The World"(暂停工作线程),初始标记仅仅标记下GC Roots能直接关联到的对象,速度很快,并...原创 2018-08-03 11:54:06 · 221 阅读 · 0 评论 -
JVM调优和监控指令
jps:显示虚拟机系统内所有虚拟机的进程jstat:用于收集虚拟机各方面的运行数据jinfo:显示虚拟机配置信息jmap:生成虚拟机的内存转储快照(heapdump文件)jhat:分析heapdump文件jstack:显示虚拟机的线程快照 栈溢出:例如递归调用方法或者开启栈上分配后不停的调用小对象堆溢出:不断的创建大的对象Run/Debug Run:VM arg...原创 2018-08-02 13:53:39 · 149 阅读 · 0 评论 -
深入理解JVM虚拟机-锁优化
JVM中使用到的锁优化技术主要包括:自旋锁和适应性自旋锁、锁消除、锁粗化、轻量级锁、偏向锁1.自旋锁和自适应锁:当一个线程执行耗时小的一小段同步代码,另一个线程可以不放弃处理器的执行时间,等待看看持有锁的线程是否很快就会释放锁,为了使线程等待,可以让线程执行忙循环(自旋),自适应自旋是指自旋的时间不在确定了,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态决定,以及总共在该锁自旋成功的...原创 2018-07-26 16:01:22 · 360 阅读 · 0 评论 -
volatile关键字详解
转载自:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要...转载 2018-07-25 16:35:06 · 98 阅读 · 0 评论 -
深入理解JVM-Java内存模型与线程
主要考虑线程、工作内存和主内存三者的关系,关于变量在工作内存和主内存的同步,JVM定义了8种原子操作:lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。 unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。 read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用...原创 2018-07-25 15:53:51 · 262 阅读 · 0 评论 -
深入理解JVM虚拟机-虚拟机类加载机制
1.类加载:加载、验证、准备、解析、初始化(clinit)注意:类的初始化和实例化不同,初始化只是将Class文件加载到方法区,只初始化了静态块和静态变量,未掉用构造函数,类的加载只进行一次,但是实例化是创建对象,可以多次创建并且javap查看指令,在构造函数内部<init>使用<invokespecial>初始化实例域和构造函数,可以多次进行2.需要进行类加载的五...原创 2018-07-25 13:58:50 · 157 阅读 · 0 评论 -
深入理解JVM虚拟机-垃圾收集器
垃圾收集器算法和垃圾收集器(新生代、老生代)一.对象及引用1.判断对象是否存活的方法:引用计数法和可达性分析算法引用计数法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1,任何时刻计数器为0的对象就是不能够再被使用的,可以被回收了,但是该方法不能解决循环引用的问题,目前垃圾回收器不采用这种方法可达性分析法:将一系列称为"GC Roots"的对象作为起始点,从这些...原创 2018-07-24 21:31:30 · 173 阅读 · 0 评论 -
深入理解JVM虚拟机-内存模型和对象创建
一.内存模型 运行时数据区域主要分为程序计数器、虚拟机栈、本地方法栈、堆、方法区(方法区中有运行时常量池区别于Class文件常量池) 程序计数器:当前线程所执行的字节码的行号指示器,通过改变这个计数器的值来选取下一条需要执行的字节码指令,是线程私有的,因为多线程在单CPU上是通过线程切换实现并发的,只有线程私有才能保证切换后恢复原有的执行位置,如果线程正在执行的...原创 2018-07-24 14:19:06 · 116 阅读 · 0 评论 -
Minor GC和Full GC和内存分配策略
1.Minor GC和Full GCMinor GC:发生在新生代上,因为新生代对象存活时间很短,因此Minor GC会频繁执行,执行的速度一般也比较快Full GC:发生在老生代上,老生代对象存活时间长,因此Full GC很少执行2.内存分配策略(一)大多数情况下,对象优先在Eden区分配,当Eden区不够时,发起Minor GC(二)大对象直接进入老年代 -XX:Pret...原创 2018-08-03 14:27:09 · 375 阅读 · 0 评论