参考的优秀文章

前言

本文是《深入理解Java虚拟机 JVM高级特性与最佳实线》(机械工业出版社)的读书笔记,记录阅读后的部分理解。推荐这本书,深入浅出讲解了Java虚拟机的知识。

疑问及解答

Java运行时有哪几个常用的内存空间?

  • PC寄存器
  • Java虚拟机栈
  • 本地方法栈
  • Java堆
  • 方法区

PC寄存器

PC为Program Counter的意思,用于记录代码执行的位置。Java是支持多线程的,同时可能有多处代码同时执行,每个线程都需记录各自代码执行的位置,因此,PC寄存器是线程私有的。

用栈来存储什么信息?

Java栈是执行方法时用来存放方法执行所需的信息。一个方法的信息存放为一个栈帧(栈的元素)。一个栈帧包含一个方法所需的信息,包括属性,如8大基本类型、引用类型(栈中只存放引用,实际的对象存放在堆中,后面介绍)和返回地址。

为什么使用栈的数据结构来存储?

因为栈的后进先出特性与方法调用的生命周期特性相吻合。看下图,会让你有所启示。

sequenceDiagram
1方法->>2方法: 调用2方法,入栈(先入栈)
2方法->>3方法: 调用3方法,入栈(后入栈)
3方法->>2方法: 3方法执行完毕,出栈(先出栈)
2方法->>1方法: 2方法执行完毕,出栈(后出栈)

堆空间分布的宏观了解

堆的空间分为:

  • 新生代区。主要存放新生代的对象,又可以进一步分为Eden、From Survivor、To Survivor,区如其名,Eden意为“伊甸园”,Survivor意为“幸存者”,他们存放的对象特点相信大家通过其名称能够理解。对象优先在伊甸园分配,对象熬过了一次Minor GC后,可移到幸存区,对象的年龄(age)会加1。
  • 老年代区。一般情况下存放长期存活的对象。
  • 永久代区。用来存放类信息,想想方法区。

有哪些内存回收算法,及其特点

  • 标记-清除算法。标记垃圾对象,然后统一清除。这个算法一个明显的缺点是会造成内存空间不连续。一般用在老年代区。
  • 标记-整理算法。标记垃圾对象,然后整理内存空间,整理出连续的内存空间。此算法为标记-清除算法的优化。一般用在老年代区。
  • 复制算法。将内存中存活对象复制到To survivor区,然后清空该空间,这样就获得了一块连续的内存空间。鉴于此算法的特点,它不适用于存活对象较多的内存空间,所以一般用在新生代区中。

To survivor与From survivor的区别

使用复制算法对新生代区垃圾回收时,首先将Eden中存活对象复制到To survivor(To survivor此时应该是空的),将From survivor超过年龄阀值的对象复制到老年代区,其他未到年龄的存活对象复制到To survivor,然后清空Eden和From survivor空间,这样就得到了连续可用的内存空间了。然后,From survivor和To survivor对换,这样,From survivor装的是幸存对象,To survivor是空的。

附:

  • Eden与Survivor的空间比例默认是8:1,此比例可通过“-XX:SurvivorRatio”参数设置。
  • 对象优先分配到Eden(Eden是“伊甸园”的意思,而伊甸园是人类诞生的地儿),熬过一次Minor GC后,对象被移动到Survivor,对象的年龄加1,到达一定年龄阀值可晋升老年代。年龄阀值可通过“-XX:MaxTenuringThreshold”参数配置。
  • 复制算法一般适用于新生代区的Minor GC,将存活对象复制到To survivor时,如果存活对象较多较大,会出现To survivor空间不足的情况,需要老年代区作担保,所谓担保,就是由老年代区装这些溢出的对象。极端情况下,连老年代区也有可能不够空间,有一个参数“-XX:-HandlePromotionFailure”设置是否允许担保失败。Minor GC前,如果老年代区的空间大于新生代区,则Minor GC是无空间风险的,可以直接进行Minor GC;否则查看参数是否允许担保失败,如果允许,并且老年代区最大可用空间大于历次晋升到老年代区对象的平均大小,则Minor GC;如果不允许,则进行Full GC。

【Java】关于JVM运行时内存空间、JVM垃圾回收机制的更多相关文章

  1. JVM运行时数据区和垃圾回收机制

    最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...

  2. Java运行时内存划分与垃圾回收--以及类加载机制基础

    ----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...

  3. JVM 运行时内存结构

      1.JVM内存模型       JVM运行时内存=共享内存区+线程内存区 1).共享内存区       共享内存区=持久带+堆       持久带=方法区+其他       堆=Old Space ...

  4. JVM运行时内存结构

    原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...

  5. JVM运行时内存组成分为一些线程私

    JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...

  6. [转]JVM运行时内存结构

    [转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...

  7. JVM02——JVM运行时内存

    在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆从 GC 的 ...

  8. 基础篇:JVM运行时内存布局

    目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...

  9. 详细了解JVM运行时内存

    详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...

随机推荐

  1. DateUtils

    package com.vcredit.ddcash.batch.util; import java.text.SimpleDateFormat;import java.util.Calendar;i ...

  2. hdu1201-18岁生日

    Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从 ...

  3. Android课程---Android Studio的一些小技巧

    APK瘦身 在Android Studio中我们可以开启混淆,和自动删除没有Resources文件,来达到给APP瘦身的目的,这对于一些维护很久的老项目比较有用,里面有很多无效的Resource, 删 ...

  4. usaco 2016 Feb 负载平衡

    题目大意:平面上一堆点,用两条平行于坐标轴的直线将其分为四部分,使得点数最多的一部分最少 第一维枚举,第二维三分,点集用两棵树状数组维护 #include<bits/stdc++.h> # ...

  5. C 到C++的升级

    C++所有的变量都可以在需要使用时再定义. C语言中的变量都必须在作用域开始的位置定义. register 关键字请求编译器将局部变量存储于寄存器中 在C语言无法获取register 变量的地址 在C ...

  6. oracle从零开始学习笔记 二

    多表查询 等值连接(Equijoin) select ename,empno,sal,emp.deptno from emp,dept where dept.deptno=emp.deptno; 非等 ...

  7. shopnc导入商品到大商创

    <?php //select member_name user_name,member_mobile mobile_phone,member_email email,member_passwd ...

  8. Echarts3 使用教程

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 快速激活JetBrains PhpStorm WebStorm系列产品

    从官方网站下载正版PhpStorm 安装后,注册时选择“License server” 输入“http://idea.lanyus.com/” (不带双引号,后面的斜杠要带上) 完成 恭喜你 激活Je ...

  10. dubbo源码分析4-基于netty的dubbo协议的server

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...