jvm内存模型 知乎(jvm内存模型及调优)

jvm内存模型 知乎(jvm内存模型及调优)目录 1 项目上线遇到的问题 2 jvm 的运行参数 2 1 标准参数 2 1 1 D 名称 值 2 1 2 server 和 client 2 2 X 参数 非标准参数 2 2 1 Xint 2 2 2 Xcomp 2 2 3 Xmixed 2 2 4 Xms 设置堆内存初始化大小 2 2 5 Xmx 设置堆内存最大大小 2 3 XX 参数 使用效率高 2 3 1 boolean 类型 2 3 2 非 Boolean 类型 2 4 值 名称





目录

  • 1 项目上线遇到的问题
  • 2 jvm的运行参数
  • 2.1 标准参数
  • 2.1.1 -D<名称>=<值>
  • 2.1.2 -server 和 -client
  • 2.2 -X 参数(非标准参数)
  • 2.2.1 -Xint
  • 2.2.2 -Xcomp
  • 2.2.3 -Xmixed
  • 2.2.4 -Xms 设置堆内存初始化大小
  • 2.2.5 -Xmx 设置堆内存最大大小
  • 2.3 -XX 参数(使用效率高)
  • 2.3.1 boolean类型
  • 2.3.2 非Boolean类型
  • 2.4 查看jvm的运行参数
  • 2.5 jsp命令
  • 2.6 jinfo 命令
  • 3 jvm 的内存模型
  • 3.1 jatat 命令
  • 4 内存溢出的定位与分析
  • 4.1 分析
  • 4.2 代码演示内存溢出
  • 5 项目卡住不动的情况
  • 6 jvisualvm 的使用(包含之前所有命令的功能)


1 运行的项目卡住了,项目里面的日志没有输出,程序没有反应
2 服务器的cpu 负载突然升高;
3 只有在上线的情况,才会有多线程的情况,本地即使压测,也没有什么用处,所以多线程,一定要上线的情况进行压测;

jvm有3种参数类型

这种参数是,不管java版本如何变,这些参数也不可能有什么大变化;
我们可以使用java -help 查看标准参数

java面试 JVM调优 jvm调优实战简书_java


我们找到这个

2.1.1 -D<名称>=<值>

这个参数就是我们的项目里面设置了一个变量属性,之后再启动项目的时候使用这个进行给变量属性赋值;

举例子:
我们自己写一个代码,在系统属性里面获取一个变量并且输出,但是这个变量名字是我们自己编的,所以在启动项目的时候,我们需要给他赋值

java面试 JVM调优 jvm调优实战简书_开发语言_02

在哪里给这个name变量设置值?我们在里面可以设置

java面试 JVM调优 jvm调优实战简书_开发语言_03


以上的这个里面就是专门设置java的的一些参数的,我们现在的例子可以这样设置

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_04


然后执行这个代码,看控制台输出

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_05

通过以上的 例子,可以看到-D 这个可以设置系统变量;相当于使用-D 可以设置系统属性参数;

java面试 JVM调优 jvm调优实战简书_堆内存_06

2.1.2 -server 和 -client

通过这两个参数设置运行模式
-server
根据这个设置的是,初始化的时候,堆空间的内存大一些,启动项目的时候慢,但是之后因为内存大,所以运行快,默认使用的是并行垃圾回收器

-client
初始化堆空间小,启动快,但是之后因为内存小,所以运行速度慢,使用的是串行垃圾回收器

java面试 JVM调优 jvm调优实战简书_intellij-idea_07


java面试 JVM调优 jvm调优实战简书_intellij-idea_08


java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_09


java面试 JVM调优 jvm调优实战简书_堆内存_10


java面试 JVM调优 jvm调优实战简书_开发语言_11

这种参数是,java版本变,这些参数有可能变化;

我们可以使用java -X 查看标准参数

java面试 JVM调优 jvm调优实战简书_intellij-idea_12


我们咋查看启动我们的项目是什么模式

java面试 JVM调优 jvm调优实战简书_堆内存_13


以上可以看到,我们的项目启动,如果不设置这个,就是默认混合模式

2.2.1 -Xint

我们在启动项目的时候,如果设置了这个,那么

java面试 JVM调优 jvm调优实战简书_java_14


就是在编译java项目的时候,一边编译一边执行,就是编译多少,运行多少启动项目,控制台输出

java面试 JVM调优 jvm调优实战简书_intellij-idea_15

2.2.2 -Xcomp

java面试 JVM调优 jvm调优实战简书_java_16


我们启动项目的时候设置一下

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_17

控制台输出就是

java面试 JVM调优 jvm调优实战简书_开发语言_18

2.2.3 -Xmixed

java面试 JVM调优 jvm调优实战简书_堆内存_19


混合模式的输出标志是

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_20

2.2.4 -Xms 设置堆内存初始化大小

java面试 JVM调优 jvm调优实战简书_intellij-idea_21


设置多少合适?

2.2.5 -Xmx 设置堆内存最大大小

java面试 JVM调优 jvm调优实战简书_开发语言_22


设置多少合适?

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_23


java面试 JVM调优 jvm调优实战简书_java_24

2.3.1 boolean类型

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_25

2.3.2 非Boolean类型

就是把加号减号去掉,后面是键值对的形式

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_26

我们启动一个项目,需要在控制台输出所有的jvm的运行参数

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_27

java面试 JVM调优 jvm调优实战简书_堆内存_28


控制台输出的是

java面试 JVM调优 jvm调优实战简书_java_29


以上是所有的jvm参数都输出了,现在我们想要查看正在运行的;就是现在有很多的java项目启动,以上是将所有的都展示了,我现在想要查看某一个项目里面某一个jvm参数的值是什么,需要借助jsp命令和jinfo命令

jps是jdk提供的一个查看当前java进程的小工具;

java面试 JVM调优 jvm调优实战简书_堆内存_30

就是使用这个命令可以查看,当前系统运行的java程序,并且展示进程号

java面试 JVM调优 jvm调优实战简书_intellij-idea_31


我们先用 jps 命令查到 PID ,然后可以通过 jinfo 来查看对应进程的参数信息:

java面试 JVM调优 jvm调优实战简书_堆内存_32


查看 JVM 参数:

java面试 JVM调优 jvm调优实战简书_开发语言_33


查看系统参数:

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_34

jvm的调优,就是在内存里面进行调优;

java面试 JVM调优 jvm调优实战简书_java_35


java面试 JVM调优 jvm调优实战简书_java_36


我们项目启动之后,需要查看堆里面的情况。可以使用命令jstat

Jstat是JDK自带的一个轻量级小工具。
它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。

jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。参考格式如下:

jstat -options

1、jstat –class : 显示加载class的数量,及所占空间等信息。

java面试 JVM调优 jvm调优实战简书_intellij-idea_37

2、jstat -piler 显示VM实时编译的数量等信息。

java面试 JVM调优 jvm调优实战简书_堆内存_38


jstat -gc : 可以显示gc的信息,查看gc的次数,及时间。

系统爆出oom,分析的时候,业务是正常的,这个时候就需要加大内存;
如果你的业务不正确,就需要修改代码;

以上是一直往一个数组里面存数据,我们启动这个文件,可以手动分配堆内存的大小

java面试 JVM调优 jvm调优实战简书_java面试 JVM调优_39


java面试 JVM调优 jvm调优实战简书_堆内存_40

java面试 JVM调优 jvm调优实战简书_java_41


hprof文件里面包含了内存堆详细的使用信息。

项目卡住不动,有可能出现死锁,所以我们可以使用

java面试 JVM调优 jvm调优实战简书_堆内存_42


java面试 JVM调优 jvm调优实战简书_intellij-idea_43

java面试 JVM调优 jvm调优实战简书_堆内存_44

java面试 JVM调优 jvm调优实战简书_intellij-idea_45


java面试 JVM调优 jvm调优实战简书_堆内存_46


java面试 JVM调优 jvm调优实战简书_堆内存_47


java面试 JVM调优 jvm调优实战简书_开发语言_48


有各个程序的进程pid,比如我们看到 的软件

还有一个远程,就是服务器上面有一个软件,比如Tomcat软件,我们想要监控这个Tomcat的jvm的使用情况,那么就可以使用他远程连接,前提是在Tomcat的配置文件里面,需要加一个配置

java面试 JVM调优 jvm调优实战简书_开发语言_49


编程小号
上一篇 2025-03-05 19:17
下一篇 2025-02-08 16:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/68919.html