持久代(jdkq1.7),jdk1.8被称为元数据区 元数据区主要是java程序代码的代码区和数据区 java程序中类(class)会被加载到整个区域的不同数据结构中去,包括常量池、域、方法数据、方法体、构造函数、以及类中的专用方法、实例初始化、接口初始化等 这个区域对于操作系统来说是堆的一部分;而对于java程序本身而言是容纳程序本身及静态资源的空间,使得jvm能够解释执行java程序
新生代 存储新进去内存中的对象 存在堆内存中的 分三块 eden sourvivor(s0)--from区 sourvivor(s1)--to区 由jvm统一管理 ,使用时jvm会向操作系统申请一整段内存区域,当执行new 操作时jvm将在这段内存中按照所需大小分配java程序 程序不负责通知jvm何时可以将对象所占用内存空间释放 gc会定时回收
老年代 存储随着时间推移一直占用内存空间的对象 存在堆内存中的 jvm统一管理 使用时jvm会向操作系统申请一整段内存区域,当老年代中的存储空间因为程序执行关系会逐渐将对象移动到老年代中,这时候jvm会根据程序计数器中的java指令和对象存活时间启动full gc
垃圾回收机制在执行对应的垃圾回收类时会先标记内存中非活跃的对象,标记完以后会启动清除,将非活跃性的区间清除,然后将内存中尚需要使用的对象所占内存进行压缩同之前清除完以后的内存空间合并
jvm虚拟机对于分区分代以后内存进行批次管理,程序执行过程中会自动调用对应的分区中的对象操作数据,操作完数据以后会进行垃圾回收,然后再分配对象内存。以此反复执行
jvm对于Windows Linux 内存关系各不一样
这里主要讲述Linux 系统 :在一些物理内存为8g的服务器上,主要运行一个java服务,系统分配内存如下:java jvm堆大小为6g 一个监视进程占用600m linux自身占用800m 从表面上看物理内存是足够的,但是实际使用过程中发生大量的swap,swap 和gc同时使用时会出现卡顿情况
此处:后续加图解
Linux 系统内存分三块 硬件(物理内存+swap磁盘) 系统(Bin+内核内存+用户内存(进程1----n)) 进程(内核内存+数据区+堆区+未使用+栈区)
用户内存空间分两个部分组成:物理内存和swap(位于磁盘),物理内存是linux活动时使用的主要内存区域;当物理内存不够使用时 linux会把一部分暂时不用的数据放在磁盘上的swap中,以便腾出更多的可用空间,而当需要使用位于swap的数据时,必须先将其换回到内存中
从系统中看除引导系统的BIN区外。整个内存空间主要被分为两部分:内存内核 用户内存
内存内核是linux自身使用的内存空间,主要提供给程序调度、内存分配、连接硬件资源等使用
用户 内存是提供各个进程主要空间,Linux给各个进程提供相同的虚拟空间,这使得进程之间相互独立,互补干扰,实现方法中是采取虚拟内存技术;给每一个进程一定的虚拟空间,而当虚拟空间实际被谁使用时,才分配物理空间
32 位 将0---3G 的虚拟空间分配为用户空间,将3---4G虚拟空间分配为内核空间 64位时类似的
从进程角度来看,能直接访问的的用户内存(虚拟机内存):代码区 数据区 堆区 栈区 为使用区
代码区中存放的是应用程序的机械代码 运行过程中代码不能被修改 具有只读和固定大小的特点
数据区中存放的是应用程序中的全局数据,静态数据和一些常量字符串 大小也是固定的
堆是运行时程序动态申请的的空间 属于程序运行时直接申请和释放的内存资源
栈区用来存放函数传入的参数 临时变量 以及返回地址等数据
未使用区 是分配新内存空间的预备区域