当前位置: 首页 > article >正文

JVM——一些零散的概念(后续学习深入了再补充)

Native

凡是带了native关键字的,说明Java的作用范围的达不到了,需要调用底层C语言的库

调用native方法,会进入本地方法栈,调用本地接口(JNI)

JNI的作用:扩展Java的使用,融合不同的编程语言为Java所用

它在内存区域中专门开辟了一块标记区域:Native Method Stack(本地方法栈),登记native方法

在最终执行的时候,加载本地方法库中的方法通过JNI

调用其他接口:Socket、WebService、http

PC寄存器

程序计数器:Program Counter Register

每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的字节码,(用来存储指向一条指令的地址,也即将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。

方法区

Method Area

方法去是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享空间;

静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关

栈内存,主管程序的运行,生命周期和线程同步;

线程结束,栈内存也就释放了,对于栈来说,不存在垃圾回收问题。

栈中存放:8大基本类型+对象引用+实例的方法

栈运行原理:栈帧

栈满了:StackOverflowError

栈+堆+方法区:交互关系

三种JVM

  • Sun公司 HotSpot
  • BEA JRockit
  • IBM J9VM

Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。

类加载器读取了类文件后,一般会把什么东西放到堆中:类实例,方法,常量,变量。 保存我们所有引用类型的真实对象

堆内存中还要细分为三个区域:

  • 新生区(伊甸园区)
  • 老年区
  • 永久区

新生区、老年区、永久区

  • 新生区(伊甸园区)分为三个部分:伊甸园区、幸存0区、幸存1区。新生对象出生在伊甸园区,在经过GC垃圾回收器一次淘汰筛选过后,会进入幸存0区或幸存1区。幸存0区与幸存1区经常互换位置,使其中的数据也会经常互换位置,GC也会对幸存区进行垃圾回收。
  • 等经过GC多次淘汰过后,剩下的数据可以进入老年区,当老年区满了之后,GC将会来一次大清洗,即重GC,清除许多数据。
  • GC垃圾回收主要是在伊甸园区和老年区

假设内存满了,则会爆出OOM,堆内存不够 java.lang.OutOfMemoryError:java heap space

在JDK8以后,永久存储区改了个名字 ---------------- 元空间;

新生区

  • 类:诞生,成长甚至死亡的地方
  • 新生区分为伊甸园区,幸存者区(0,1)
  • 伊甸园区,所有类的实例对象都是在伊甸园区new出来的。如果伊甸园区满了,则GC将会开启清除行动,清除完毕后,幸存的对象将会移到幸存者区

老年区

  • 当幸存区中,一个对象经历15次GC(默认值)还没死的时候,该对象将会进入老年区
  • 可以设置这个参数,通过VM option 添加:-XX:MaxTenuringThreshold=9999(如何设置VM option 看堆内存调优)设置一个对象需要经历9999次GC才能进入老年区
  • 当幸存者区与伊甸园区都满了的时候,则会触发重GC,即GC会开启重清除行动,将伊甸园区与幸存者区皆清除一遍,剩下的对象将会进入老年区
  • 当老年区,幸存区,伊甸园区都满了的时候,则会触发OOM。不过所幸的是,经过研究发现,99%的对象都是临时对象,活不到老年区。

永久区

这个区域常驻内存的,用来存放JDK自身携带的Class对象,Inteface元数据,总的来说,存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收。关闭虚拟机就会释放这个区域的内存

方法区,常量池在永久区里

一个启动类,加载了大量的第三方jar包、tomact部署了太多的应用、大量动态生成的反射类,不断地被加载,直到内存满,就会出现OOM;

  • JDK1.6之前:永久代,常量池是在方法区;
  • JDK1.7 :也有永久代,但是慢慢退化了,提出去永久代,常量池在堆;
  • JDK1.8之后:无永久代,常量池在元空间;

在这里插入图片描述

元空间:逻辑上存在,物理上不存在


http://www.kler.cn/a/105729.html

相关文章:

  • HarmonyOS Next 关于页面渲染的性能优化方案
  • SpringBoot登录功能实现思路(验证码+拦截器+jwt)
  • 前后端学习
  • hhdb数据库介绍(9-21)
  • 探索Python PDF处理的奥秘:pdfrw库揭秘
  • 苹果ASA归因对接以及API接入
  • 【Linux】Centos yum源替换
  • 面试必考精华版Leetcode215. 数组中的第K个最大元素
  • 大促期间的窜货低价怎么处理
  • 网络协议--TFTP:简单文件传送协议
  • 安装k8s
  • 第六节——Vue中的事件
  • 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— 总结篇(三)
  • 2.7每日一题(分段函数不定积分)
  • Node编写获取用户信息接口
  • 华为eNSP配置专题-策略路由的配置
  • [100天算法】-实现 Trie(day 41)
  • element ui el-table表格纵向横向滚动条去除并隐藏空白占位列
  • 前端开发技术栈(工具篇):2023深入了解webpack的安装和使用以及核心概念和启动流程(详细) 63.3k stars
  • Django 实战开发(一)项目搭建
  • NDK交叉编译FFmpeg安卓编译ffmpeg
  • linux可视化运维工具
  • 如何在Postman中使用静态HTTP
  • Kubernetes 特性门控
  • 全连接层是什么,有什么作用?
  • 域控操作三点五:使用策略下发将域用户添加到本地管理员组