JVM内存结构,垃圾回收算法,垃圾收集器,jvm参数配置以及常用的分析工具

更新时间:2023-06-08 08:41:12 阅读: 评论:0

JVM内存结构,垃圾回收算法,垃圾收集器,jvm参数配置以及常⽤的分析⼯具
⼀、jvm的组织结构undergraduate>世博会口号
(1)jvm 和系统调⽤之间的关系
  相应的名词解释:
类加载器:在jvm启动或者类运⾏时将需要的class加载到jvm内存中
执⾏引擎:负责执⾏class⽂件中包含的字节指令
内存区:是在jvm运⾏的时候操作锁分配的内存区。运⾏时内存区分五个部分:堆、⽅法区、栈、本地⽅法栈、程序计数器,
本地⽅法接⼝:主要是调⽤c或者c++实现的本地⽅法及返回结果。
october怎么读
(2)jvm 的内存结构
  jvm内存结构主要由三⼤块:堆内存、⽅法区和栈。
  堆内存:是jvm中最⼤的⼀块由年轻代和⽼年代组成,⽽年轻代内存⼜被分成三个部分:Eden 空间(对相关刚刚被创建时存放的位置)、From Survivor() 空间、To Survivor(存货下来的对象的存放区域) 空间,默认情况下年轻代按照 8:1:1 的⽐例来分配。
常开触点  ⽅法区(永久代):存储信息、常量、静态变量等数据,是线程共享的区域,为与java堆区分,⽅法区还有⼀个别名Non-Heap(⾮堆) jvm各区域的作⽤。
  栈:⼜分为java虚拟机栈和本地⽅法栈和程序计数器,主要⽤于⽅法的执⾏。
(3)各个区域参数调控
堆内存的设置:
-Xms:设置堆的最⼩空间⼤⼩
-Xmx:设置堆的最⼤空间⼤⼩
-
XX:NewSize 设置新⽣代最⼩空间⼤⼩
-XX:MaxNewSize:设置新⽣代最⼤空间⼤⼩
-XX:PermSize 设置永久代最⼩空间⼤⼩
-XX:MaxPermSize 设置永久代最⼤空间⼤⼩
-Xss 设置每个线程的堆栈⼤⼩
没有直接设置⽼年代的参数,但是可以设置堆空间⼤⼩和新⽣代空间⼤⼩两个参数来间接控制:⽼年代空间⼤⼩=堆空间⼤⼩-年轻代⼤空间⼤⼩问题:是不是⼀个java程序就会开启⼀个java虚拟机?
开⼀个Java程序,就会有⼀个jvm运⾏,这可能是或开启的。
⽐如你开eclip,看进程管理器⾥⾯有可能有多个,这是因为它的⼀些插件运⾏也需要jvm。
⼆、jvm各内存区域的作⽤
(1)各个区域的概述:
共享区
⽅法区
线程的私有区域
java栈
本地⽅法栈
程序计数器
(2)java 堆(heap):
对于⼤多数应⽤来说,Java 堆(Java Heap)是 Java 虚拟机所管理的内存中最⼤的⼀块。Java 堆是被所有线程共享的⼀块内存区域,在虚拟机启动时创建。 此内存区域的唯⼀⽬的就是存放对象实例,⼏乎所有的对象实例都在这⾥分配内存。
  java堆是垃圾收集器管理的主要区域,因此很多时候也被成为GC堆。如果从内存回收的⾓度看,由
于现在收集器基本都是采⽤分代收集算法,所以 java堆中还可以划分:新⽣代和⽼年代;在细⼀点的划分:新⽣代⼜包括:Eden 空间、From Survivor 空间、To Survivor 空间。
  如果在堆中没有内存完成实例分配(堆中没有内存装得下对象),并且堆也⽆法再扩展时,将会抛出 OutOfMemoryError 异常。
通用记账凭证补充(新⽣代到⽼年的过程-两种⽅式):⼤多数情况下,对象在新⽣代Eden区中分配。当Eden区没
有⾜够空间进⾏分配时,虚拟机将发起⼀次Minor GC,此时对象会进⼊survivor区,当对象满⾜⼀些条件后会进⼊⽼年代。
长期存活的对象将进⼊⽼年代:虚拟机给每个对象定义了⼀个对象年龄(Age)计数器。如果对象在Eden出⽣并经过第⼀次Minor GC 后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1。对象在Survivor区中每“熬过”⼀次Minor GC,年龄就增加1岁,当它的年龄增加到⼀定程度(默认为15岁),就将会被晋升到⽼年代中。对象晋升⽼年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold设置。
如果在Survivor空间中相同年龄所有对象⼤⼩的总和⼤于Survivor空间的⼀半,年龄⼤于或等于该年龄的对象就可以直接进⼊⽼年代,⽆须等到MaxTenuringThreshold中要求的年龄。
虚拟机提供了⼀个-XX:PretenureSizeThreshold参数,令⼤于这个设置值的对象直接在⽼年代分配。这样做的⽬的是避免在Eden区及两个Survivor区之间发⽣⼤量的内存复制。
(3)⽅法区(method area):
⽅法区与java⼀样,是各个线程的共享的内存区域,它⽤于 存储被jvm加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。  jvm规范对这个区域的限制⾮常宽松,除了和java堆⼀样不需
要连续的内存和可以选择固定⼤⼩,还可以选择不实现垃圾收集。相对⽽⾔,垃圾收集⾏为在这个区域是⽐较少出现的,到哪并⾮数据进⼊的⽅法区就“永远”存在了。这个区域的内存回收⽬标主要是针对常量池的回收和对类型的卸载,⼀般来说这个区域的回收 “成绩”⽐较难以令⼈满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是有必要的。
  根据 Java 虚拟机规范的规定,当⽅法区⽆法满⾜内存分配需求时,将抛出 OutOfMemoryError 异常。
(4)程序计数器:
程序计数器时⼀⼩块的内存空间,它的作⽤可以看做是当前程序所执⾏的 字节码的⾏号指⽰器,字节码解释器⼯作时就是通过改变这个计数器的值来选取下⼀条需要执⾏的字节码指令, 分⽀、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。
  由于 Java 虚拟机的多线程是通过线程轮流切换并分配处理器执⾏时间的⽅式来实现的,在 任何⼀个确定的时刻,⼀个处理器(对于多核处理器来说是⼀个内核)只会执⾏⼀条线程 中的指令。因此,为了线程切换后能恢复到正确的执⾏位置,每条线程都需要有⼀个独⽴的程序计数器,各条线程之间的计数器互不影响,独⽴存储,我们称这类内存区域为“线程私有”的内存。the christmas song
  如果线程正在执⾏的是⼀个 Java ⽅法,这个计数器记录的是正在执⾏的虚拟机字节码指令的地址;如果正在执⾏的是 native ⽅法(调⽤时使⽤底层的指令),这个计数器值则为空(Undefined)。
  此内存区域是唯⼀⼀个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。
(5)java虚拟机栈:
**Java 虚拟机栈(Java Virtual Machine Stacks)**也是线程私有的,它的 ⽣命周期与线程相同。虚拟机栈描述的是 Java ⽅法执⾏的内存模型:每个⽅法被执⾏的时候 都会同时创建⼀个栈帧(Stack Frame)⽤于 存储局部变量表、操作栈、动态链接、⽅法出⼝等信息。每⼀个⽅法被调⽤直⾄执⾏完成的过程,就对应着⼀个栈帧在虚拟机栈中从⼊栈到出栈的过程。
围兜英文  局部变量表存放了编译期可知的各种基本数据类型,局部变量表所需的内存空间在编译期间完成分配,当进⼊⼀个⽅法时,这个⽅法需要在帧中分配多⼤的局部变量空间是完全确定的,在⽅法运⾏期间不会改变局部变量表的⼤⼩。
  关于java虚拟机栈的异常:1) 如果线程请求的栈深度⼤于虚拟机所允许的深度,将抛出 StackOverflowError 异常 2) 如果虚拟机栈可以动态扩展,当扩展时⽆法申请到⾜够的内存时会抛出 OutOfMemoryError 异常。六月缩写
(6)本地⽅法栈:
使⽤native修饰的⽅法,则存储在本地⽅法栈中。与虚拟机栈⼀样,本地⽅法栈 区域也会抛出 StackOverflowError 和OutOfMemoryError 异常。
三、jvm的垃圾回收机制介绍
(1)jvm 垃圾回收介绍:
垃圾收集Garbage Collection通常被称为“GC”,它诞⽣于1960年MT的Lisp语⾔。Jvm中,程序计数器、虚拟机栈、本地⽅法栈都是随线程⽽⽣随线程⽽灭,栈帧随着⽅法的 进⼊和退出做⼊栈和出栈操作,实现了⾃动的内存清理,因此,我们的内存垃圾回收主要集中于Java 堆和⽅法区中,在程序运⾏期间,这部分内存的分配和使⽤都是动态的。
(2)垃圾收集器(Garbage Collection)的介绍:
 GC其实是⼀种⾃动的内存管理⼯具器⾏为主要包括2个步骤:在Java堆中,为新的创建的对象分配空间、回收没有⽤的对象的内存空间(3)实现多种GC的好处:
Java 平台被部署在各种各样的硬件资源上,其次,在 Java 平台上部署和运⾏着各种 各样的应⽤,并且⽤户对不同的应⽤的性能指标(吞吐率和延迟)预期也不同,为了满⾜不同 应⽤的对内存管理的不同需求,JVM 提供了多种 GC 以供选择。
GC的性能指标主要包括:
最⼤停顿时长:圾回收导致的应⽤停顿时间的最⼤值
for the first time
吞吐率:垃圾回收停顿时长和应⽤运⾏总时长的⽐例
例:⼀次应⽤程序运⾏了60s,然后GC的时长为2s(进⾏了4次GC:0.5,0.8,0.2,0.5),那么最⼤的停顿时长为:0.8,吞吐率为:(60-2)/60
义务兵役制

本文发布于:2023-06-08 08:41:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/137963.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内存   线程   对象   区域
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图