JVM简介:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。

JVM内存模型结构图:::

1.JVM内存模型和结构

(1)JVM内存模型如下:::

Young(年轻代)= New

Tenured(老年代)= Old

Perm(永久代) = Perm

Young(年轻代)可以分为Eden区和两个Survivor区(from和to,这两个Survivor区大小严格一致),新的对象实例总是首先放在Eden区,Survivor区作为Eden区和Tenure(终生代)的缓冲,可以向Tenure(终生代)转移活动的对象实例。

Tenure(终生代)中存放生命周期长久的实例对象,但并不是如它的名字那样是终生的,里面的对象照样会被回收掉。

Young和Tenure共同组成了堆内存(默认新生代与老年代的空间大小为1:2)。

Perm(永久代)则是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等

JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。

在JVM启动时,就已经保留了固定的内存空间给Heap内存,这部分内存并不一定都会被JVM使用,但是可以确定的是这部分保留的内存不会被其他进程使用。这部分内存大小由 -Xmx参数指定。而另一部分内存在JVM启动时就分配给JVM,作为JVM的初始Heap内存使用。影响这个的参数是-Xms,如果-Xms指定的值比-Xmx的小,那么两者的差值就是Virtual内存值。随着程序的运行,Eden区、 Tenured区和Perm区会逐渐使用保留的Virtual空间。堆内存默认值最大不会超过1G。

绝大部分对象在Eden区生成,当Eden区装填满的时候,会触发Young GC。垃圾回收的时候,在Eden区实现清除策略,没有被引用的对象则直接回收,依然存活的对象会被移送到Survivor区。Survivor 区分为S0和S1两块内存空间,送到哪块空间呢每次Young GC的时候,将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。如果Young GC要移送的对象大于Survivor区容量上限,则直接移交给老年代。每个对象都有一个计数器,每次YGC都会加1。参数能配置计数器能控制移交次数,默认值是15,意思就是在Survivor 区交换14次之后,晋升至老年代。Survivor 区处理超过上限,老年代也承受时,则会触发Full Garbage Collection(Full GC);如果依然无法放下,则抛OutOfMemoryError,堆出现OOM的概率是所有内存耗尽异常中最高的。所以给JVM设置运行参数-XX:+HeapDumpOnOutOfMemoryError,让JVM遇到OOM异常时能输出堆内信息。

整个Java虚拟机只有一个堆,所有的线程都访问同一个堆。它是被所有线程共享的一块内存区域,在虚拟机启动时创建,而程序计数器、Java虚拟机栈、本地方法栈都是一个线程对应一个。堆是垃圾回收的主要区域,所以也被称为GC堆,堆的大小既可以固定也可以扩展,但主流的虚拟机堆的大小是可扩展的(通过-Xmx和-Xms控制),因此当线程请求分配内存,但堆已满,且内存已满无法再扩展时,就抛出OutOfMemoryError。

所以开发工具(IDEA、Eclipse等)一般安装完去修改内存,去提升性能。

-Xms是设置java虚拟机的最小分配内存;-Xmx则是最大分配内存;512m为内存空间

一般-Xmx设置为你电脑物理内存的1/4,而把-Xms和 -Xmx设置为一样,

一般用到最多的就是-Xms512m -Xmx512m

内存参数如图:

  • -Xms设置堆的最小空间大小。
  • -Xmx设置堆的最大空间大小。
  • -XX:NewSize设置新生代最小空间大小。
  • -XX:MaxNewSize设置新生代最大空间大小。
  • -XX:PermSize设置永久代最小空间大小。
  • -XX:MaxPermSize设置永久代最大空间大小。
  • -Xss设置每个线程的堆栈大小

(2)JVM内存结构包含:堆、栈、方法区

堆:Heap堆是OutOfMemoryError(内存用完了:原因-内存泄漏或内存溢出)故障最主要的发源地,它存储着几乎所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用。通常情况下,它占用的空间是所有内存区域中最大的,但如果无节制地创建大量对象,也容易消耗完所有的空间。堆的内存空间既可以固定大小,也可运行时动态地调整,通过如下参数设定初始值和最大值,比如-Xms512M. -Xmx512M。

堆分成两大块:新生代和老年代
对象产生之初在新生代,步入暮年时进入老年代,但是老年代也接纳在新生代无法容纳的超大对象

JVM运行机制图:

JDK1.6之前,eclipse对于sun公司的标识能够识别出来,会自动添加对于JVM老年代的容量大小限制: -XX: MaxPermSize=256M; 因为,其他的虚拟机没有hotspot的永久代的概念。 而JDK1.6的时候,sun已经被Oracle收购,替换了jdk中sun的标识,所以,eclipse无法识别出此虚拟机是hotspot的JVM。所以,不会自动给HotSpot设置永久代的内存容量大小。 JVM容易出现持久代一直增长,而导致内存的溢出。

JVM内存模型和结构相关推荐

  1. Java JVM内存模型

    简述JVM内存模型 线程私有的运行时数据区: 程序计数器.Java 虚拟机栈.本地方法栈. 线程共享的运行时数据区:Java 堆.方法区. 简述程序计数器 程序计数器表示当前线程所执行的字节码的行号指 ...

  2. 【深入理解JVM】JVM内存模型

    JVM定义了若干个程序执行期间使用的数据区域.这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁.而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁. 1.程序计数器 程 ...

  3. 深入详解JVM内存模型与JVM参数详细配置

    本系列会持续更新. JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内 ...

  4. JVM内存模型与垃圾回收GC

    Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础--这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...

  5. 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

    JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃 ...

  6. JVM 内存模型与内存分配方式

    文章目录 JVM 内存模型概述 基于分代收集理论设计的垃圾收集器所管理的堆结构 方法区的演变 内存分配 划分内存的方法 划分内存时如何解决并发问题 对象栈上分配 基于分代收集理论的垃圾收集器管理下的内 ...

  7. JVM内存模型和类加载运行机制

    JVM内存模型和类加载运行机制 JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM ...

  8. jvm 参数_一文带你深入了解JVM内存模型与JVM参数详细配置

    JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. 一.JVM内存结构 由上图可以清楚的看到JVM的内存空间分 ...

  9. 【转】深入理解JVM—JVM内存模型

    原文链接 http://www.cnblogs.com/dingyingsi/p/3760447.html#top 深入理解JVM-JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是 ...

  10. 【深入浅出指南:JVM知多少】一、JVM内存模型

    我是飞乐,一个在互联网苟且的男人,微信关注搜索[nlefer],跟飞乐一起学习更多内容 JVM内存模型 前言 一.概述 二.内存模型 1.程序计数器 2.Java虚拟机栈 2.1.栈帧过多测试 3.本 ...

最新文章

  1. HBase in 2013
  2. MediaCodec问题汇总
  3. [翻译]No.9352 SharePoint Pages(1)之SharePoint页面体系架构
  4. pandas纵向合并数据
  5. 科大星云诗社动态20210319
  6. 计算机的相关配置信息,win7系统查看电脑配置相关信息的方案介绍
  7. 远程控制木马软件_Jump Desktop for mac (远程控制软件)
  8. html5储存类型,html5本地存储-留言板
  9. webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)
  10. C语言-附加-按位翻转一个unsigned int 类型的数字
  11. 如何实现插入数据时自动更新另外一个表的内容
  12. javaweb中servlet中使用poi
  13. java应届毕业生面试技巧
  14. 离散数学-----自然数系统
  15. 大佬云集的在线少儿英语市场,谁才是那匹冲出重围的黑马?
  16. 计算机家庭网络未识别,Win7排除常见家庭网络问题的方法
  17. python制作简单动画_让数据动起来!用python制作动画可视化效果,让数据不再枯燥!...
  18. 打开ajax大门的新世界(我真的很喜欢这篇内容!)
  19. 第七章——数据库设计
  20. linux apache python wsgi,linux下apache2+django+mod_wsgi方式配置web站点

热门文章

  1. 程序员入门必备经典书单
  2. Linux 简单教程
  3. 在SPSS中使用广义估算方程对非独立相关数据进行分析的方法
  4. AudioEffect构造流程跟踪 音效库实现(native侧)
  5. 串口数据的抓取与监视
  6. Sql Server 数据库实验报告
  7. java 数字信号_GitHub - Bazingaliu/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
  8. 《疯狂的程序员》 -- 什么是真正的程序员?
  9. 【更新】怎样免费下载百度文库文档
  10. OD调试4----去除NAG窗口的几种方法