随笔 - 166  文章 - 0 评论 - 8 阅读 - 22万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

如何查看一个正在运行中的java程序,它的某个jvm参数是否开启?具体值是多少?

jps

jinfo

jvm的参数类型:

1.标配参数:java -version  ,java -help , java -showversion

2.X参数(了解): java -Xint  (解释执行), java -Xcomp(第一次使用就编译成本地代码),-Xmixed (混合模式)

3.XX参数:

3.1 Boolean类型 ,公式:-XX:+或者-某个属性值,其中+表示开启,-表示关闭

例子:是否打印GC收集细节,是否使用串行垃圾回收器

public class HelloGC {
public static void main(String[ ]args) throws InterruptedException {
System.out.println("***********helloGC");
Thread.sleep(Integer.MAX_VALUE);
}
}

结果见下图:

 可以进行修改

 

 

 3.2 KV设值类型,默认元空间大小

 默认多少极限年龄可以升养老区


 

两个经典参数:-Xms 和-Xmx

-Xms 等价于:-XX:InitialHeapSize

-Xmx 等价于:-XX:MaxHeapSize

-Xss  设置单个线程栈的大小,一般默认为512k~1024k,等价于 -XX:ThreadStackSize

 

-Xms128m  -Xmx4096m  -Xss1024k  -XX:MetaspaceSize=512m  -XX:+PrintCommandLineFlags

-XX:+PrintGCDetails  -XX:+UseSerialGC

 

第一种,查看参数盘点家底

jps

jinfo  -flag  具体参数  java进程编号

jinfo  -flags  java进程编号

第二种,查看参数盘点家底

java -XX:+PrintFlagsInitial   这个是初始的

java -XX:+PrintFlagsFinal  这个是修改以后的      =表示没有改过    :=表示人为修改或者jvm修改过的   公式:java -XX:+PrintFlagsFinal  -version

java -XX:+PrintCommandLineFlags  也是可以查看初始参数


 public class MemDemo {

    public static void main(String[ ] args) {
long maxMemory = Runtime.getRuntime().maxMemory();
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("-Xmx 最大分配内存 "+(maxMemory/(double)1024/1024)+"MB");
System.out.println("-Xms 初始分配内存 "+(totalMemory/(double)1024/1024)+"MB");
}
}

运行结果见下图:

 

 


 OOM异常例子:

public class HelloGC {
public static void main(String[ ]args) throws InterruptedException {
System.out.println("***********helloGC");
     //创建50m大小空间,实际调整为10m
byte[] bytes= new byte[50*1024*1024];

}
}

 日志分析总结:

1.GC前后的对比。

2.新生代占堆内存三分之一,老年代占堆内存三分之二,老年代回收不了将抛oom异常。


 常用基础参数SurvivorRatio

-XX:SurvivorRatio  设置新生代中eden和S0/S1空间的比例,默认

-XX:SurvivorRatio=8, Eden:S0:S1=8:1:1


假如

-XX:SurvivorRatio=4, Eden:S0:S1=4:1:1

SurvivorRatio值就是设置eden区的比例占多少,S0/S1相同

public class HelloGC {
public static void main(String[ ]args) throws InterruptedException {
System.out.println("***********helloGC");
//byte[] bytes= new byte[50*1024*1024];
}
}

默认状态:8:1:1

加参数后:4:1:1


 常用基础参数NewRatio

-XX:NewRatio   

配置年轻代与老年代在堆结构的占比

-XX:NewRatio=2新生代占1,老年代2,年轻代占整个堆的1/3

假如

-XX:NewRatio=4新生代占1,老年代4,年轻代占整个堆的1/5

NewRatio值就是设置老年代的占比,剩下的1给新生代

用法跟上图配置一样。

posted on   从精通到陌生  阅读(11360)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示