理解JAVA虚拟机(下)
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虚拟机(下)的更多相关文章
- 深入理解Java虚拟机--下
深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...
- 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)
1. 前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 2. 垃圾 ...
- 深入理解java虚拟机JVM(下)
深入理解java虚拟机JVM(下) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- 《深入理解 java虚拟机》学习笔记
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.
- (1) 深入理解Java虚拟机到底是什么?
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java ...
- 深入理解java虚拟机(7)---线程安全 & 锁优化
关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...
- 深入理解java虚拟机(6)---内存模型与线程 & Volatile
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...
- 深入理解java虚拟机(5)---字节码执行引擎
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
- 深入理解java虚拟机(4)---类加载机制
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...
随机推荐
- layui图片显示
有些东西看文档可以实现,但当真不如自己写的实在.所以还是记录下来吧. 1. 图片赋值 <div id="layer-photos-demo" class="laye ...
- linux中whereis、which、find、location的区别和用法
摘自:https://www.cnblogs.com/kex1n/p/5233821.html 1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式 ...
- 『PyTorch』第二弹重置_Tensor对象
『PyTorch』第二弹_张量 Tensor基础操作 简单的初始化 import torch as t Tensor基础操作 # 构建张量空间,不初始化 x = t.Tensor(5,3) x -2. ...
- Queue 实现生产者消费者模型
Python中,队列是线程间最常用的交换数据的形式. Python Queue模块有三种队列及构造函数: 1.Python Queue模块的FIFO队列先进先出. class Queue.Queue( ...
- 【转】C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
- React脚手架create-react-app+elementUI使用
一.介绍 1.create-react-app是FaceBook官方发布了一个无需配置的.用于快速构建开发环境的脚手架工具. 2.优点 a.无需配置:官方的配置堪称完美,几乎不用你再配置任何东西,就可 ...
- PHP:第一章——PHP中的魔术常量
<?php //__LINE__输出常量所在的行 //echo __LINE__; //2.__FILE__常量返回文件的完整路径和文件名; //echo __FILE__; //3.__DIR ...
- learning uboot test command
uboot commad test test - minimal test like /bin/sh so we can use test command to some judge for exam ...
- Python 数值计算库之-[NumPy](五)
- Ubuntu:搜狗输入法不能输入中文
搜狗输入法不能输入中文 问题描述 可以打开搜狗输入法,可以打英文,但是不能切换成中文. 其他输入法正常使用(这个可以判断是不是fcitx是不是出现错误). 有一个关于sogou的内部错误提示 解决方法 ...