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

Java之 jvm

jvm之管理内存

  1. 程序计数器:当前线程所执行的字节码的行号指示器。程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。
  2. Java虚拟机栈  方法调用 一个方法调用都会有对应的栈帧被压入栈中 

    局部变量表:各种数据类型、对象引用类型                                                                              操作数栈:用于存放方法执行过程中产生的中间计算结果。另外,计算过程中产生的临时变量也会放在操作数栈中。                                                                                                           栈的内存不允许动态链接,栈会出现StackOverFlowError,当可以动态扩展,但是在扩展的时候没有办法申请到足够的内存空间,则抛出OutOfMemoryError异常。Java 方法有两种返回方式,一种是 return 语句正常返回,一种是抛出异常。不管哪种返回方式,都会导致栈帧被弹出。也就是说, 栈帧随着方法调用而创建,随着方法结束而销毁。无论方法正常完成还是异常完成都算作方法结束。
  3. Java本地方法栈:本地方法栈则为虚拟机使用到的 Native 方法服务。 
  4. 堆  大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 S0 或者 S1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。这里最容易出现OutOfMemoryError 当jvm花太多时间执行垃圾回收比关切只能回收很少的堆空间的时候,就会报这个错误

  5. 元空间是永久代的实现 把永久代换成元空间的原因——整个永久代有一个 JVM 本身设置的固定大小上限,无法进行调整(也就是受到 JVM 内存的限制),而元空间使用的是本地内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。

  6. 运行时常量池:常量池表会在类加载后存放到方法区的运行时常量池中。

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

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

  9. 对象的创建——类加载检查、分配内存(指针碰撞、空闲列表,分配方式由Java堆是否规整决定 而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。)——初始化零值——设置对象头(这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。)——执行init方法

  10.  对象在内存中的布局可以分为 3 块区域:对象头(Header)实例数据(Instance Data)对齐填充(Padding)。对齐填充起到占位作用,8字节的整数倍
  11. 对象的访问
  12. 内存分配以及回收原则
  • 优先在Eden区分配,当内存不够的时候会触发Minor GC,Survivor空间内存足够的情况下转入,并将对象年龄设为 1(Eden 区->Survivor 区后对象的初始年龄变为 1)。不足的情况下通过 分配担保机制 把新生代的对象提前转移到老年代中去
  • 大对象直接进老年代
  • 长期存活的对象将进入老年代,对象在 Survivor 中每熬过一次 MinorGC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。
  • Java之垃圾回收

  1. 死亡对象判断方法
  • 引用计数法 有地方引用就加1,引用失效减一。 问题:循环引用
  • 可达性分析算法  GC Roots
  • 引用类型总结: 
  • 强引用:不会回收,内存不足,抛出OutOfMemoryError 错误,
  • 软引用:可有可无,内存不足会回收,与引用队列联合使用
  • 弱引用:一旦发现,不管内存是否足够,都会回收。但是垃圾回收器是一个优先级很低的线程,因此不一定会很快发现。与引用队列联合使用
  • 虚引用:任何时候都可能被回收。主要用来跟踪对象被垃圾回收的活动。
  • 如何判断一个常量是废弃常量?运行时常量池主要回收的是废弃的常量
  • 如何判断一个类是无用的类?  (1)该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。(2)加载该类的 ClassLoader 已经被回收。(3)该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
  1. 垃圾收集算法
  • 标记清除算法:创建对象,标记o;然后可达对象标记为1 ,扫描阶段清除为o的 。内存碎片
  • 复制算法: 内存缩小为原来的一半
  • 标记-整理算法:老年代,标记之后不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后清理掉端边界以外的内存
  • 分代收集算法:根据对象存活周期的不同将内存分为几块,采用不同的收集算法
  1. 垃圾收集器
  • serial收集器:暂停其他所有的工作线程,只用一条垃圾收集线程完成垃圾收集工作。

    新生代采用标记-复制算法,老年代采用标记-整理算法。 简单高效

  • parNew收集器:只是使用多线程区进行垃圾收集

  • parallel scavenge收集器  关注吞吐量 以及cpu资源的场合

  • CMS收集器 是一种以获取最短回收停顿时间为目标的收集器。第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。

  • G1收集器 一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征。G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 量化机器人能否提高市场预测精度?
  • 推荐一款基于Spring Boot 框架开发的分布式文件管理系统,功能齐全,非常便捷(带私活源码)
  • Mysql注意事项(二)
  • golang长连接的误用
  • 使用原生 HTML + JS 实现类似 ChatGPT 的文字逐字显示效果
  • 实现Nginx的反向代理和负载均衡
  • Vue中渲染函数
  • Elasticsearch:Java ECS 日志记录 - log4j2
  • GMSSL2.x编译鸿蒙静态库和动态库及使用
  • 【ELK】window下ELK的安装与部署
  • 【算法专题】双指针算法之LCR 179. 查找总价格为目标值的两个商品(力扣)
  • 【已解决】服务器无法联网与更换镜像源
  • JavaScript之WebAPIs-BOM
  • TCP重传机制详解
  • 【BUG】已解决:requests.exceptions.ProxyError: HTTPSConnectionPool
  • SegmentFault for Android 3.0 发布
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 11111111
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 77. Combinations
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES6之路之模块详解
  • mongo索引构建
  • Netty 4.1 源代码学习:线程模型
  • nginx 负载服务器优化
  • React-flux杂记
  • text-decoration与color属性
  • ubuntu 下nginx安装 并支持https协议
  • Vue 动态创建 component
  • 简单基于spring的redis配置(单机和集群模式)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何选择开源的机器学习框架?
  • 王永庆:技术创新改变教育未来
  • 为什么要用IPython/Jupyter?
  • 小程序开发之路(一)
  • 转载:[译] 内容加速黑科技趣谈
  • nb
  • 大数据全解:定义、价值及挑战
  • 进程与线程(三)——进程/线程间通信
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #数学建模# 线性规划问题的Matlab求解
  • (3)选择元素——(17)练习(Exercises)
  • (4)Elastix图像配准:3D图像
  • (C语言)字符分类函数
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (理论篇)httpmoudle和httphandler一览
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十一)图像的罗伯特梯度锐化
  • (四) Graphivz 颜色选择
  • (一) springboot详细介绍
  • (一) storm的集群安装与配置