2016-04-18 20:40:59

三、JVM内存参数调整及监控

3.1  JVM之内存调整

JVM运行时数据区的内存大小可以通过参数来设置,通常能设置的两块区域为堆空间和持久代(方法区),设置方法是以参数的形式来指定, Sun 的HotSpot需要在jvm启动前设置这些参数,启动JVM后不能动态改变其大小。

JVM参数说明:

-Xms300m: 堆空间初始大小

-Xmx1g : 堆空间最大值(生产环境一般该值与Xms值设为一致,这样可以避免每次垃圾回收完成后对JVM堆大小进行重新调整)

-Xmn512M:  堆空间年轻代大小

-XX:NewRatio=4:  JVM堆的年轻代和老年代的大小比例为1:4

-Xss128K: 每个线程的堆栈大小为128K

-XX:SurvivorRatio=6:  新生代Surivor区(新生代有2个Surivor区)和Eden区的比例为2:6

-XX:PermSize=150M :  持久代初始大小

-XX:MaxPermSize=150M:  持久代最大值

-XX:MaxTenuringThreshold=1:新 生代的对象经过几次垃圾回收后(如果还存活),进入老年代。如果该参数设置为0,这表示新生代的对象在垃圾回收后,不进入survivor区,直接进入老年代

-XX:+HeapDumpOnOutOfMemoryError: 该参数表示当JVM发生内存溢出时,自动在程序目录下生成DUMP文件,通过该文件可以分析出什么原因导致内存溢出的

不同的JAVA程序设置参数的地方不一样,但参数名称是一样的。例:

1、启动一般JAVA程序可以使用以下方式设置启动时的jvm参数

JAVA -Xms2g -Xmx2g -Xmn512M -Xss128K -XX:PermSize=128M -XX:MaxPermSize=128M

-XX:NewRatio=4 -XX:SurivorRatio=4 -XX:MaxTenuringThreshold=1

2、 设置eclipse的jvm参数一般是在eclipse安装目录下的eclipse.ini文件中;

3、 设置tomcat5的jvm参数是在tomcat的bin目录下的catalina.bat文件中;

注: JVM堆空间的最大能分配多少与操作系统及硬件配置有关, 32位的操作系统一般为2g以下, 64位的操作系统基本可以说是没限制。

当前操作系统最大能给jvm分配多少内存可以通过在命令行窗口使用“ java -Xmx1200m” 测试出来。

3.2  JVM之监控工具--Jconsole

了解了如何设置jvm内存后,那又如何对jvm进行监控呢,以确保设置的参数正确呢,我们可以借助sun Jdk自带的Jconsole监控工具监控jvm的堆空间大小及使用情况。具体步骤如下:

第一步、配置jvm监控参数

该参数需在jvm启动前配置,其配置方法及位置同设置jvm堆大小方法一样.

具体参数及说明如下:

-DJAVA.rmi.server.hostname=127.0.0.1:指定当前主机的IP

-Dcom.sun.management.jmxremote.port=9880:指定使用那个端口作为监控的端口

-Dcom.sun.management.jmxremote.ssl=false :

-Dcom.sun.management.jmxremote.authenticate=false:不需要使用口令

第二步、运行JVM监控工具Jconsole

在命令行窗口输入“ jconsole”并回车即可(前提是配置了JAVA环境变量,如果未配置可以进入到jdk的bin目录下手动执行“ jconsole.exe”程序)

第三步、选择需要监控的jvm

1、监控本地JVM

直接选中本地的JAVA进程,点连接即可

2、监控远程JVM

先选择远程监控,并在文本框中填写远程jvm的ip地址及监控端口号,如果远程jvm开启口令认证的话还需要输入用户名和口令

3.3 JVM之监控工具--Jprofile

Jprofile是一个功能强大且最好的JAVA剖析工具,专用于J2SE和JAVAEE应用程序监控分析。

Jprofile支持监控多种不同厂商的JVM,并可与IDE等流行的应用服务器整合进行JVM监控、分析内存泄漏问题,找出系统的性能瓶颈。

Jprofile既能监控本地的JAVA应用程序也能监控远程的JAVA程序。

Jprofile需要商业授权才能使用,一般会提供试用版的。

四、JVM实战

4.1  JVM垃圾回收

(1)垃圾回收概念

什么是垃圾回收:

JVM中自动检测并移除不再使用的数据对象的这种机制称为:垃圾回收(Garbage Collection ),简称GC。

GC的基本原理:

JVM通过使用垃圾收集器及使用相应的垃圾回收算法将内存中不再被使用的对象进行回收。

为什么要垃圾回收:

由于不同JAVA对象存活时间是不一定的,因此,在程序运行一段时间以后,如果不进行垃圾回收,整个程序会因内存耗尽导致整个程序崩溃。垃圾回收还会整理那些零散的内存碎片,碎片过多最直接的问题就是会导致无法分配大块的内存空间以及降低程序的运行效率。

那些区域会被GC:

VM栈、本地方法栈以及程序计数器会随方法或线程的结束而自然被回收,所以这些区域不需要考虑回收问题。

堆空间和持久代(方法区)是GC回收的重点区域,不同区域对象的收集叫法不一样

( 1)对年轻代的对象的收集称为minor GC,

( 2)对老年代的对象的收集称为Full GC。程序中主动调用System.gc()强制执行的GC为Full GC。

(2)垃圾收集算法

标记清除算法:

复制算法:

标记整理算法:

分代收集算法:

(3)垃圾收集器

如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现,不同的垃圾收集器有不同的内存回收算法(引用计数、标记-清除算法、复制算法、标记-整理算法等)。 jvm规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的jvm所提供的垃圾收集器都可能 会有很大的差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。

理解JAVA虚拟机(下)的更多相关文章

  1. 深入理解Java虚拟机--下

    深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...

  2. 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

    1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾 ...

  3. 深入理解java虚拟机JVM(下)

    深入理解java虚拟机JVM(下) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...

  4. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  5. 《深入理解 java虚拟机》学习笔记

    java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.

  6. (1) 深入理解Java虚拟机到底是什么?

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机   作为一个Java程序员,我们每天都在写Java ...

  7. 深入理解java虚拟机(7)---线程安全 & 锁优化

    关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...

  8. 深入理解java虚拟机(6)---内存模型与线程 & Volatile

    其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...

  9. 深入理解java虚拟机(5)---字节码执行引擎

    字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...

  10. 深入理解java虚拟机(4)---类加载机制

    类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...

随机推荐

  1. Dubbo项目一段时间后提供者消失

    Dubbo项目用了一段时间后发现接口不通了,错误500 打开监控中心发现提供者不见了 查看下日志文件发现报如下错 2018-08-06 15:10:18,008 [localhost-startSto ...

  2. 斐波拉契数列(用JavaScript和Python实现)

    1.用JavaScript 判断斐波拉契数列第n个数是多少 //需求:封装一个函数,求斐波那契数列的第n项 //斐波拉契数列 var n=parseInt(prompt("输入你想知道的斐波 ...

  3. python-day34--并发编程之多线程

    理论部分 一.什么是线程: 1.线程:一条流水线的工作过程  2.一个进程里至少有一个线程,这个线程叫主线程 进程里真正干活的就是线程 3.进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资 ...

  4. nyoj38

    布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有 ...

  5. The working copy needs to be upgraded svn: The working copy at

    错误信息: The working copy needs to be upgradedsvn: The working copy at 'F:\JAVA Project\PAW-VRVEIS-JJ-2 ...

  6. POJ 3481 treap

    这是利用treap写的二叉排序树,只要理解其中旋转能够改变树的左右子树平衡度,即高度之差,差不多就能掌握treap树的要领了. 相对于其他高级BST,treap树实现应该算最简单了,利用的是随机树产生 ...

  7. oracle12c新特点之可插拔数据库(Pluggable Database,PDB)

    1.    12c PDB新特点的优势 1)    可以把多个PDB集成进一个平台. 2)    可以快速提供一个新的PDB或一个已有PDB的克隆. 3)    通过拔插技术,可以快速把存在的数据库重 ...

  8. PHP:第三章——PHP中的回调函数

    <?php header("Content-Type:text/html;charset=utf-8"); //回调函数 //计算两个数只和 function Add($a, ...

  9. uart boot log

    CC开始 xmodem 传输. 按 Ctrl+C 取消. 100% 95 KB 4 KB/s 00:00:23 0 Errors U-Boot SPL 2018.01 (Jan 16 2019 - 1 ...

  10. L1-018 大笨钟

    微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那 ...