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
决定了函数调用的深度
每个线程都有独立的栈空间
局部变量、参数 分配在栈上
参考
想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。少校【15】
JVM虚拟机(1)---常用JVM配置参数的更多相关文章
- 深入理解JVM虚拟机10:JVM常用参数以及调优实践
转自http://www.rowkey.me/blog/2016/11/02/java-profile/?hmsr=toutiao.io&utm_medium=toutiao.io&u ...
- 深入理解JVM虚拟机9:JVM监控工具与诊断实践
转自https://juejin.im/post/59e6c1f26fb9a0451c397a8c jvm优化必知系列——监控工具 微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站. ...
- 深入理解JVM虚拟机1:JVM内存的结构与永久代的消失
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...
- 深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...
- 深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
一.VisualVM是什么? VisualVM是一款免费的JAVA虚拟机图形化监控分析工具. 1. 拥有图形化的监控界面. 2. 提供本地.远程的JVM监控分析功能. 3. 是一款免费的 ...
- 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理
微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔 ...
- 【JVM虚拟机】(9)-- JVM是如何处理异常的
[JVM虚拟机](9)-- JVM是如何处理异常的 上篇博客我们简单说过异常信息是存放在属性表集合中的Code属性表里,那么这篇博客就单独讲Code属性表中的exception_table. 在讲之前 ...
- JVM虚拟机(三):参数配置
在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查会有一定的帮助,为此,虚拟机提供了一些跟踪系统状态的参数,使用给顶的参数执行java虚拟机,就可以在系统运行时打印相关日志,用于 ...
- java虚拟机(九)--常用jvm参数
1.-Xms20M: 表示设置JVM启动内存的最小值为20M,必须以M为单位 2.-Xmx20M: 表示设置JVM启动内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM ...
- 天地图常用WMTS配置参数
wmts常用参数 var matrixIds = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', ...
随机推荐
- net core 依懒注入 中间件
依懒注入 依懒 当一个类需要另一个类协作来完成工作的时候就产生了依赖.比如我们在AccountController这个控制器需要完成和用户相关的注册.登录 等事情.其中的登录我们由EF结合Idneti ...
- SSM项目目录结构
- 史上最全的select加锁分析(Mysql)
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? s ...
- python文件的路径问题补充上一篇内容
上次的路径问题还没解决就被勒索病毒的木马器给搞了两周多, 拖拖拖到现在又开始纠结路径问题...还是学习能力不足啊... 补充一下路径问题的知识, 毕竟jupyter notebook跟IDE测试的时候 ...
- C++入门笔记(一)零碎基础知识
零碎基础知识 一.创建和运行程序 1.使用文本编辑器编写程序,保存为文件,该文件就叫源代码. 2.编译源代码:运行一个程序,将源代码翻译为主机使用的内部语言----机器语言.包含了 编译后程序的文件就 ...
- Ubuntu安装MySQL和Python库MySQLdb步骤
一.安装MySQL服务器和客户端 执行以下命令: sudo apt-get install mysql-server-5.6 mysql-client-5.6 sudo apt-get install ...
- C#一句话判断两个List<T>是否相等
List1.All(List2.Contains) && List1.Count == List2.Count
- Linux--Linux下安装JDk
好不容易免费使用了服务器,还不会安装JDK,记录一下怎么弄. 方法一:远程服务器可以联网下载(高级货) 命令: wget -c -P /root/jdk --no-check-certificate ...
- Java 将键盘中的输入保存到数组
import java.util.Scanner; import java.util.InputMismatchException; public class saveInputToArr { pub ...
- 用 PHP文件引入css样式
html: <link rel="stylesheet" type="text/css" href="http://www.mysite.com ...