【JVM虚拟机】(1)---常用JVM配置参数

常用JVM配置参数

常用JVM配置参数主要有:Trace跟踪参数、堆的分配参数、栈的分配参数。

一、Trace跟踪参数

跟踪参数用于跟踪监控JVM,对于开发人员来讲用于JVM调优以及故障排查的。

1、打印GC的简要信息

-verbose:gc
-XX:+PrintGC

这两个配置参数效果是一样的,都是在发生GC时打印出简要的信息,例如执行代码

public static void main(String[] args) {
        byte[] bytes = null;
        for (int i = 0; i < 100; i++) {
            bytes = new byte[1 * 1024 * 1024];
        }
    }

这个程序连续创建了100个1M的数组对象,使用-XX:+PrintGC或-verbose:gc参数执行该程序,即可查看到GC情况:

我们可以看到程序执行了2次GC(minor GC),这两次GC都是新生代的GC。

33038K表示回收前对象占用空间。1760K表示回收后对象占用空间。125952K表示还有多少空间可用。0.0044838 secs表示这次垃圾回收花的时间。

2、打印GC的详细信息以及堆使用详细信息

--打印GC详细信息
-XX:+PrintGCDetails
--打印CG发生的时间戳
-XX:+PrintGCTimeStamps

使用-XX:+PrintGCDetails参数,查看控制台打印结果:

通过打印GC详细信息可以得出以下结论:

(1)Heap(堆)主要分为三大块:堆分为(PSYoungGen)新生代、(ParOldGen)老年代、(Metaspace)元空间。

注意这里没有永久区了,永久区在java8已经移除,原来放在永久区的常量、字符串静态变量都移到了元空间,并使用本地内存。

(2)(PSYoungGen)新生代又分为:伊甸区(eden)和幸存区(from和to)。

思考:上面total总的为38400K,它不是应该eden+from+to=total?这是因为新生代的垃圾回收算法是采用复制算法,简单的说就是在from和to之间来回复制(复制过程中再把不可达的对象回收掉),

所以必须保证其中一个区是空的,这样才能有预留空间存放复制过来的数据,所以新生代的总大小其实等于eden+from(或to)=33280K+5120K=38400k。

思考:不同对象一般放在哪个区呢?

(1)新生代主要存放的是哪些很快就会被GC回收掉的或者不是特别大的对象。

(2)老年代则是存放那些在程序中经历了好几次回收仍然还活着或者特别大的对象。

(3)元空间在这里都是放着一些用于存储类的信息、常量池、方法数据、方法代码等。这个区中的东西比老年代和新生代更不容易回收。

3、使用外部文件记录GC的日志

-Xloggc:gc.log

我在eclipse.ini配置

-XX:+PrintGC
-Xloggc:gc.log

运行eclipse会有一个gc.log记录日志文件

二、堆的分配参数

1、-Xmx –Xms:指定最大堆和最小堆

我的eclipse.ini中这两个的配置是:

-Xms256m
-Xmx1024m

然后我们在程序中运行如下代码:

 System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");          //系统的最大空间
 System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");    //系统的空闲空间
 System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");  //当前可用的总空间

运行效果:

2、-Xmn、-XX:NewRatio、-XX:SurvivorRatio

-Xmn
    设置新生代大小

-XX:NewRatio
     新生代(eden+2*s)和老年代(不包含元空间)的比值
    例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5

-XX:SurvivorRatio(幸存代)
     设置两个Survivor区和eden的比值
    例如:8,表示两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10

举例:

-Xmx20m -Xms20m -XX:NewRatio=1 -XX:SurvivorRatio=3

代表最大最小堆内存都是20M,新生代:老年代为1:1。两个Survivor区和eden的比值为2:3

3、-XX:PermSize  -XX:MaxPermSize

--设置元数据区的初始空间和最大空间

有关优化总结:

(1)官方推荐新生代占堆的3/8

(2)幸存代占新生代的1/10

三、栈大小分配

1、-Xss

通常只有几百K

决定了函数调用的深度

每个线程都有独立的栈空间

局部变量、参数 分配在栈上

参考

1、Java虚拟机详解----常用JVM配置参数

2、深入理解JVM(三)——配置参数

想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。少校【15】

原文地址:https://www.cnblogs.com/qdhxhz/p/9206518.html

时间: 2024-09-30 10:07:28

【JVM虚拟机】(1)---常用JVM配置参数的相关文章

JVM虚拟机-03、JVM内存分配机制与垃圾回收算法

JVM虚拟机-03.JVM内存分配机制与垃圾回收算法 1 JVM内存分配与回收 1.1 对象优先在Eden区分配 大多数情况下,对象在新生代中?Eden?区分配.当?Eden?区没有足够空间进行分配时,虚拟机将发起一次Minor?GC.我们来进行实际测试一下.在测试之前我们先来看看?Minor?GC和Full?GC?有什么不同呢? Minor?GC/Young?GC:指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快. Major?GC/Full?GC:一般会回收老年代,

keepalived原理及常用的配置参数

------本文大纲 简介 keepalived原理 keepalived配置文件注解 --------------------------------- 一.简介 Keepalived:它的诞生最初是为ipvs(一些服务,内核中的一些规则)提供高可用性的,最初最主要目的是能够自主调用ipvsadm来生成规则,并且能够自动实现将用户访问的地址转移到其他节点上进行实现的. Keepalived:核心包含两个ckeckers和VRRP协议. ckeckers 检查服务检查reserved的健康状况的

【JVM虚拟机】(9)-- JVM是如何处理异常的

[JVM虚拟机](9)-- JVM是如何处理异常的 上篇博客我们简单说过异常信息是存放在属性表集合中的Code属性表里,那么这篇博客就单独讲Code属性表中的exception_table. 在讲之前我们先思考两个问题? 1.为什么捕获异常会较大的性能消耗? 2.为什么finally中的代码会永远执行? 接下来会从JVM虚拟机的角度来解答这两个问题. 一.概念 1.JVM是如何捕获异常的? 1.编译而成的字节码中,每个方法都附带一个异常表. 2.异常表中每一个条目代表一个异常处理器 3.触发异常

深入理解JVM虚拟机10:JVM常用参数以及调优实践

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

深入理解JVM虚拟机9:JVM监控工具与诊断实践

转自https://juejin.im/post/59e6c1f26fb9a0451c397a8c jvm优化必知系列——监控工具 微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,

深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

常见虚拟机堆相关的配置参数

堆相关的配置参数 -Xmx 最大堆空间 -Xms 初始堆空间大小,如果初始堆空间耗尽,JVM会对堆空间扩容,其扩展上限为最大堆空间.通常-Xms与-Xmx设置为同样大小,避免扩容造成性能损耗. -Xmn 设置新生代大小,设置一个较大的新生代会减少老年代的大小,新生代的大小一般设置为整个堆空间的1/3 或者1/4. -XX:SurvivorRatio 设置新生代中eden空间和from/to空间的比例关系. -XX:SurvivorRatio=eden/from=eden/to 例如:-Xmx20

JVM虚拟机(三):参数配置

在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查会有一定的帮助,为此,虚拟机提供了一些跟踪系统状态的参数,使用给顶的参数执行java虚拟机,就可以在系统运行时打印相关日志,用于分析实际问题.我们进行迅疾参数配置,其实主要是围绕着堆.栈.方法区进行配置. 堆分配参数 -XX:+PrintGC使用这个参数,虚拟机启动后,只要遇到GC就会打印日志. -XX:+UserSerialGC 配置串行回收器 -XX:+PrintGCDetails可以查看详细信息,包括各个区的情况 -X

天地图常用WMTS配置参数

wmts常用参数 var matrixIds = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19','20'];var resolutions = [0.703125, 0.3515625,0.17578125,0.087890625, 0.0439453125, 0.02197265625,0.010986328125, 0.