JVM是java知识体系的基石之一,任何一个java程序的运行,都要借助于他。或许对于我这种初级程序员而言,工作中很少有必要刻意去关注JVM,然而如果能对这块知识有所了解,就能够更清晰的明白程序的运行机制,从而写出更为健壮的代码,也能更好的理解java中很多处理方式的原因。以下是个人读书后整理的知识点,同时参考并引用了以下博客:

一、JVM内存模型
    JVM典型的内存模型如下图:

程序计数器 线程私有 学过组成原理的对这个一定很亲切,这里相当于JVM版的,作用是当前线程所执行的字节码的行号指示器,通俗讲就是记录当前正在执行字节码的位置,以便解释器能获取下一行字节码。
虚拟机栈 线程私有 用于存储局部变量表(包括参数)、操作数栈、方法出口等信息,栈解决程序的运行问题,即程序如何执行,或者说如何处理数据,代表了处理逻辑
线程共享 存放了对象实例及数组(所有new的对象),也是我们做GC处理的最为关注的一部分内存区域,堆解决的是数据存储的问题,即数据怎么放、放在哪儿,代表了数据
方法区 线程共享 存储虚拟机加载的类信息、常量、静态变量,在分代回收中也可认为永久代(不同虚拟机实现不同,这里只是为了方便理解)
本地方法栈 线程私有 作用与虚拟机栈类似,但是调用方法都为Native本地方法,如调用C的DLL库方法等
直接内存 线程共享 这部分内存并不在JVM内存分区之内,主要是调用Native方法分配的内存,由于这些方法不是有JVM执行的,其内存也不归JVM管理

我们讨论JVM分区时,经常也会提到GC(垃圾回收)内存划分,对于很多不熟悉的人来说,经常搞不清两者的区别。JVM分区主要是JVM运行时对物理内存根据用途划分区域,而GC分区主要是针对分代垃圾回收机制对JVM相关分区(主要是堆内存)进行划分。为了解释这一问题,我们先来提前了解下分代来及回收机制。
    分代垃圾回收主要是为了使不同生命周期的对象可以采取不同的收集方式,以便提高回收效率,我们知道对象有可能很快该释放,也可能很长时间一直存活,如果在回收时采用一样的策略,往往会顾此失彼(原因在回收算法部分会详解),因此应该采用不同策略:对于生命周期较短的区域可以gc频繁一点,而较长的少一点。我们先来看下GC内存划分:

可以看到该部分分为三大块:年轻代(young generation),年老代(old generation)和持久代(permanent generation),其中年轻代分成三个区域,其中一个是Eden区,另外的两个From和To都是Survivor区(From和To只是为了说明,两者实质上一样,方向可互换)。现在我们来看一个对象简单的处理过程(图解参考):

  1. 对象会创建在Eden区
  2. 进行gc的时候,如果对象仍然存活,则复制到From区
  3. 当From区满的时候,该区存活对象将复制到To区,然后From清空,之后From和To角色互换
  4. 重复3到指定次数(可通过JVM参数指定)后,存活对象将会被复制到年老代

采用此方法,我们就能在年轻代、年老代上采用不同的回收机制。而实际上当Eden被存满时,会触发 Scavenge GC(仅对Eden进行gc,由于较频繁,可以采用快速高效的回收算法),而年老代或持久代被写满时,则触发Full GC(对整个分区进行gc,消耗很大,应尽量减少) 。

JVM内存模型介绍完毕,如有错误,望不吝指教。下一篇计划整理JVM垃圾回收算法部分。

JVM学习总结一——内存模型的更多相关文章

  1. JVM学习记录-Java内存模型(一)

    前言 Java虚拟机规范中定义了一种Java的内存模型,即Java Memoory Model(简称JMM),用来实现让Java程序在各个平台下都能达到一致的内存访问效果.JVM是整个虚拟机,JMM模 ...

  2. JVM学习记录-Java内存模型(二)

    对于volatile型变量的特殊规则 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制. 在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用vo ...

  3. JVM学习01:内存结构

    JVM学习01:内存结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 内存结构知识要点Xmind梳理 案例分析 分析1 package com.h ...

  4. 深入理解JVM(③)学习Java的内存模型

    前言 Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题.定义Java内存模型并非一件容易的 ...

  5. 【JVM】01虚拟机内存模型

    学习链接:https://blog.csdn.net/u010425776/article/details/51170118 博主整理的条理清晰,在这里先感谢博主分享 去年看视频学习写过一篇JVM的博 ...

  6. 【Java杂货铺】JVM#Java高墙之内存模型

    Java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的"高墙",墙外的人想进去,墙外的人想出来.--<深入理解Java虚拟机> 前言 <深入理解Java虚 ...

  7. jvm系列五-java内存模型初览(1)

    本文转载自:再有人问你Java内存模型是什么,就把这篇文章发给他. 网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关 ...

  8. JVM学习总结四——内存分配策略

    之前几篇我们介绍了jvm的内存模型以及垃圾回收机制,而本篇我们将介绍几个JVM中对象在分配内存是应该遵循的策略.毕竟,想要去优化程序,不仅要考虑垃圾回收的过程,还要从对象内存分配的角度减少gc的代价. ...

  9. 轻松学JVM(二)——内存模型、可见性、指令重排序

    上一篇我们介绍了JVM的基本运行流程以及内存结构,对JVM有了初步的认识,这篇文章我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存 ...

随机推荐

  1. 循环链表Josephus问题(c,cpp)

    问题描述: 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m个的人又出列,.......,如此反复直到所有的人出列为止. Joseph ...

  2. 在使用 AjaxFileUpload 上传文件时,在项目发布到 iis 后,图片不能预览

    在使用 AjaxFileUpload  上传文件时,图片已经上传成功了,在站点没有发布时,可以预览,可是在项目发布到 iis 后,图片就不能预览,在网上找了很多的方案也没解决,最后的解决方案如下: 1 ...

  3. ICDM 2007

    Language-Independent Set Expansion of Named Entities Using the Web. Chao Wang, Venu Satuluri, Sriniv ...

  4. RHEL7网卡设置

    1.改网卡名 先vim /etc/sysconfig/grub:GRUB_TIMEOUT=5GRUB_DEFAULT=savedGRUB_DISABLE_SUBMENU=trueGRUB_TERMIN ...

  5. java 学习之(基本语法)

    强类型:1所有变量必须先定义,再使用.2变量所赋值必须为与其类型匹配的类型. 标识符与关键字   分隔符:;{},[],() space .  用法与.net一样 标识符规则:以_  字母 $符开头 ...

  6. 【MySQL】MySQL事务回滚脚本

    MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入 ...

  7. 获取Spring的上下文环境ApplicationContext的方式

    摘自: http://blog.csdn.net/yang123111/article/details/32099329 获取Spring的上下文环境ApplicationContext的方式 Web ...

  8. sublime Text2 2.0.2 build 2221 64位 破解(已测试)

    近终于找到  sublime Text2 升级到 2.0.2 build 2221 64位 的破破解 输入注册码就成了 ----- BEGIN LICENSE ----- Andrew Weber S ...

  9. Linux下yum安装MPlayer 或 LVC视频播放器

    添加第三方源 su -c 'rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noar ...

  10. javascript之值传递与引用传递

    在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference).在计算机科学里,这个部分叫求值策略(Evaluation Strat ...