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. hdu-1849-nim模板

    Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. C#XML注释

    注释 <c>                             将说明中的文本标记为代码 <code>                       提供了一种将多行指示为 ...

  3. Activiti工作流笔记(4)

    Activiti工作流启动流程 /** * 启动流程 * */ public class ActivitiTest2 { RepositoryService repositoryService; Ru ...

  4. (转)RocketMQ源码学习--消息存储篇

    http://www.tuicool.com/articles/umQfMzA 1.序言 今天来和大家探讨一下RocketMQ在消息存储方面所作出的努力,在介绍RocketMQ的存储模型之前,可以先探 ...

  5. 用实例说明Spark stage划分原理

    注意:此文的stage划分有错,stage的划分是以shuffle操作作为边界的,可以参考<spark大数据处理技术>第四章page rank例子! 参考:http://litaotao. ...

  6. Translating Skills 英汉语序的对比及翻译

    本文记录于培训课程. ----------------------------------------- word order:Refers to the sorting in language un ...

  7. 获取当前进程目录 GetCurrentDirectory() 及 获取当前运行模块路径名GetModuleFileName()

    GetCurrentDirectory 获得的是当前进程的活动目录(资源管理器决定的),可以用SetCurrentDirectory 修改的. 转自 http://m.blog.csdn.net/bl ...

  8. 在C++里一个类成员函数多少行代码才是最好呢?

    这个问题,很多同事以及学生都问我这个问题.其实这是一个比较实际的问题,因为设计一个类成员函数的好与坏,决定了一个类代码的质量. 为了回答这个问题,昨晚又重新看看斯坦福大学的编程视频,可以用下面这个截图 ...

  9. NBUT 1221 Intermediary 2010辽宁省赛

    Time limit 1000 ms Memory limit 131072 kB It is widely known that any two strangers can get to know ...

  10. HDU 1518 Square(DFS)

    Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end ...