一、设置JVM内存设置

1. 设置JVM内存的参数有四个:

-Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

-Xms   Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-Xmn   Java Heap Young区大小,不熟悉最好保留默认值;

-Xss   每个线程的Stack大小,不熟悉最好保留默认值;

2. 如何设置JVM内存分配:

(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):

java -Xmx128m -Xms64m -Xmn32m -Xss16m Test

(2)当在集成开发环境下(如eclipse)启动并使用JVM时:

a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配):

  1. -vmargs
  2. -Xms40m
  3. -Xmx256m

-vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。

此处设置的参数值可以通过以下配置在开发工具的状态栏显示:

在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true

修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容:

  1. -debug
  2. options
  3. -vm
  4. javaw.exe

重新启动eclipse,就可以看到下方状态条多了JVM信息。

b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)

编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效)

选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

注:如果在同一开发环境中同时进行了b和c设置,则b设置生效,c设置无效,如:

开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为:

-Xmx256m -Xms64m

(3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效):

a. 设置环境变量:

变量名:CATALINA_OPTS

变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m

b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,将其中的�TALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m

二、查看设置JVM内存信息

Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx

Runtime.getRuntime().freeMemory(); //当前JVM空闲内存

Runtime.getRuntime().totalMemory(); //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和

关于maxMemory(),freeMemory()和totalMemory():

maxMemory()为JVM的最大可用内存,可通过-Xmx设置,默认值为物理内存的1/4,设值不能高于计算机物理内存;

totalMemory()为当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和,会随着JVM使用内存的增加而增加;

freeMemory()为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,而 JVM实际可用内存并不等于freeMemory(),而应该等于maxMemory()-totalMemory()+freeMemory()。及其 设置JVM内存分配。

官方文档见:

http://docs.sun.com/source/819-0084/pt_tuningjava.html

java启动参数共分为三类;
其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;

标准参数中比较有用的:

verbose 
-verbose:class 
 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
-verbose:gc 
 输出每次GC的相关情况。
-verbose:jni 
 输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

非标准参数又称为扩展参数

一般用到最多的是

-Xms512m  设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmx512m ,设置JVM最大可用内存为512M。

-Xmn200m:设置年轻代大小为200M。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss128k:

设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

-Xloggc:file
 与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。
 若与verbose命令同时出现在命令行中,则以-Xloggc为准。
-Xprof

跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。

用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了;但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX:PermSize、-XX:MaxPermSize等等;

首先来介绍行为参数:

参数及其默认值 描述
-XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit 最大化文件描述符的数量限制
-XX:+ScavengeBeforeFullGC 新生代GC优先于Full GC执行
-XX:+UseGCOverheadLimit 在抛出OOM之前限制jvm耗费在GC上的时间比例
-XX:-UseConcMarkSweepGC 对老生代采用并发标记交换算法进行GC
-XX:-UseParallelGC 启用并行GC
-XX:-UseParallelOldGC 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
-XX:-UseSerialGC 启用串行GC
-XX:+UseThreadPriorities 启用本地线程优先级

上面表格中黑体的三个参数代表着jvm中GC执行的三种方式,即串行、并行、并发;
串行(SerialGC)是jvm的默认GC方式,一般适用于小型应用和单处理器,算法比较简单,GC效率也较高,但可能会给应用带来停顿;
并行(ParallelGC)是指GC运行时,对应用程序运行没有影响,GC和app两者的线程在并发执行,这样可以最大限度不影响app的运行;
并发(ConcMarkSweepGC)是指多个线程并发执行GC,一般适用于多处理器系统中,可以提高GC的效率,但算法复杂,系统消耗较大;

性能调优参数列表:

参数及其默认值 描述
-XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size 新生成对象能占用内存的最大值
-XX:MaxPermSize=64m 老生代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
-XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
-XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
-XX:ReservedCodeCacheSize=32m 保留代码占用的内存容量
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
-XX:+UseLargePages 使用大页面内存

我们在日常性能调优中基本上都会用到以上黑体的这几个属性;

调试参数列表:

参数及其默认值 描述
-XX:-CITime 打印消耗在JIT编译的时间
-XX:ErrorFile=./hs_err_pid<pid>.log 保存错误日志或者数据到文件中
-XX:-ExtendedDTraceProbes 开启solaris特有的dtrace探针
-XX:HeapDumpPath=./java_pid<pid>.hprof 指定导出堆信息时的路径或文件名
-XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
-XX: 出现致命ERROR之后运行自定义命令
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 当首次遭遇OOM时执行自定义命令
-XX:-PrintClassHistogram 遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
-XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
-XX:-PrintCommandLineFlags 打印在命令行中出现过的标记
-XX:-PrintCompilation 当一个方法被编译时打印相关信息
-XX:-PrintGC 每次GC时打印相关信息
-XX:-PrintGC Details 每次GC时打印详细信息
-XX:-PrintGCTimeStamps 打印每次GC的时间戳
-XX:-TraceClassLoading 跟踪类的加载信息
-XX:-TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
-XX:-TraceClassResolution 跟踪常量池
-XX:-TraceClassUnloading 跟踪类的卸载信息
-XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息
出处:http://www.cnblogs.com/jack204/archive/2012/07/02/2572932.html

java vm 参数及设置(转载)相关推荐

  1. java gc时自动收dump_Full GC分析:设置Java VM参数实现在Full GC前后自动生成Dump

    本文讲解了如何设置JavaVM参数实现在Full GC前后自动生成Dump.共有三个VM参数需要设置: HeapDumpBeforeFullGC 实现在Full GC前dump. HeapDumpBe ...

  2. eclipse中对于Java虚拟机参数的设置与思考

    1 设置方法 通过直接对编辑jdk进行设置 也可以在在Debug Configration中对特定工程进行设置,如下图: 2 常用设置及其含义 常用设置:1)  -Xmx3550m -Xms3550m ...

  3. java VM argument_java vm args

    这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的.第一次出现这样的的问题以后,引发了其他的问题.在网上一查可能是JAVA的堆栈 ...

  4. java xmx full gc_设置在full gc 前后dump jvm

    本文讲解了如何设置Java VM参数实现在Full GC前后自动生成Dump.共有三个VM参数需要设置: HeapDumpBeforeFullGC 实现在Full GC前dump. HeapDumpB ...

  5. ckplayer 播放器参数详细设置

    ckplayer 播放器参数详细设置 转载 2015年09月02日 14:32:34 4605 <div id="flashcontent"></div>& ...

  6. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  7. 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析

    来自:好好学java 话不多说,今天就分析一下一些常用的Java虚拟机的参数设置,以及如何更好的使用! 1 JVM参数简介 首先想说的是其实这些参数我们并不是陌生的,在平时的开发和使用中经常都会遇到, ...

  8. 深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中- 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别J ...

  9. Java虚拟机参数设置(转)

    今天在加载一幅图片时,eclipse报出如下错误: "Exception in thread "main" java.lang.OutOfMemoryError: Jav ...

  10. linux java main 参数设置_Java虚拟机参数设置

    "MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remai ...

最新文章

  1. [腾讯云]简单在腾讯云 CenTOS7.0 安装Nginx,Mysql(MariaDB),Memcache,解析PHP!
  2. 干货 | 神经网络与深度学习精选文章汇总
  3. java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器
  4. 点击了SAP CRM HANA report超链接,背后都发生了什么
  5. 卷积神经网络结构_卷积神经网络
  6. Myeclipse 安装Aptana3.2 插件
  7. 【LeetCode笔记】225. 用队列实现栈(Java、队列、栈)
  8. Redis(二)原理以及主从复制的实现
  9. 演示和解析Flex布局中的各种属性
  10. 经典排序算法(十二)--地精排序Gnome Sort
  11. spark性能调优05-troubleshooting处理
  12. mysql中各种连接的区别
  13. linux 3.16内核下载,linux块设备驱动程序示例(适用于高版本内核3.16.0 - 3.19.0等,亲测可用)...
  14. steam饥荒存档备份_如何手动备份您的Steam游戏文件
  15. Viruses!!!!!
  16. 基于pycharm的opencv (python)-----信用卡实战
  17. c语言中汉字编码,【C语言学习】C语言汉字编码。。。C语言中汉字的输入
  18. css中横线中间显示文字
  19. 你会微信小程序自定义底部导航栏吗?
  20. Java网络编程以及简单的聊天程序

热门文章

  1. QT Creator 创建qrc文件和使用资源文件
  2. 《信条》中国内地IMAX首周末票房表现强劲;洲际集团将在川滇环线新开四家酒店 | 美通企业日报...
  3. 关于VB中Print函数在数组中换行的理解
  4. 山东大学软件学院概率论与数理统计(考试)——期末考试回忆版
  5. 离散数学及其应用(第六版) 习题
  6. webshell及木马详解
  7. Terms of Service - Screen Capture
  8. 数字电路猴博士期末复习笔记
  9. CMakeLists.txt 语法介绍与实例演练
  10. 千锋2015.04月最新C语言基础视频教程