声明:本文内容仅作为本人方便记忆和查看所用。

JVM有五块内存空间:

  1、method area:用于存储已被加载的类信息、常量、静态变量、即时编译后的代码等数据。

  注:在JDK8中,Method Area(方法区)即PermGen(永久代)已经废弃,取而代之的是Metaspace(元空间);Metaspace的性质与Method Area基本类似,他们的本质区别是Metaspace不在虚拟机中,而是使用本地内存,理论上取决于32位/64位系统可虚拟的内存大。

  2、heap:一般存放对象实例。

  3、native method stack:作用和VM stack类似。

  4、program counter register:当前线程执行字节码文件行号指示器,是唯一没有OutOfMemoryError的区域。

  5、vm stack:每个方法在执行的时候都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到结束对应着stacks中入栈到出栈的过程。

其中1和2为线程共享数据区,其他为线程隔离数据区。

虚拟机创建对象:

  1、heap中内存规整,则使用bump the pointer(指针碰撞);一般这种方式下GC为Serial、Palnew等带有compact过程。

  2、heap中内存不规整,则必须维护一张表记录哪些内存可用,在分配的时候找到一块足够大的内存,并且更新该表,这种方式称为free list(空闲列表);一般这种方式下GC为CMS这种基于Mark-Sweep。

heap是否规整取决于GC方式是否带compact功能。 

修改指针线程安全问题解决:

  1、对分配内存空间时做同步处理,实际上虚拟机采用CAS配上失败重试的方法保证更新操作的原子性。

  2、把内存分配的操作按照线程划分的不同的空间中,即每个线程在heap中预先分配一小块内存,称为本地线程分配缓冲,内存分配完之后需要将该内存初始化为零值,然后虚拟机对对象进行必要的设置。

GC:

  young generation(minor GC):大部分对象在创建之后很快就会变得不可达。包含eden和survivor区。

  old generation(major GC or full GC):对象没有不可达,从新生代存活下来,被复制到老年代。

  card table:用来表示老年代某一区域中的所有对象是否持有对新生代对象的引用。这样新生代在GC的时候不需要花大量时间扫描所有老年代对象来确定对象的引用关系。

GC方式:

  Serial GC:单线程收集器;Serial old是针对老年代的收集器

  Parnew GC:Serial 新生代的多线程实现

  Parallel :采用复制算法的多线程新生代收集器,主要关注目标是吞吐量

  Parallel old(Parallel Compacting GC (JDK1.6后)):使用多线程和标记整理算法的老年代收集器

  Concurrent Mark & Sweep GC(CMS):应用广泛,以获取最短停顿时间为目的;以标记清除算法为基础,会产生大量的空间碎片;为解决这个问题,默认提供-XX:+UseCMSCompactAtFullCollection收集开关参数(默认开启),用于在full GC完开启内存碎片的整理过程;还提供另外一个参数-XX:CMSFullGCsBeforeCompaction用于设置执行多少次不压缩full GC后跟着来一次带压缩的(默认次数为0)

GC ROOTS:

  虚拟机栈中的引用对象

  方法区中类静态属性引用的对象

  方法区中常量引用的对象

  Native的引用对象

GC 算法:

  标记清除:问题是容易产生大量的空间碎片,提前触发full GC

  标记整理:老年代算法;先标记,再压缩,后清除

  复制算法:新生代算法

  增量算法:垃圾收集线程和应用程序线程交替运行;优点:减少系统停顿时间;缺点:因为线程切换和上下文转换的消耗,使得垃圾回收总成本上升,造成系统吞吐量下降。

JVM内存基本理解的更多相关文章

  1. JVM内存简单理解

    1.首先简单说一下CPU与内存之间的关系 CPU运转速度快,磁盘的读写速度远远不及CPU运转速度,所以设计了内存来缓冲CPU等待磁盘读写:随着CPU的发展,内存读写也远远跟不上CPU的读写速度,CPU ...

  2. JVM 内存机制理解【转自http://www.cnblogs.com/dingyingsi/p/3760447.html】

    我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...

  3. 走进JVM【二】理解JVM内存区域

    引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...

  4. 深入理解JVM(一)——JVM内存模型

    JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. ...

  5. 你应该这样理解JVM内存管理

    在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...

  6. 深入理解JVM内存区域与内存分配

    前言:这是一篇关于JVM内存区域的文章,由网上一些有关这方面的文章和<深入理解Java虚拟机>整理而来,所以会有些类同的地方,也不能保证我自己写的比其他网上的和书本上的要好,也不可能会这样 ...

  7. 如何从编程的本质理解JVM内存模型

    如何从编程的本质理解JVM内存模型 一般聊JVM内存模型都是把图截出来,然后对着图,解释上面堆.栈之类的概念.这篇将分享下,如何从编程的本质上理解,JVM内存模型是什么样子,为什么是这个样子,不再死记 ...

  8. 深入理解JVM之JVM内存区域与内存分配

    深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...

  9. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

随机推荐

  1. CentOS6.x/6.5/6.4/6.3/6.2/7.x 64位安装php5.2(使用YUM自动安装)

    默认情况下,CentOS6 64 bit 已经早已不支持php5.2.x ,但是某些php程序还需要zend optimizer支持,怎么办呢?目前大部分的yum repos 都已经不支持直接安装ph ...

  2. Mybatis学习——初始MyBatis

    什么是MyBatis框架? MyBatis框架是一种ORM(既对象关系映射)框架. 什么是ORM框架? 是一种为了解决面向对象与关系数据库之间数据不匹配的技术,它通过描述Java对象和关系数据库表之间 ...

  3. macos上命令行查看磁盘序列号

    收集到两种命令行获取方法:(另外https://www.maketecheasier.com/find-mac-serial-number/中还说明了GUI模式下的查看方法) 1.system_pro ...

  4. ubuntu19.10 相关软件安装

    1.Typora Typora是一款Markdown撰写软件,Linux版本也相当好用. Typora的安装方式如下: # or run: # sudo apt-key adv --keyserver ...

  5. Postgresql的导表

    背景 前面已经介绍了常用的备份与恢复了,接下来介绍一下导表. 正文 很多情况,会有把数据导出的需求,轻重缓急总会有特别紧急的情况,但是又不是专业干db的人,还是记录下来,以防不时之需. 针对于导表,个 ...

  6. ZJNU 1244/1245 - 森哥数——高级

    打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最 ...

  7. Qt QPixmap QImage 图片等比例缩放到指定大小

    QPixmap pixmap(path); //pixmap=QPixmap::fromImage(imgShow); pixmap = pixmap.scaled(, , Qt::KeepAspec ...

  8. win10+CUDA9.0176、CUDNN7.6.0安装

    在github上下载了一个文本分类的代码,包含了CNN.LSTM等分类模型,运行时说我的CUDA版本不行,我原来是9.1,让我安装9.0 然后开始卸载9.1啊,在此感谢博主:https://blog. ...

  9. CodeForces 91B Queue (线段树,区间最值)

    http://codeforces.com/problemset/problem/91/B B. Queue time limit per test: 2 seconds memory limit p ...

  10. CSS样式表---------第三章:样式属性

    三.样式属性 1.背景与前景 background-color:#90; ------------背景色,样式表优先级高. background-image:url(路径)-------------- ...