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

学习笔记JVM篇(一)

1、类加载的过程

加载->验证->准备->解析->初始化->使用->卸载

2、JVM内存组成部分(HotSpot)

名称作用特点
元空间(JDK8之前在方法区)用于存储类的元数信息,例如名称、方法名、字段等;以及动态生成的代理类,字节码。位于直接内存,线程共享
本地方法栈存储一些Native方法(用C写的方法)线程私有
虚拟机栈存储栈帧,每个栈帧中包含方法局部变量、方法参数、返回值等。线程私有
用于存储对象、数组等信息。是GC操作的空间。线程共享
PC寄存器用于记录线程执行到哪里线程私有

这里举个简单的例子:User u = new User();

User:类信息存储在元空间内容

u:对象引用存储在虚拟机栈中

new User():存储在堆中

3、堆空间

对于JVM优化来说,堆是最重要的部分,GC(垃圾回收就是发生在堆内存中),堆内存结构如下

4、JVM内存划分和内存垃圾回收的过程

1、首先创建对象会根据对象大小(可配置)来确定是分配在新生代还是老年代,绝大多数的对象是直接创建在新生代的Eden区

2、当Eden区满了之后会触发MinorGC用于,此时如果对象还存活会被复制到S1(from)区,当下次一次MinorGC时,如果该对象还存活着,则会从S1移动到S2(to)区。如此往复15次(可配),对象依旧存活说明该对象是一个比较稳定的对象,此时会吧对象移动到老年代。(我们也要尽可能减少MinorGC次数)

3、虽然老年代的空间比较大,但是也会有满的时候,当老年代满了就会触发FullGC对整个堆的垃圾进行回收,我们优化JVM的关键就是减少FullGC。FullGC的过程会出现STW

4、堆内存中的垃圾回收基本使用分代算法,即不同的区域用不同的垃圾回收算法。

5、JVM相关参数

(1)通用参数
  • -version:显示JVM版本信息。
  • -help:显示帮助信息。
  • -Dproperty=value:设置系统属性。
(2)内存相关参数
  • -Xms<size>:设置初始堆大小。
  • -Xmx<size>:设置最大堆大小。
  • -Xmn<size>:设置年轻代大小。
  • -XX:NewRatio=<value>:设置年轻代与老年代的比例。
  • -XX:MetaspaceSize=<size>:设置元空间初始大小。
  • -XX:MaxMetaspaceSize=<size>:设置元空间最大大小。
(3)垃圾回收(GC)相关参数
  • -XX:+UseSerialGC:使用串行垃圾收集器。
  • -XX:+UseParallelGC:使用并行垃圾收集器。
  • -XX:+UseConcMarkSweepGC:使用并发标记扫描垃圾收集器。
  • -XX:+UseG1GC:使用G1垃圾收集器。
  • -XX:SurvivorRatio=<value>:设置Eden区与Survivor区的比例。
  • -XX:MaxTenuringThreshold=<value>:对象晋升到老年代前在年轻代的最大存活次数。
(4)日志和其他诊断参数
  • -verbose:gc:输出详细的GC日志。
  • -XX:+PrintGCDetails:打印详细的GC信息。
  • -XX:+PrintHeapAtGC:在每次GC后打印堆信息。
  • -XX:+PrintPromotionFailure:打印晋升失败的信息。
  • -Xlog:gc*:使用新的日志记录机制记录GC信息。
(5)性能调优参数
  • -server:使用Server模式,优化长时间运行的应用程序。
  • -client:使用Client模式,适合短时间运行的应用程序。
  • -XX:+AggressiveOpts:启用激进的优化选项。
  • -XX:+UseFastAccessorMethods:使用更快的JNI访问方法。
  • -XX:+UseCompressedOops:使用压缩的对象指针(仅限64位)。
(6)线程相关参数
  • -XX:ThreadStackSize=<size>:设置线程栈大小。
  • -XX:ParallelGCThreads=<N>:设置并行GC线程数。

这些参数可以根据不同的应用需求进行调整,以达到最佳的性能和稳定性。请注意,不同版本的JVM可能会有不同的默认值和支持的参数,因此在使用时应参考当前JVM版本的官方文档。

6、方法区和元空间的联系

(1)【方法区】是一个概念,用于存储类的元数据信息,包括结构、类名等信息。而【元空间】和【永久代】是方法区的实现。在JDK8之前,HotSopt采用的是永久代,JDK8之后改成了元空间。

(2)元空间是位于直接内存中(即服务器的直接内存),可以根据需要进行配置。用空间不足也会包OOM,报的是OutOfMemoryError: Metaspace


http://www.kler.cn/news/306645.html

相关文章:

  • C语言中的信号量应用
  • 【ArcGIS Pro实操第七期】栅格数据合并、裁剪及统计:以全球不透水面积为例
  • Linux03
  • 使用 Nmap 进行 SSL/TLS 加密套件枚举
  • 什么是上拉,下拉?
  • STM32G070 CubeMX配置多通道/单通道ADC+DMA流程 LL库
  • Unity 粒子系统参数说明
  • cross-plateform 跨平台应用程序-09-phonegap/Apache Cordova 介绍
  • 0911(绘制事件,qt中的网络通信)
  • Introduction to LLMs in Python
  • 细说STM32单片机使用通用定时器生成固定占空比和可变占空比PWM波的方法
  • leetcode 230.二叉搜索树中第k小的元素
  • VMware Fusion虚拟机Mac版 安装Ubuntu操作系统教程
  • YOLOv8目标检测——迁移学习
  • 55页可编辑PPT | 集团制造企业数字化转型顶层设计方案
  • k8s中的认证授权
  • LeetCode双周赛139
  • 鸿蒙开发入门day19-使用NDK接口构建UI(一)
  • 中间件之RocketMQ
  • react js 使用 useEffect 钩子
  • C++函数在库中的地址
  • 【机器学习随笔】概率论与实际问题的对应
  • PHP技术深度探索:构建高效安全的Web应用实践
  • ChatGPT提示词-中文版(awesome-chatgpt-prompts中文版)
  • java重点学习-JVM组成
  • 多张GPU卡
  • 【C++】c++ 11
  • 【Git】初识Git
  • 检查Tomcat是否启动成功
  • Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C语言)