一、JVM内存区域

Java虚拟机在运行时,会把内存空间分为若干个区域,根据《Java虚拟机规范(Java SE 7 版)》的规定,Java虚拟机所管理的内存区域分为如下部分:
方法区
堆内存
虚拟机栈
本地方法栈
程序计数器。

1、方法区

方法区主要用于存储虚拟机加载的类信息、常量、静态变量,以及编译器编译后的代码等数据。在jdk1.7及其之前,方法区是堆的一个“逻辑部分”(一片连续的堆空间),但为了与堆做区分,方法区还有个名字叫“非堆”,也有人用“永久代”(HotSpot对方法区的实现方法)来表示方法区。

从jdk1.7已经开始准备“去永久代”的规划,jdk1.7的HotSpot中,已经把原本放在方法区中的静态变量、字符串常量池等移到堆内存中,(常量池除字符串常量池还有class常量池等),这里只是把字符串常量池移到堆内存中;在jdk1.8中,方法区已经不存在,原方法区中存储的类信息、编译后的代码数据等已经移动到了元空间(MetaSpace)中,元空间并没有处于堆内存上,而是直接占用的本地内存(NativeMemory)。

去永久代的原因有:
(1)字符串存在永久代中,容易出现性能问题和内存溢出。
(2)类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
(3)永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

2.堆内存

堆内存主要用于存放对象和数组,它是JVM管理的内存中最大的一块区域,堆内存和方法区都被所有线程共享,在虚拟机启动时创建。在垃圾收集的层面上来看,由于现在收集器基本上都采用分代收集算法,因此堆还可以分为新生代(YoungGeneration)和老年代(OldGeneration),新生代还可以分为Eden、From Survivor、To Survivor。

3、程序计数器

程序计数器是一块非常小的内存空间,可以看做是当前线程执行字节码的行号指示器,每个线程都有一个独立的程序计数器,因此程序计数器是线程私有的一块空间,此外,程序计数器是Java虚拟机规定的唯一不会发生内存溢出的区域。

最新文章

  1. jedis2.4.2连接池配置说明
  2. 分布式服务框架dubbo原理解析(转)
  3. Python爬虫学习1
  4. ssl原理,非对称加密握手,对称加密传输
  5. 【python】继承时注意事项
  6. 【20160924】GOCVHelper综述
  7. Xmarks丢失书签
  8. listActivity和ExpandableListActivity的简单用法
  9. 从数据库读取数据后显示成html标签
  10. C# 与 VB.NET 对比
  11. unity3d简单的相机跟随及视野旋转缩放
  12. EduSoho程序上线实录
  13. 织梦autoindex应用 dedecms循环中判断第几条数据
  14. VxWorks嵌入式系统几种常用的延时方法
  15. java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1) for method ApiService.getMethod
  16. 开发者和系统管理者最喜爱的开源工具Vim 起步学习的五个技巧
  17. Python3 移动文件——合集
  18. 当因式分解遇见近邻:一种多层面协同过滤模型(SVD++)
  19. C#中DEV控件,XtraTabPage得小方法
  20. LINUX学习资源

热门文章

  1. CSS background 属性全家桶
  2. 转 Python3 错误和异常/ Python学习之错误调试和测试
  3. Java-IO读写文件简单操作
  4. pip安装flask问题解决
  5. 【3dsMax安装失败,如何卸载、安装3dMax 2017?】
  6. tcp的半连接与完全连接队列(三)源码分析
  7. [转]JQuery ui 实现类似于confirm的功能
  8. (转)vim(vi)常用操作及记忆方法
  9. 安装rails遇到的问题
  10. Linux的cron服务