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. python-day13--装饰器

    1.开放封闭的原则: 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对 ...

  2. html选择器

    1.标签选择器:针对的是元素. <html><head><style type="text/css">p{font:"宋体" ...

  3. iOS UI-手势(Gesture)

    #import "ViewController.h" @interface ViewController ()<UIActionSheetDelegate> @prop ...

  4. Sentry项目监控工具结合vue的安装与使用(前端)

    一.官网:https://sentry.io/welcome/ 二.介绍 Sentry 是一个开源的实时错误报告工具,支持 web 前后端.移动应用以及游戏,支持 Python.OC.Java.Go. ...

  5. ECC算法整理纪要

    初始ECC算法 1.用户A 密钥生成 (1):用随机数发生器产生随机数k∈[1,n-1]: (2):计算椭圆曲线点PA=[k]G,为公钥,k为用户A私钥: 2. 用户B加密算法及流程 设需要发送的消息 ...

  6. UVALive 5107 dfs暴力搜索

    题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以 ...

  7. ZOJ 3829 Known Notation 贪心 难度:0

    Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation ...

  8. JAXP/DOM demo

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. css 和 UI 框架 ---------- vue 待续

    vue 框架组件集合 radon-UI: 他人评价 --  一个帮助你快速开发产品的Vue组件库,简洁好用,效率高,让你摆脱各种定制化的烦恼. 个人感觉 --   组件简洁,  功能全面,  文档清晰 ...

  10. Ubuntu 搭建Ghost1.0博客系统

    最近想使用Ghost搭建自己的博客网站,网上搜索了下大多都是1.0之前版本搭建的文章,但是Ghost1.0版本已经可用好一段时间了,所以决定根据官方文档搭建Ghost1.0版本的博客系统. 下面开始一 ...