一文搞懂jvm内存结构
一、jvm是干什么的?
大家都知道java是跨平台语言,一次编译可以在不同操作系统上运行,怎么做到的呢,看下图:
javac把写的源代码(java文件),编译成字节码(class文件),字节码部署到linux/windows/..上,被对应的jvm解释成机器码运行,jvm的工作就是这个。
大家都知道,java不需要开发者写代码来申请、释放和管理内存,jvm在运行时帮助我们做了这个事情,即便如此,我们还是需要了解jvm的内存结构,以便排查各种和内存有关的问题,比如oom,性能调优。
二、jvm内存结构是怎样的?
Java的兄弟,有没有曾经碰到过这些问题,出现OOM是什么原因?性能慢打dump发现是在等待内存分配,怎么查?了解jvm内存结构,当出现内存相关问题时,便于分析解决问题。
下图比较清晰的展示了jvm内存结构:
1、jvm内存结构分3大块:堆内存Heap、方法区Method Area和栈Stack堆;
2、堆内存Heap:分为年轻代Young Generation和老年代Old Generation;
3、年轻代YG:又分为3部分,Eden Space、From Survivor Space、To Survivor Space.
再来看看主要的几个参数:
▪ -Xms设置堆的最小空间大小;
▪ -Xmx设置堆的最大空间大小;
▪ -XX:NewSize设置新生代最小空间大小;
▪ -XX:MaxNewSize设置新生代最大空间大小;
▪ -XX:PermSize设置永久代最小空间大小;
▪ -XX:MaxPermSize设置永久代最大空间大小;
▪ -Xss设置每个线程的堆栈大小。
三、各内存空间分别存放一些什么东西,我们写的代码对应了哪些内存空间?
1、堆内存Heap,存的是对象,所有的对象在实例化后的整个运行周期内,都被存放在堆内存中
2、方法区Method Area,存的是已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
3、栈Stack,存的是基本数据类型和堆中对象的引用
堆内存,又分年轻代和老年代,那么,什么情况下用年轻代,什么情况下会进入老年代呢?
1、运行时,新创建的对象分配在年轻代的Eden,随着时间推移,Eden会满,这时候就会触发MinorGC.
2、有几种情况,会触发对象进入老年代:
1)JVM会给对象增加一个年龄(age)的计数器,对象每“熬过”一次GC,年龄就+1,当年龄达到设置的阈值(默认为15)就会被移到老年代。(可通过-XX:MaxTenuringThreshold
调整阈值, 一次Minor GC
后,对象年龄就会+1,达到阈值的对象就移动到老年代,其他存活下来的对象会继续保留在新生代中)
2)不用等待15次GC之后进入老年代,大致是,如果一批对象的总大小大于这块Survivor(From/To)内存的50%,那么大于这批对象年龄的对象就进入老年代
3)如果设置了参数-XX:PretenureSizeThreshold
,那么如果创建的对象大于这个参数值,就直接把这个对象放入老年代,不经过新生代。这么做就可以避免大对象在新生代,屡次躲过GC,还得把他们来回复制,最后才进入老年代,浪费时间。
一文搞懂jvm内存结构的更多相关文章
- 一文搞懂JVM内存结构+GC
一.jvm是干什么的? 大家都知道java是跨平台语言,一次编译可以在不同操作系统上运行,怎么做到的呢,看下图: javac把写的源代码(java文件),编译成字节码(class文件),字节码部署到l ...
- Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...
- 一文看懂JVM内存区域分布与作用
那么我们在开始介绍Java内存区域之前,我们先放一张内存区域的图,方便我们后面介绍的时候可以对照着看. 须知,本文是根据JDK8来介绍的. 程序计数器 首先它是线程私有的,它也称为代码的行号指示器,字 ...
- 举一个有趣的例子,让你轻松搞懂JVM内存管理
目录 前言 例子 源码 输出 图解 深入分析 学以致用 写在最后 前言 在JAVA虚拟机内存管理中,堆.栈.方法区.常量池等概念经常被提到,对理论知识的理解也常常停留在字面意思上,比如说堆内存中存放对 ...
- 一夜搞懂 | JVM 字节码执行引擎
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一 ...
- 一文搞懂所有Java集合面试题
Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...
- 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控
如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 【JVM】JVM内存结构 VS Java内存模型 VS Java对象模型
原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清 ...
随机推荐
- LGOJ1861 星之器
前置扯淡 我对这个题目的评价和网上各位大佬的一样:人类智慧题 (显然我不具有人类智慧--) Description link 现在有一个 \(n \times m\) 的矩阵\(A\),里面的每个元素 ...
- 【转】Linux服务器命令行模式安装Matlab2014a
转自http://www.aichengxu.com/diannao/39100.htm 0.下载安装包 下载Matlab2014a for Linux安装包的ISO镜像文件 将下载好的iso文件挂 ...
- 【Java杂货铺】JVM#Java高墙之GC与内存分配策略
Java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的"高墙",墙外的人想进去,墙外的人想出来.--<深入理解Java虚拟机> 前言 上一章看了高墙的一半,接下 ...
- mpu6050的驱动的加载和测试步骤
mpu6050的使用方法: 1.接线方式: VCC,GND,SCL,SDA,正常接法,VCC接3.3v,主要说一下AD0引脚,用来表示地址 接低电平设备地址为0x68,接高电平表示0x69 2.设备接 ...
- oracle中null的理解
< EXAMNO STUNO WRITTENEXAM LABEXAM e2014070001 s25301 80 58 e2014070002 s25302 50 e2014070003 s ...
- 关于用struts2框架中iframe对应的jsp页面的不到action的值的问题
我们做web项目经常会用到frameset.frame以及iframe,这大大方便了我们页面的构建以及模块功能的划分.但是,再使用这些技术的同时也会遇到各种各样的问题,其中一个就是子页面中得不到str ...
- text-align和vertical-align
1.text-align(水平对齐)text-align样式使元素在其定界区域内水平对齐,其取值可以是left.right.center或justify.justify使元素两端对齐.2.vertic ...
- 四、RabbitMQ Exchange类型
RabbitMQ整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ就好 ...
- 牛客-小w的a=b问题
题目传送门 sol1:老实做,预处理出所有2到1e5的素数,对所有数进行分解质因数,然后对比因子个数.感觉有点卡常,用了快读然后多次优化之后才过的,map也用上了. 素数筛,快速分解质因数 #incl ...
- Alfresco的安装配置(Centos6系统中安装)
Alfresco是一款开源的企业内容管理系统(ECMS),为企业提供了日常的文档管理.协同工作.工作记录管理.知识管理.网络内容管理.图片管理等多种功能. Alfresco是目前应用最广泛的开源企业知 ...