JVM内存管理笔记

一、内存区域 

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域

Java虚拟机运行时数据区

 程序计数器

        程序计数器是一块较小的内存空间, 它可以看作时当前线程所执行的字节码的行号指示器, 分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成.

Java虚拟机栈

        同程序计数器一样, Java虚拟机栈也是线程私有的, 生命周期同线程一样. 虚拟机栈描述的是Java方法执行的线程内存模型: 每个方法被执行的时候, Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息. 每一个方法被调用直到执行完毕的过程, 就对应着一个栈帧在虚拟机从入栈到出栈的过程.如果线程请求的栈深度大于虚拟机所允许的深度, 将抛出StackOverflowError异常, 如果Java虚拟机栈容量可以动态扩展, 当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常.

本地方法栈

        本地方法栈与虚拟机栈发挥的作用十分类似, 区别在于虚拟机栈为虚拟机执行Java方法(字节码), 而本地方法栈则是为虚拟机使用到的本地方法服务.

Java堆

        Java堆是虚拟机管理的内存中最大的一块, 被所有线程共享, 在虚拟机启动时就创建. 此区域唯一目的就是存放对象实例.

        Java堆是垃圾收集器管理的内存区域, 因此也被称为"GC堆"

        Java堆可以处于物理上不连续的内存空间中, 但是逻辑上应被视为连续的(类似磁盘存储文件).Java堆既可以实现成固定大小的, 也可以是可扩展的. 如果在Java堆中没有内存完成实例分配, 并且堆也无法再扩展时, Java虚拟机会抛出OutOfMemoryError异常.

方法区

        方法区同Java堆一样, 是各个线程共享的内存区域, 用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据.

        Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外, 甚至可以选择不实现垃圾回收.如果方法区无法满足新的内存分配需求时, 将抛出OutOfMemoryError异常.

二、垃圾回收算法

        程序计数器虚拟机栈本地方法栈 三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性。在这几个区域内不需要过多考虑回收的问题,因为方法结束或线程结束时,内存自然就跟随着回收了

        而Java堆方法区 则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样。我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的垃圾收集器 所关注的是这部分内存。

引用计数算法

  Java 中每个具体对象(不是引用)都有一个引用计数器。当一个对象被创建并初始化赋值后,该变量计数设置为1。每当有一个地方引用它时,计数器值就加1。当引用失效时,即一个对象的某个引用超过了生命周期(出作用域后)或者被设置为一个新值时,计数器值就减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。这种方法执行简单, 效率高, 但是难以检测对象之间循环引用, 并且增加了程序开销, 所以并不被主流Java虚拟机所采用.

分代收集理论

弱分代假说

绝大多数对象,在第一次垃圾收集时就会被回收,按照经验法则,这个值高达百分之九十八。

强分代假说

熬过越多次收集过程的对象越难以消亡。

跨代引用假说

三种垃圾回收算法

1.标记-清除

        最基础最直接的算法,标记阶段标记出存活的对象,在回收阶段,将其他对象进行清除。由于要清除的对象在内存空间上不连续,需要多次清除内存,并且,清除内存的时间随回收对象的个数增加,所以执行效率低,此外,回收后内存空间不连续。但是和标记复制算法和标记整理算法相比,不需要花费额外的时间进行复制或整理。并且和标记复制算法相比,不需要额外的空间放置复制的对象。

2.标记-整理

        将标记为存活的对象移动到一端,将剩下的内存一次性清除干净。优点是清除后内存空间连续。缺点是移动对象在时间上有开销

3.标记-复制

        将标记为存活的对象复制到一块连续的内存区域,将剩下的内存一次性清除干净。优点是清除后内存空间连续。缺点是需要预留一部分空间用于存放不被清除的对象,降低了内存的使用率。同时,复制对象也有时间上的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值