欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 学习笔记JVM篇(一)

学习笔记JVM篇(一)

2024/10/25 8:19:10 来源:https://blog.csdn.net/weixin_37624903/article/details/142278292  浏览:    关键词:学习笔记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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com