最近一次面试,面试官让我讲讲JVM的内存这一块的理解。我回答的不满意,今天做一个总结。

做一个产品,最终要做到高并发、高可靠。归根结底,是对CPU、内存等资源受限所作出的解决方案。就内存而言,我们写的代码:如new一个对象,都要在内存中来运行,如果内存中没有足够的空间,不能创建新的对象,那么程序就无法运行。所以,在调试程序的过程中我们可以经常看到OutOfMemory之类的错误。在Java中我们知道有垃圾回收机制GC来解决内存泄露的问题,那么它是如何解决的呢?了解这部分知识,我想:1.内存是如何划分的?2.内存是如何管理的?3.GC是如何工作的?(其源码?)4.针对内存问题,技术的发展是怎么一步步的解决这些问题的?(当然有软件、硬件发展两个方面)。

一,先解决内存是如何来划分的?

  在PC中,内存用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换数据。我们常用的软件是安装在计算机的硬盘上的,当执行该软件的时候,才把它调用内存来运行。硬盘用于保存:需要永久保存的、大量的数据。内存用于保存:临时的、少量的数据和程序。此刻,我用Office软件,用键盘向电脑敲入文字,文字先被存储在内存中,当选择保存的时候,内存中的数据才会写入磁盘中。

  内存用半导体存储单元制作而成。包括RAM随机存储器、ROM只读存储器、CACHE高速缓存。其中,ROM由于其永久保存、只读不写的个性,我们在ROM中存放计算机的基本程序和数据,如计算机的BIOS选项中的部分。ROM中的部分不受电脑断电的影响,但是RAM中的东西,则会随着电源关闭而数据丢失,我们常购买的内存条就是RAM集成块集中在一起的一小块电路板,RAM中的数据可以读也可以写。缓存这个东西Cache,我们经常听到的名词,比如一级缓存、二级缓存、三级缓存等。缓存是一个位于CPU和内存之间的,一个读写速度比内存更快的存储器。当CPU向内存中写入或读出数据时,这个数据也被存储高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。

  地址空间,是对物理存储器编码的范围。即是对每一个物理存储单元(一个字节)分配一个号码,通常叫做编址。分配一个号码给一个存储单元的目的是为了找到它,完成数据的读写,这就是所谓的“寻址”。所以地址空间就是寻址空间。我们常说的,我的电脑是内存4G的,就是地址空间是4G,寻址空间是4G,也就是,为每一个字节分配一个号码,总共有4*1024*1024*1024字节。因为KB的含义就是k*Byte.

  知道了上面这些,那么我们接下来要研究的其实就是RAM这一部分了。我们把这一部分知识也常常叫做Java内存的组成。

java内存分为:堆Heap和非堆Non-Heap区。java虚拟机具有一个堆,堆是运行时数据区域,所有实例和数组的内存均从此处分配。堆是Java虚拟机启动时创建的。在java堆之外的内存称为non-heap memory。JVM主要管理堆和非堆两种类型的内存。堆是留给开发人员使用的。非堆是JVM留给自己使用的,所以方法区、JVM内部处理或者内部优化所需要的内存(JIT编译后的代码缓存)、每个类的结构(运行时常数池、字段、方法数据)以及方法和构造方法的代码都在非堆内存中。

堆,(java代码中所有的new操作),JVM对堆的初始分配的内存由-Xms指定,默认是物理内存的1/64.JVM给堆最大分配的内存由-Xmx指定,默认是物理内存的1/4.当默认堆内存小于40%的时候,JVM就会增大堆直到-Xmx的最大限制。空余堆内存大于70%时,JVM会减少直到-Xms的最小限制。(有时候,服务器设置-Xms和-Xmx大小相等,目的是避免每次GC后需要调整堆的大小)对象的堆内存由称为垃圾回收器的自动内存管理系统回收。

未完待续......

JVM内存格局总结的更多相关文章

  1. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  2. jvm系列(二):JVM内存结构

    JVM内存结构 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能 ...

  3. jvm内存溢出分析

    概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...

  4. jvm内存区域

    概述 jvm内存分为几个区域: 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 这些内存区域是在java进程中细分的,为java程序提供服务 不同的区域存储的内容不一样,生命周期 ...

  5. JVM内存管理&GC

    一.JVM内存划分 |--------------------|-------------PC寄存器-------| |----方法区 ---------|--------------java 虚拟机 ...

  6. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  7. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  8. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  9. 如何设置jvm内存

    本文向大家简单介绍一下进行JVM内存设置几种方法,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JR ...

随机推荐

  1. 关于stm32的正交解码

    关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说 ...

  2. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  3. Atiti  attilax主要成果与解决方案与案例rsm版

    Atiti  attilax主要成果与解决方案与案例rsm版 1. ##----------主要成果与解决方案与 参与项目1 ###开发流程系列1 ###架构系列 (au1 ###编程语言系列与架构系 ...

  4. 关于C#中的线程重启的问题

    首先不管是C#也好,还是java也好,对于已经Abort的线程是无法再次Start的,除非是声明私有变量new一个新的线程,网上也有很多人说可以Suspend挂起线程,然后再Resume继续,但是相信 ...

  5. 使用__slots__限定实例的成员列表

    使用__slots__限定实例的成员列表 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应 ...

  6. Linux常用命令01

    Linux对于我们来说,就是跑程序的运行平台,简单的来说,就是服务器,自己也没怎么系统的学习Linux的命令,随着项目的需要, 比如要查找日志,哪里出问题了,哪里报错了,因此自己也慢慢地懂一些常用的L ...

  7. Mongodb安装与配置详解

    简介: mongodb作为一款通用型数据库,除了能够创建,读取,更新和删除数据外,还提供一系列不断扩展的独特功能. a.索引: mongodb支持二级索引,允许多种快速查询,且提供和唯一索引,复合索引 ...

  8. Linux (Ubuntu12.04) 下开发工具安装和使用

    Linux (Ubuntu12.04) 下开发工具安装和使用 这里讲述的是关于在ubuntu12.04下面安装和使用各种IDE 开发环境和初步使用的知识.说一下背景:很多的开发基本都是在linux操作 ...

  9. jQuery判断当前元素显示状态并控制元素的显示与隐藏

    1.jQuery判断一个元素当前状态是显示还是隐藏 $("#id").is(':visible');   //true为显示,false为隐藏 $("#id") ...

  10. Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.1  运行环境说明 1.1.1 硬软件环境 线程,主频2.2G,10G内存 l  虚拟软 ...