1JVM内存管理的机制
1.1堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,
所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

1.1.1堆内存分配
JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try…catch捕捉。
1.1.2非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。(还有一说:MaxPermSize缺省值和-server -client选项相关,
-server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m。
上面错误信息中的PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。
为什么会内存溢出:
(1)这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。
(2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。
这种错误常见在web服务器对JSP进行pre compile的时候。

1.2JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,
这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?
通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:

  1. 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
  2. -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存,这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

2JVM参数类型
2.1JVM参数类型
1、标准参数(-)
所有的JVM实现都必须实现这些参数的功能,而且向后兼容。例如:-verbose:class(输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断);-verbose:gc(输出每次GC的相关情况);-verbose:jni(输出native方法调用的相关情况,一般用于诊断jni调用错误信息)。
2、非标准参数(-X)
默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容。例如:-Xms512m;-Xmx512m;-Xmn200m;-Xss128k;-Xloggc:file(与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。若与verbose命令同时出现在命令行中,则以-Xloggc为准)。
3、非Stable参数(-XX)
此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用。例如:-XX:PermSize=64m;-XX:MaxPermSize=512m。

2.2标准参数
1、 -help
2、-server -client
3、 -version -showversion
4、-cp -classpath

2.3X参数
非标准化参数
-Xint : 解释执行
-Xcomp:第一次使用就编译成本地代码
-Xmixed: 混合模式,JVM自己来决定是否编译成本地代码

2.4XX参数
非标准化参数
相对不稳定
主要用于JVM调优和Debug
XX参数分类:
1、Boolean类型
格式: -XX:[±] 表示启用或者禁用name属性
比如: -XX:+UseConcMarkSweepGC
    -XX:UseG1GC

2、非Boolean类型
格式: -XX:= 表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500
   XX:GCTimeRatio=19

3、 -Xmx -Xms
不是X参数,而是XX参数
-Xms等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize

3JVM参数查看
3.1查看JVM运行时参数
-XX:+PrintFlagsInitial
-XX:+PrintFlagsFinal
-XX:+UnlockExperimentalVMOptions //解锁实验参数
-XX:+UnlockDiagnosticVMOptions //解锁诊断参数
-XX:+PrintCommandLineFlags //打印命令行参数

-XX:+UseSerialGC,虚拟机运行在Client模式下的默认值,Serial+Serial Old。
-XX:+UseParallelGC,虚拟机运行在Server模式下的默认值,Parallel Scavenge+Serial Old(PS Mark Sweep)。
-XX:+UseParNewGC,ParNew+Serial Old,在JDK1.8被废弃,在JDK1.7还可以使用。
-XX:+UseParallelOldGC,Parallel Scavenge+Parallel Old。
-XX:+UseConcMarkSweepGC,ParNew+CMS+Serial Old。
-XX:+UseG1GC,G1+G1,只支持JDK1.7 14update以上

java -XX:+PrintCommandLineFlags -version //查看jvm默认的垃圾回收器

3.2参数使用
java -XX:+PrintFlagsInitial -version > PrintFlagsInitial.txt //这个命令的值很多,保存到文件中
java -XX:+PrintFlagsFinal -version > PrintFlagsFinal.txt

3.3jps 查看java进程
jps //查看java进程
jps -l //显示完整的类名

3.4查看正在运行的JVM参数

jinfo -flags pid //查看设置过值的参数
jinfo -flag InitialHeapSize pid //查看初始堆内存
jinfo -flag MaxHeapSize pid //查看最大堆内存
jinfo -flag PermSize pid //查看初始分配的非堆内存
jinfo -flag MaxPermSize pid //查看最大允许分配的非堆内存
jinfo -flag NewSize pid //查看年轻代初始内存
jinfo -flag MaxNewSize pid //查看年轻代最大内存
jinfo -flag NewRatio pid //查看年轻代与年老代的比值
jinfo -flag SurvivorRatio pid //查看年轻代中Eden区与Survivor区的比值
jinfo -flag MaxTenuringThreshold pid //查看对象如果在Survivor区移动了N次还没有被垃圾回收就进入年老代

jinfo -flag UseSerialGC pid //查看串行收集器
jinfo -flag UseParallelGC pid //查看并行收集器
jinfo -flag UseParNewGC pid //查看并行收集器
jinfo -flag UseParallelOldGC pid //查看并行收集器
jinfo -flag UseConcMarkSweepGC pid //查看CMS回收器
jinfo -flag UseG1GC pid //查看G1回收器
jinfo -flag PrintGCDetails pid //查看是否打印GC日志

查看JVM内存配置

jmap -heap pid > 1.txt//参数较多,保存到文件

4JVM常用工具
4.1jps
jps //查看java进程
jps -l //显示完整的类名

4.2jinfo
jinfo -flag InitialHeapSize pid //查看初始堆内存
jinfo -flag MaxHeapSize pid //查看最大堆内存
jinfo -flag PermSize pid //查看初始分配的非堆内存
jinfo -flag MaxPermSize pid //查看最大允许分配的非堆内存
jinfo -flags pid //查看设置过值的参数
jinfo -flag UseConcMarkSweepGC pid //查看垃圾回收器
jinfo -flag UseG1GC pid //查看垃圾回收器
jinfo -flag UseParallelGC pid //查看垃圾回收器

4.3 jmap

jmap -heap pid > 1.txt

5Tomcat调优
5.1Linux下修改TomcatJVM内存大小
要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false前。
# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS=“-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m”
cygwin=false

5.2windows下修改Tomcat JVM内存大小
5.2.1 解压版本的Tomcat , 要通过startup.bat启动tomcat才能加载配置

要添加在tomcat 的bin 下catalina.bat 里

rem Guess CATALINA_HOME if not defined
set CURRENT_DIR=%cd%后面添加

set JAVA_OPTS=-Xms1024m -Xmx1024m -Xmn=256m -XX:PermSize=128M -XX:MaxPermSize=128m -Djava.awt.headless=true-XX:+UseSerialGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:D:logjvmgc.log

5.2.2 安装版的Tomcat ,没有catalina.bat

安装版的Tomcat下没有catalina.bat
如果tomcat 6 注册成了windows服务,或者windows2003下用tomcat的安装版,
在/bin/tomcat6w.exe里修改就可以了 。

JVM参数查看与设置相关推荐

  1. JVM命令查看与设置参数

    文章目录 Boolean类型 KV设置类型 jinfo 总结 常用参数 JVM参数盘点 Boolean类型 公式 -XX:+ 或者 - 某个属性值 +表示开启 -表示关闭 测试:查看是否打印GC收集细 ...

  2. JVM:如何查看并设置jvm参数+jinfo+查看详细的jvm参数java-XX

    JVM:如何查看jvm设置的参数 查看jvm参数 我们什么都不要管,先来看一下,眼见为实 jps:查看当前java进程id,java本身就是一个进程 [root@hecs-82454 ~]# jps ...

  3. JVM参数调优-设置堆、新生代、老年代、持久代大小

    一.根据程序的运行状况查看其活跃的数据量 ①.活跃的数据: 1.应用程序运行于稳定状态时,老年代占用的java堆大小 2.应用程序运行于稳定状态时,永久代占用的java堆大小 其实就是FullGc后这 ...

  4. 查看当前jdk所支持的jvm参数

    查看当前jdk所支持的jvm参数 查看JVM全部能够设置的参数及它们的默认值(这个参数则能够显示全部可设置的参数及它们的值.不过这个参数自己只从JDK 6 update 21开始才能够用,以前的JDK ...

  5. HotSpot VM垃圾收集器——Serial Parallel CMS G1垃圾收集器的JVM参数、使用说明、GC分析

    目录 HotspotVM的垃圾收集器简介 1. Serial Collector 2. Parallel Collector(throughput collector) 3. Concurrent M ...

  6. JDK8 JVM参数与实际环境中的优化配置实践

    如何配置我们的JVM呢,首先我们需要知道JVM的参数有哪些,然后根据这些参数的意义去分析自己的程序的JVM需要的配置.可以事先做一些尝试,再逐步调优,这个调优也是一个过程,没有足够的经验而做到一步到位 ...

  7. JVM参数类型大揭秘

    文章目录 JVM参数类型大揭秘 JVM的参数类型 标准参数 X参数 XX参数 -Xmx -Xms 运行时JVM参数查看 参数: jps jinfo jstat查看虚拟机统计信息 类装载 垃圾收集 JI ...

  8. JVM学习之路04--(常用JVM参数,内存分析)

    目录 1.基于JDK命令行工具的监控 2.运行时JVM参数查看 3. jstat查看JVM统计信息 4. jamp+MAT(导出内存映像文件,MAT分析内存溢出) 1.基于JDK命令行工具的监控 1. ...

  9. JVM-常见JVM参数、如何查看JVM参数、如何动态设置JVM参数

    1 JVM参数 1.1 标准参数 // 查看java版本 -version // help命令就不用了说了吧 -help // -server // 指定类运行所依赖其他类的路径,通常是类库和jar包 ...

最新文章

  1. 机器学习(实战)泰坦尼克号(游客存活率预估)
  2. MaxCompute助力ofo实现精细化运营:日订单超3200万、整体运行效率提升76%
  3. AFNetworking和ASIHTTPRequest的比较
  4. 。net面试题(2)
  5. win2000/2003 Discuz生存环境搭建及基础优化 攻略
  6. 微信公布6月朋友圈十大谣言 包括不打疫苗不让上飞机高铁等
  7. 使用Python内置集合对象和内置函数filter()过滤无效书评
  8. DotNetTextBox V3.0 所见即所得编辑器控件Ver3.2.5 Free(免费版)
  9. Cozmo机器人使用中文Scratch3编程案例(codelab)
  10. 微机综合保护装置怎么选择?在高压柜中起什么作用?
  11. iframe如何发送请求_如何实现高性能的在线 PDF 预览
  12. R750 H750 H755 阵列卡磁盘次序
  13. 经典怀旧:VirtualBox安装Win95 - 详细图片展示
  14. 国内搜索引擎技术现状
  15. 一文了解BIOS相关名词
  16. google使用方法及技巧
  17. HBBuilderProjest逆向分析与安全性扯淡
  18. APC型光纤活动连接器有何特点?适合使用在什么场景?
  19. UE4内存检测工具使用
  20. 使用注册表编辑win10鼠标右键菜单,详细解释(右键文件夹、文件以及右键空白区域下三种情况)

热门文章

  1. 未来“攻击”你的可能只是一个智能门铃
  2. 计算机谱我的英雄学院,我的英雄学院游戏出招表 我的英雄学院全角色出招表一览...
  3. Spring加载存放位置不同的beans.xml
  4. Vue 之 插槽的使用,一次性给你说清楚
  5. ui设计视频教程学习图标设计入门篇
  6. 单例模式——懒汉与饿汉
  7. 华为p60系列超级快充 Turbo技术,轻松搞定充电困扰!
  8. vue如何判断数组是否为空
  9. 工商银行APP流水申请
  10. Android Notification和权限机制探讨