JVM运行时的内存划分--JDK1.8

  对比JDK1.7,JDK1.8在运行时的内存分配上进行了调整。本篇对JDK1.8版本进行简要介绍。

  先以一张图片描述运行时内存:

  

程序计数器

  记录当前线程执行的字节码行号。如果执行的是native方法,值为null。

虚拟机栈

  每一个线程执行时,都对应有一个虚拟机栈,生命周期与线程相同。一个虚拟机栈有一个一个的栈帧组成,每个java方法被调用时都会创建一个栈帧,然后入栈,方法结束后出栈。一个栈帧由局部变量表,操作数栈,动态链接和方法出口信息组成。

  如果方法中出现递归调用死循环,或者栈帧大小超过虚拟机栈限制都会抛出StackOverflowError;

  

 本地方法栈

  功能与虚拟机栈差不多,只不过本地方法栈是虚拟机在调用native方法时使用。

  堆是JVM占用比例最大的一块区域,用来存放对象实例。现代JVM大多将堆分为老年代和新生代。老年代与新生代比例为2:1。新生代分为一个Eden和两个Survivor区域,比例为8:1:1。

  JDK1.7之后,运行时常量池从方法区中移入到堆中,存放一些符号引用。

元数据区
  在JDK1.7的时候,有一个JVM内存区域中有一块方法区,主要存放虚拟机加载的类信息,静态变量,常量等。

  JDK1.8时,移除了方法区的概念,用一个元数据区代替。元数据区存放的东西和方法区相同,不过元数据区移动到本地内存中。本地内存,又称堆外内存(Direct Memory),就是指机器内存中不是JVM管理的那部分内存,由操作系统管理。元数据区移动到本地内存以后,可以避免虚拟机加载类过多而引发的内存溢出:java.lang.OutOfMemoryError: PermGen,但是同样不能无限扩展。

JVM常用参数

  • -Xms64m 最小堆内存 64m
  • -Xmx128m 最大堆内存 128m
  • -XX:NewSize=30m 新生代初始化大小为30m
  • -XX:MaxNewSize=40m 新生代最大大小为40m
  • -Xss=256k 线程栈大小
  • -XX:InitialSurvivorRatio 新生代Eden/Survivor空间的初始比例
  • -XX:Newratio 新生代和老年代的内存比例
  • -XX:MaxMetaspaceSize 元数据区最大内存

原文地址:https://www.cnblogs.com/sunshine-ground-poems/p/10421116.html

时间: 2024-09-28 09:03:48

JVM运行时的内存划分--JDK1.8的相关文章

JVM运行时的内存结构

我们都知道,JVM的垃圾收集机制能够帮开发者自动管理内存,了解JVM运行时的内存结构是理解垃圾收集机制的前提.本文主要简单介绍JVM运行时的内存结构. [JVM运行时内存中不同的数据区域] 一.PC寄存器 做过嵌入式开发或者底层编程的朋友应该都知道PC寄存器的作用,它就相当于在程序流中的游标,指示线程当前的运行位置.但是要注意,如果虚拟机执行的是本地native方法,则PC寄存器为undefined状态. 一个线程持有一个独立的PC寄存器. 二.java栈 每一个JVM线程都会拥有一个java栈

Java运行时环境---内存划分

背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对delete/free代码),放权给JVM虚拟机处理有利也有弊,好处是不容易出现内存泄漏和内存溢出问题,坏处就是自己的屁股不能自己擦,万一有一天JVM罢工不释放了,还是自个忘了释放,So了解虚拟机容易引起内存泄漏和溢出的场景对Java程序员来说还是必不可少的.[内存泄漏:Out Of Memmory,系统

利用jmap和MAT等工具查看JVM运行时堆内存

jmap JDK自带了一些工具可以帮助我们查看JVM运行的堆内存情况,常用的是jmap命令 jmap -heap <pid> 打印堆的使用情况 那么,从这个输出中我们也可以大致看出堆的结构,分为Young Generation (年轻代) 和 Old Generation (老年代) Young Generation又被划分为:Eden Space , From Space 和 To Space 可以看到这里To区是干净的,还未被使用,From区已经使用了95%了 jmap -histo[:l

JVM 运行时的内存分配

首先我们必须要知道的是 Java 是跨平台的.而它之所以跨平台就是因为 JVM 不是跨平台的.JVM 建立了 Java 程序和操作系统之间的桥梁,JVM 是用 C 语言编写,而 C 语言不具备跨平台的特性.所以对于 Windows 平台,Java 有基于 Windows 平台的 JVM:对于 Linux 平台,Java 也有基于 Linux 平台的 JVM等等.不同的操作系统有不同的 JVM,所以我们编写的 Java 代码能在各个平台上运行,是因为有各个平台的 JVM. 而 Java 的内存分配

JVM运行时数据区划分

Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行.不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区) (图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区 JavaAPI中的Runtime public class Runtime extends Object Every Java

jvm运行时内存划分

(根据<深入理解java虚拟机>这本书总结) 本文主要解释jvm内存模型,以及各个部分的作用.都是自己总结的给自己看的通俗语言,未用专业术语的见谅. 一.为什么要了解jvm内存模型? 在了解一个类的编译-加载-内存分配-初始化所有过程前,要先了解jvm的内存模型.这样对整个java体系可能会更加便于理解.当然,如果不理解这些,也是没关系的,照样可以进行java开发. 二.jvm内存模型 1.根据自己的理解举个最简单的例子,一个main方法启动,进程运行,在这个过程中,会调用方法.开启多个线程.

Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空. b.JVM栈(Java Virtual Machine Stack) 描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 每一个方法从调用直至执行完成

[转]JVM运行时内存结构

目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的JVM参数 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描.而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会

JVM运行时数据区与JVM堆内存模型小结

前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 程序计数器:保存当前线程执行的指令的地址(大意如此). 虚拟机栈:由栈帧组成,而每个栈帧又包括局部变量表.操作数栈.动态连接(调用其他方法).出口(被调用时返回值) -- 每个栈帧就代表了一个方法的执行. 本地方法栈:类似虚拟机栈,只不过方法改成了native方法. 方法区:保存了类的各种信息.类的