
JVM
坚持比努力可怕
这个作者很懒,什么都没留下…
展开
-
深入理解Java虚拟机(1)——JVM内存区域
一.运行时数据区域1.Java虚拟机执行Java程序的过程会把它管理的内存划分为若干个不同的数据区域。其中这些区域包括:方法区、堆、虚拟机栈、本地方法栈、程序计数器、直接内存。线程共享:方法区(方法区中的常量池)、堆线程私有:虚拟机栈、本地方法栈、程序计数器直接内存2.程序计数器(线程私有) 一块较小的内存空间,被视为当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变程序计数...翻译 2018-04-10 09:09:05 · 217 阅读 · 0 评论 -
深入理解Java虚拟机(2)——对象的创建、对象的内存布局和访问定位
一.对象的创建 1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否在常量池中定位到一个类(class)的符号引用,并且检查这个符号引用代表的类(class)是否已经被加载、解析和初始化。如果没有,就必须先执行相应的类加载过程。 类加载检查通过之后,JVM为新生的对象分配内存,对象所需内存的大小在类加载完成后便可完全确定。分配内存等同于把一块确定大小的内存从...翻译 2018-04-10 09:11:20 · 190 阅读 · 0 评论 -
深入理解Java虚拟机(3)——内存溢出异常
一 .实战:OutOfMemoryError异常第一,通过代码验证Java虚拟机规范中描述的各个运行时区域存储的内容。第二,能根据异常的信息判断是哪个区域的内存溢出,知道什么样的代码能导致这些区域的内存溢出,以及出现这些异常应该如何处理。1.Java堆溢出 Java堆用于存储对象实例,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,在对象达到最大堆的容量限制后就会...翻译 2018-04-10 14:25:04 · 191 阅读 · 0 评论 -
深入理解Java虚拟机(4)——对象是否存活
一.垃圾收集器与内存分配策略1.概述(1)Java内存运行时区域的各个部分:程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;(2)栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。因此这几个区域的内存分配和回收都具备确定性。而Java堆和方法区则不同,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有程序处于运行期间时才能...翻译 2018-04-11 09:06:07 · 161 阅读 · 0 评论 -
深入理解Java虚拟机(5)——垃圾收集算法
一.垃圾收集算法(简单介绍思想和发展过程)1.标记—清除 算法 首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象。不足之处:(1)效率:标记和清除两个过程效率不高(2)空间问题:标记清除后会产生大量不连续的内存碎片,空间碎片太多导致以后程序运行时需要分配较大的对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。2.复制算法将可用内存容量划分为大小相等的两块,每...翻译 2018-04-12 09:55:15 · 154 阅读 · 0 评论 -
深入理解Java虚拟机(6)——垃圾收集器
一.垃圾收集器种类新年代:(1)Serial (2) ParNew (3)Parallel Scavenge 老年代:(1)CMS (2)Serial Old(MSC)(3)Parallel Old新年代和老年代:G11.Serial收集器:一个单线程的收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。优点:简单高效,对于限定单个CPU的环境来说,Seri...翻译 2018-04-13 09:22:11 · 199 阅读 · 0 评论 -
深入理解Java虚拟机(7)——内存分配与回收策略
一.内存分配与回收策略1.自动管理最终可以归结为自动化解决了两个问题:(1)给对象分配内存(2)回收分配给对象的内存2.对象内存分配,在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲(TLAB),将按线程优先在TLAB上分配。少数情况下也可能直接分配在老年代中,分配的规则并不是百分之百固定的。3.对象优先在Eden分配对象在新生代Eden区中分配。当Eden区没有足够空间...翻译 2018-04-13 11:24:06 · 267 阅读 · 0 评论