JVM
JVM
viqiang1991
这个作者很懒,什么都没留下…
展开
-
java内存模型
注意:JVM内存结构与Java内存模型是不同的概念。JVM内存结构:Java内存模型:操作变量时的规则: Java内存模型规定了所有的变量都存储在主内存 线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝 线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量 从工作内存同步回主内存实现是通过以下的8种操...原创 2020-02-28 17:02:04 · 85 阅读 · 0 评论 -
volatile 关键字
内存可见性由于Java内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。当一个变量被volatile修饰时,任何线程对它的写操作都会立即刷新到...原创 2020-02-23 10:37:47 · 115 阅读 · 0 评论 -
对象的创建与内存分配
创建对象当JVM收到一个new指令时,会检查指令中的参数在常量池是否有这个符号的引用,还会检查该类是否已经被加载过了,如果没有的话则要进行一次类加载。接着就是分配内存了,通常有两种方式:指针碰撞 空闲列表使用指针碰撞的前提是堆内存是完全工整的,用过的内存和没用的内存各在一边每次分配的时候只需要将指针向空闲内存一方移动一段和内存大小相等区域即可。当堆中已经使用的内存和未使...原创 2020-02-23 10:10:36 · 140 阅读 · 0 评论 -
垃圾回收
垃圾回收主要思考三件事情:哪种内存需要回收? 什么时候回收? 怎么回收?对象是否存活(哪种内存需要回收)引用计数法这是一种非常简单易理解的回收算法。每当有一个地方引用一个对象的时候则在引用计数器上 +1,当失效的时候就 -1,无论什么时候计数器为 0 的时候则认为该对象死亡可以回收了。这种算法虽然简单高效,但是却无法解决循环引用的问题,因此 Java 虚拟机并没有采用这种算法...原创 2020-02-23 09:54:13 · 82 阅读 · 0 评论 -
OOM 分析
Java 堆内存溢出在 Java 堆中只要不断的创建对象,并且GC-Roots到对象之间存在引用链,这样JVM就不会回收对象。只要将-Xms(最小堆),-Xmx(最大堆)设置为一样禁止自动扩展堆内存。当使用一个while(true)循环来不断创建对象就会发生OutOfMemory,还可以使用-XX:+HeapDumpOnOutOfMemoryError当发生 OOM...原创 2020-02-23 09:40:03 · 218 阅读 · 0 评论 -
类加载机制
双亲委派模型双亲委派模型中,除了启动类加载器之外,其余都需要有自己的父类加载器.当一个类收到了类加载请求时: 自己不会首先加载,而是委派给父加载器进行加载,每个层次的加载器都是这样。所以最终每个加载请求都会经过启动类加载器。只有当父类加载返回不能加载时,子加载器才会进行加载。双亲委派的好处 : 由于每个类加载都会经过最顶层的启动类加载器,比如java.lang.Object这样的...原创 2020-02-23 09:32:39 · 71 阅读 · 0 评论 -
Java 运行时的内存划分
程序计数器记录当前线程所执行的字节码行号,用于获取下一条执行的字节码。当多线程运行时,每个线程切换后需要知道上一次所运行的状态、位置。由此也可以看出程序计数器是每个线程私有的。虚拟机栈虚拟机栈由一个一个的栈帧组成,栈帧是在每一个方法调用时产生的。每一个栈帧由局部变量区、操作数栈等组成。每创建一个栈帧压栈,当一个方法执行完毕之后则出栈。如果出现方法递归调用出现死循环的话就会造...原创 2020-02-23 09:28:03 · 120 阅读 · 0 评论