jvm内存模型和运行时数据区,jvm运行时内存分区

  jvm内存模型和运行时数据区,jvm运行时内存分区

  简化的JVM体系结构

  运行时数据区包括:程序计数器(PC寄存器)、Java虚拟机栈、Java堆、方法区、运行时常量池、本地方法栈等。

  PC寄存器,也称为程序计数器1。JVM支持多个线程同时运行。每个线程都有一个程序计数器,它是线程私有的,用于存储指向下一条指令的地址。

  2.创建线程时,创建相应的程序计数器。

  3.当执行本地本机方法时,程序计数器的值是未定义的。

  4.它是一个相对较小的内存空间,也是JVM规范中唯一没有指定OutOfMemoryError的内存区域。虚拟机栈是由一系列的帧组成的(所以Java栈也叫帧栈),是线程私有的。

  框架用于存储局部变量、方法的操作数栈(java没有寄存器,所有参数都使用操作数栈传递)、常量池指针、动态链接、方法返回值等。

  每次方法调用创建一个框架并按下堆栈,当方法退出时,可以通过修改堆栈顶部的指针来销毁堆栈框架中的内容。

  局部变量表存储编译时已知的各种基本数据类型和引用数据类型。每个槽存储32位数据,long和double占用两个槽。

  栈的优点:访问速度比堆快,仅次于程序计数器。

  堆栈的缺点:堆栈中的数据太小,生存期在编译时确定,缺乏灵活性。

  StackOverflowError异常:当线程请求的堆栈深度大于虚拟机允许的深度时;

  OutOfMemoryError异常:如果栈扩展时不能申请足够的内存。

  Java堆用于存储应用系统创建的对象和数组,所有线程共享Java堆。

  GC主要管理堆空间,对于分代GC来说,堆也是分代的。

  堆的优点:运行时动态分配内存大小,自动垃圾回收。

  堆的缺点:效率比较慢。方法区域方法区域由线程共享,通常用于存储加载类的结构信息。

  通常与元空间相关,但具体与JVM实现和版本相关。

  JVM规范将方法区域描述为堆的逻辑部分,但是它有一个别名叫做非堆,应该与Java堆相区别。运行时常量池是类文件中每个类或接口的常量池表。运行时的表现形式通常包括类的版本、字段、方法、接口等信息。

  运行时常量池是在方法区分配的。

  通常,在将类和接口加载到JVM中之后,会创建相应的运行时常量池。本地方法堆栈JVM中用于支持本地方法执行的堆栈是本地方法堆栈。

  在JVM规范中,对于本地开发的具体实现方法和数据结构没有强制规定,虚拟机可以自由实现。在HotSopt虚拟机中,本地方法栈和Java栈直接合二为一。堆栈、堆和方法区域之间的交互

  Java堆内存模型和分配Java堆用于存储应用系统创建的对象和数组,所有线程共享Java堆。

  Java堆在运行时动态分配内存大小,并自动收集垃圾。

  Java垃圾收集(GC)主要收集堆内存。对于分代GC,堆也是分代的。Java堆的结构

  堆JVM是内存占用最大,管理最复杂的区域。它唯一的目的是存储对象实例:所有对象实例和数组都在堆上分配。在1.7之后,字符串常量池从永久代中剥离出来,存储在堆中。堆有自己的进一步的内存分区,根据GC代收集角度。

  新一代中新分配的对象在新一代中垃圾回收后被复制到旧时代。

  储存在旧时代的物品比储存在新时代的物品要古老得多。

  年龄会储存一些大物件。

  整个堆的大小=新生代的年龄

  新生代=伊甸园生存区

  在以前的持久化版本中,用于存储类和方法等元信息的区域已经从JDK8中移除,并由元空间取代,元空间不在虚拟机中,而是直接使用本地内存。对象的内存布局内存中存储的对象的布局(这里以热点虚拟机为例)分为:对象头、实例数据和对齐填充。

  对象头包含两个部分:1 .标记字:用于存储对象本身的运行时数据,如:HashCode、GC生成年龄、锁状态标志、线程持有的锁、有偏线程ID、有偏时间戳等。2.类型指针:对象指向其类元数据的指针。实例:对象实例的数据实际存储的地方用padding对齐:这个部分不一定存在,也没有什么特殊意义,只是一个占位符。这是因为HotSpot要求对象的起始地址应该是8字节的整数倍,如果不是,就应该对齐。

  在JVM规范中,对象的访问位置只规定了引用类型是对对象的引用,而没有规定如何定位引用和访问对象在堆中的具体位置。

  因此,对象的访问方法取决于JVM的具体实现。目前主流的方式有两种:使用句柄和指针。

  使用手柄:

  Java堆中会划分出一块内存作为句柄池,句柄的地址存储在引用中,对象的实例数据和类元数据的地址存储在句柄中。

  使用指针:

  Java堆会存储访问类元数据的地址,引用会直接存储对象的地址。各自的优势:

  句柄访问:稳定的句柄地址存储在引用中。移动对象时(垃圾回收时移动对象是很常见的行为),只会改变句柄中的实例数据指针,引用本身不需要修改。

  直接指针访问:它很快,并且节省了定位指针的时间成本。由于对象在JAVA中被频繁访问,这种开销积少成多也是一笔可观的执行成本。Trace参数-verbose:gc:打印gc的简要信息

  -XX: Printgc:打印gc的简要信息。

  -XX: PrintGCDetails:打印GC细节。

  -XX:printgcstimestamps:打印GC发生的时间戳。

  -Xlog:gc:log/gc.log:指定gc日志的位置,并将其作为文件输出。

  -xx: printheapgc:在每次gc之后,打印堆信息。

  -Xlog:gc heap=debug:在每次gc之后,打印堆信息。

  -XX: TraceClassLoading:监控类的加载GC日志格式GC发生的时间,即JVM启动后经过的秒数。

  日志级别信息和日志类型标记

  GC识别号

  GC的类型和GC的原因。

  容量:GC前容量-GC后容量(该区域的总容量)

  GC持续时间,单位秒。有些收集器会更详细的描述,比如:user表示应用消耗的时间,sys表示系统内核消耗的时间,real表示从操作开始到结束的时间。Java heap -Xms的参数:初始堆大小,默认为物理内存的1/64。

  -Xmx:最大堆大小,默认物理内存的1/4。

  -Xmn:新生代大小,默认为整个堆的3/8。

  -XX:minheafpreeratio:设置堆空间的最小空闲比率。当空间的空闲内存小于这个值时,JVM将扩展堆空间。

  -XX:MaxHeapFreeRatio:设置堆空间的最大空闲率。当堆空间中的空闲内存大于该值时,堆空间将被压缩以获得更小的堆。

  -XX:NewSize:设置新一代的大小。

  -XX:NewRatio:设置旧年龄与新年龄的比值,等于旧年龄除以新年龄。

  -XX:survivalion:新生代伊甸面积与残存面积之比,设为8,则两个残存面积与一个伊甸面积之比为2:8,一个残存面积占整个新生代的1/10。

  -XX:TargetsurviviorRatio:设置幸存者区域的可用性。当survivior区域的空间利用率达到这个值时,对象将被发送到老年。

  -xx:heapdumpoutofmemory error:OOM将堆导出到文件。

  -XX:HeapDumpPath:导出OOM的路径。

  -XX:OnOutOfMemoryError:在OOM执行脚本。Java stack -Xss的参数:设置线程栈的大小,一般只有几百K,决定了函数调用的深度。元空间的参数-XX:MetaspaceSize:元空间的GC阈值(JDK1.8)

  -XX:MaxMetaspaceSize:最大元空间大小(JDK1.8)

  -XX:MaxDirectMemorySize:直接内存大小,默认为最大堆空间。

  -XX:MinMetaspaceFreeRatio:GC之后,最小元空间剩余空间容量的百分比。

  -XX:MaxMetaspaceFreeRatio:GC后最大元空间剩余空间容量的百分比。内存分配和回收策略内存分配,主要是堆内存分配(也可能拆分成标量类型,JIT编译后在栈上间接分配),主要是在新一代的eden上分配。如果启动了本地线程分配缓冲区,会根据线程优先级在TLAB上进行分配,少数情况下可能会在陈年直接分配。分配规则不是100%固定的。这取决于垃圾收集器和虚拟机参数设置的组合。

  在eden中,优先考虑对象分配。在大多数情况下,对象被分配在新一代的Eden区域。当Eden区域没有足够的空间分配时,会启动一次小GC。虚拟机提供收集器日志参数-xx:printgdetails来打印日志收集日志。

  大对象直接进入旧时代:需要大量连续内存空间的java对象,比如很长的字符串和数组。-xx:pretenurezethreshold大于该值的set对象直接在旧时代分配。

  长期存活的对象进入老年期-xx: maxtenuringthreshold设置多大年龄的对象进入老年期。默认值为15。每有一个物体在幸存者中存活一次,次要GC年龄就增加一岁。

  动态对象年龄判断当幸存者空间中所有同龄对象的大小都是幸存者空间的一半以上时,大于或等于该年龄的对象可以提前进入老年,无需等待年龄到达。

  在空间分配保证发生之前,虚拟机计算旧时代的连续空间是否大于新一代对象的总大小或先前提升的平均大小。如果是,它将执行较小的垃圾收集;否则,它将执行FullGC。

  参考:

  https://www.cnblogs.com/lsgxeva/p/10231201.html

  https://www.cnblogs.com/lfs2640666960/p/8522588.html

  https://blog.csdn.net/u011080472/article/details/51321769

  https://blog.csdn.net/iva_brother/article/details/87886525

  http://blog.itpub.net/69906029/viewspace-2654005/

  https://blog.csdn.net/zhangxm_qz/article/details/88576660

  版权归作者所有:原创作品来自博主肖波,转载请联系作者取得授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: