首页 > 其他分享 >jvm简单介绍(JDK1.8)

jvm简单介绍(JDK1.8)

时间:2023-06-10 22:00:14浏览次数:26  
标签:JDK1.8 Java 虚拟机 XX 内存 jvm 简单 OutOfMemoryError 方法

 

线程私有

程序计数器

主要有两个作用:

  • 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
  • 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。

 

Java 虚拟机栈

除了一些 Native 方法调用是通过本地方法栈实现的,其他所有的 Java 方法调用都是通过栈来实现的

方法调用的数据需要通过栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。

栈由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法返回地址。和数据结构上的栈类似,两者都是先进后出的数据结构,只支持出栈和入栈两种操作。

 

 

局部变量表 主要存放了编译期可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。

 动态链接 主要服务一个方法需要调用其他方法的场景。

当一个方法要调用其他方法,需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。

动态链接的作用就是为了将符号引用转换为调用方法的直接引用。

  

程序运行中栈可能会出现两种错误:

  • StackOverFlowError 若栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误。
  • OutOfMemoryError 如果栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

本地方法栈

和虚拟机栈所发挥的作用非常相似,区别是:虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。

方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowErrorOutOfMemoryError 两种错误。

#

Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。 Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap)。   JDK 8 版本之后 PermGen(永久代) 已被 Metaspace(元空间) 取代,元空间使用的是本地内存。  

堆这里最容易出现的就是 OutOfMemoryError 错误,并且出现这种错误之后的表现形式还会有几种,比如:

  1. java.lang.OutOfMemoryError: GC Overhead Limit Exceeded:当 JVM 花太多时间执行垃圾回收并且只能回收很少的堆空间时,就会发生此错误。
  2. java.lang.OutOfMemoryError: Java heap space :假如在创建新的对象时, 堆内存中的空间不足以存放新创建的对象, 就会引发此错误。(和配置的最大堆内存有关,且受制于物理内存大小。最大堆内存可通过-Xmx参数配置,若没有特别配置,将会使用默认值


方法区

方法区属于是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域。

 

整个永久代有一个 JVM 本身设置的固定大小上限,无法进行调整,

而元空间使用的是本地内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。

当元空间溢出时会得到如下错误:java.lang.OutOfMemoryError: MetaSpace


方法区常用参数有哪些?

JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参数来调节方法区大小。

-XX:PermSize=N //方法区 (永久代) 初始大小
-XX:MaxPermSize=N //方法区 (永久代) 最大大小,超过这个值将会抛出 OutOfMemoryError 异常:java.lang.OutOfMemoryError: PermGen
 

相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。

JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是本地内存。下面是一些常用参数:

-XX:MetaspaceSize=N //设置 Metaspace 的初始(和最小大小)
-XX:MaxMetaspaceSize=N //设置 Metaspace 的最大大小

运行时常量池

Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic Reference)的 常量池表(Constant Pool Table)


 

字符串常量池

字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

可以通过 -XX:StringTableSize 参数来设置大小。

直接内存

直接内存是一种特殊的内存缓冲区,并不在 Java 堆或方法区中分配的,而是通过 JNI 的方式在本地内存上分配的。

 

================================================================================================================

 

 

JVM参数

指定堆内存–Xms-Xmx:指定最小和最大堆大小

新生代内存

1.-XX:NewSize-XX:MaxNewSize

2.-Xmn

 

指定永久代/元空间的大小

JDK 1.8 之前永久代

-XX:PermSize

-XX:MaxPermSize

JDK 1.8元空间

-XX:MetaspaceSize

-XX:MaxMetaspaceSize

MetaspaceSize 表示 Metaspace 使用过程中触发 Full GC 的阈值,只对触发起作用





 

标签:JDK1.8,Java,虚拟机,XX,内存,jvm,简单,OutOfMemoryError,方法
From: https://www.cnblogs.com/sumingyi/p/17472043.html

相关文章

  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后......
  • 中国红 实验七 综合软件项目案例 简单高校学生管理软件
    实验七:综合软件项目案例简单高校学生管理软件项目内容班级博客链接2023春软件工程2020级计算机科学与技术本次作业要求链接实验七:综合软件项目案例团队名称中国红团队的课程学习目标完成综合软件项目案例,总结软件开发相关经验这个作业在哪些方面帮助团......
  • mybatis-plus是什么框架,使用起来简单吗?文末有彩蛋
    mybatis框架我们都熟悉了,是用来操作数据库的属于ORM框架。mybatis-plus是什么框架,看名称和手机似的,带有plus一定是加强版,其官网是:MyBatis-Plus(baomidou.com)开始mybatis-plus的实践吧。一、环境及依赖这里,基于springboot集成mybatis-plus。先看下具体的版本,springboot:2.3.3......
  • 怎样简单的配置yum
    最近有好几个刚接触linux系统的小伙伴询问蜜蜂:“怎样才能更好更快的掌握linux系统上各种软件的安装?”。linux的版本有很多,但用起来都大差不差,像centos就可以使用rpm命令来装包,但对很多初学者来说可能存在一定的难度,所以使用yum软件包管理仓库来实现软件的安装和卸载确实是比较简单......
  • 简单滑动窗口题目解析(c实现)
    下面的题目要使用的主要思路为滑动窗口,但是还需要使用哈希表来储存窗口中的元素个数题目一:无重复字符的最长子串题目一链接给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所......
  • Python爬取并简单分析2024年普通高校招生专业(专业类)选考科目要求
    任务描述:使用Python语言编写网络爬虫程序,采集山东省考试院发布的2024年普通高校招生专业(专业类)选考科目要求,然后统计不同要求的本科专业数量和专科专业数量。网页源代码分析与爬虫程序原理请参考:Python爬取2021年拟在山东招生普通高校专业(类)选考科目要求Python采集全国高校2020年拟......
  • 简单的电商运用--假模换真人
    原图是这样的 效果是这样的步骤:1,先用ps钢笔工具勾出面部2,图生图重绘非蒙版区域;开启controlnet,预处理器,模型用canny ......
  • javascript简单介绍
    javaScript简介介绍:一种弱类型世界上最流行的脚本语言,其源代码不需要经过编译,而是由浏览器直接运行,控制网页的行为。表现层CSScss层叠样式表是一门标记语言,并不是编程语言,因此不能进行自定义变量,不可以引用等,就是不具备任何语法支持。前端人员提供了一种css的预处理器,提供css......
  • 简单头部信息结构
    reset.css:预定义标签  预定义标签用法: 下图的信息结构 ......
  • 前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页
    前端vue简单好用的上拉加载下拉刷新组件,支持列表分页本地分页, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12942效果图如下:    ####使用方法```使用方法<!--pullDown:下拉刷新back-top:回到顶部 --><ccPullScro......