JVM虚拟机 - 内存
在JVM虚拟机中,内存部分大致可以分为以下几类:
- Heap:堆
- NonHeap:非堆
- CodeCache:缓存编辑后的机器码的内存区域
- CompressedClassSpace:类压缩空间
- MetaSpace:元空间(其实就是永久代,1.7之前叫永久代,1.8之后叫元空间)
- HeapedEnSpace:Eden区
- HeapOldGen:老年代
- HeapSurvivorSpace:S0和S1区
- Direct:直接内存
贴上示意图:

这张图其实画的有些不对,在Heap区,Old和Young的比例应该是2:1,然后Eden和S0、S1的比例应该是8:1:1。
接下来主要来讨论下新生代,老年代和元空间(永久代)。
1. 新生代
新生代有Eden、From、To区域(From、To即S0、S1区域)。
Eden主要用于存放新创建的对象,它会在第一次GC发生时,将对其内部的存活的对象放入到From或者To区域。
From和To区域都是Survivor区域,主要用于GC时,在对象复制时提供作用(复制算法),以及承担新生代和老年代之间的缓冲作用。
也就是说,对于整个新生代而言,会发生频繁的GC操作(Young GC)。
2. 老年代
有以下几种情况,可以使对象进入到老年代中:
大对象:指一个占用大量连续存储空间的对象
生命周期较长的对象
新生代中的每个对象都有一个年龄计数器,当新生代发生一次MinorGC后,存活下来的对象的年龄就加一,当年龄超过一定值时,就将超过该值的所有对象转移到老年代中去。
相同年龄的对象内存超过Survior内存一半的对象
如果当前新生代的Survior中,年龄相同的对象的内存空间总和超过了Survior内存空间的一半,那么所有年龄相同的对象和超过该年龄的对象都被转移到老年代中去。无需等到对象的年龄超过MaxTenuringThreshold才被转移到老年代中去。
Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。老年代如果频繁GC,那肯定是存在问题,需要去排查。
3. 元空间
JDK1.8和1.7最大的区别就是:元空间取代了永久代(在1.7的时候,常量池从永久代移至了堆空间中)。
元空间本质和永久代类似,都是对方法区的实现,两者的区别在于:元空间并不在虚拟机中,而是使用本地内存。所以此时的JVM运行时内存区域应该是这样的(摘自别人的图):

JVM虚拟机 - 内存的更多相关文章
- 设置TOMCAT的JVM虚拟机内存大小
你知道如何设置TOMCAT的JVM虚拟机内存大小吗,这里和大家分享一下,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 设置 ...
- JVM 虚拟机内存深入探究
[<深入理解java虚拟机>-整理笔记] by lijun JVM虚拟机内存逻辑模型: 方法区(全局变量 静态数据 常量等) 线程共享 堆栈区(对象实例 数组数据 new generat ...
- java中JVM虚拟机内存模型详细说明
java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03| 分类: JAVA | 标签:java jvm 堆内存 虚拟机 |举报|字号 订阅 JVM的内部结构 ...
- jvm 虚拟机内存模型
来源:https://blog.csdn.net/A_zhenzhen/article/details/77917991?locationNum=8&fps=1 https://blog ...
- 面试官:别的我不管,这个JVM虚拟机内存模型你必须知道
前言 说jvm的内存模型前先了解一下物理计算机的内存处理. 物理计算器上用户磁盘和cpu的交互,由于cpu读写速度速度远远大于磁盘的读写速度速度,所以有了内存(高速缓存区).但是随着cpu的发展,内存 ...
- JVM 虚拟机 内存说明
Java虚拟机所管理的内存图: 1程序计数器: 该模块作用是记录线程执行字节码的位置,记录程序执行状态,以便该线程下次获得CPU时继续执行.程序里的每个线程程序计数器相互独立,互不影响,该内存区也称“ ...
- JVM虚拟机内存模型以及GC机制
JAVA堆的描述如下: 内存由 Perm 和 Heap 组成. 其中 Heap = {Old + NEW = { Eden , from, to } } JVM内存模型中分两大块,一块是 NEW Ge ...
- JVM虚拟机内存溢出垃圾收集及类加载机制总结
1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...
- 对jvm虚拟机 内存溢出的思考
java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间
随机推荐
- 如何更新node和npm版本
更新npm ---> npm undate -g 更新node ---> npm install -g -n n latest
- OS X 10.9 Mavericks下显示和隐藏文件(区别10.8.*)
我们常常在Windows系统下通过界面设置显示和隐藏文件,在Mac OS X通常采用defaults write命令来解决这个问题. 之前的OS X 10.8.*系统可以使用如下两条命令来开始或者关闭 ...
- Linux内核解析
一.Linux内核 一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序:是指那些自处理程序. Inter ...
- Shrio00 Shiro角色授权、Shiro权限授权、开启Shiro缓存
1 需求01 用户进行过认证登录后,某些接口是有权限限制的:如何实现只有相应权限的用户才可以调用相应接口 2 修改shiro配置类 ShiroConfiguration package cn.xia ...
- java连接sqlserver2005数据库
java连接sqlserver2005数据库 首先得下载驱动程序到微软网站下载Microsoft JDBC Driver 4.0 for SQL Server 下载地址 :http://msdn. ...
- geneid/genesymbol/ensemblid等之间的转换
在基因注释时,难免碰到各种GENE在不同数据库之间的ID转换(例如,Ensembl ID 转Entrez ID,或者Entrez ID与GENE Symbol之间的转换).这里介绍一下常用的三个在线网 ...
- <c和指针>学习笔记5动态内存分配和预处理器
1 动态内存 比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了.从而引入动态分配,需要的时候再分配. (1)malloc和free void *malloc(size_t ...
- Entity Framework Code-First(5):Code First Conventions
Code First Conventions: We have seen how EF Code-First creates DB tables from domain classes in the ...
- hdu1056
#include <cstdio> void main(){ double length; double l[300]; l[1] = 1.0/2; int i; for (i = 2;; ...
- 解决Navicat 连接服务器数据库报10060问题
1.登录mysql,授予远程登录权限(确保mysql表里的登录user对应的host为 % 即可:若不是 % ,使用mysql的update更新对应host) mysql> use mysql; ...