文档章节

JVM调优

xiejunbo
 xiejunbo
发布于 2015/03/31 03:33
字数 1361
阅读 34
收藏 0
点赞 0
评论 0

java字节码是运行在JVM虚拟机上的,同样的字节码使用不同的JVM参数运行,性能表现可能不一样。

内存调优主要内容:

  1. JVM内存模型结构

  2. 与内存分配(尤其是堆分配)相关的JVM参数

  3. 垃圾回收器的种类及使用方法

  4. 常用JVM调优参数及其使用效果

  5. JVM调优实例

============================================

一.JVM内存模型

可分为程序计数器,虚拟机栈,本地方法栈,java堆,方法区部分。

  1. 程序计数器:记录下一条要运行的指令,是线程私有有内存空间。

  2. 虚拟机栈:也是线程私有的内存空间。Java栈的大小是动态或固定的,管理java函数的调用。

    虚拟机栈两种异常:

    StackOverflowError: 栈大小固定时,线程在计算过程中,请求的栈深度大于最大可用栈深度时抛出此异常。

    OutOfMemoryError: 栈大小可扩展时,在扩展栈时,没有足够的内存空间来支持栈的扩展,则抛出此异常。

        可使用-Xss参数设置栈的大小。

3.本地方法栈:与虚拟机栈功能类似,本地方法栈用于管理本地方法的调用.也会抛出上面两种异常。用C写的,而非java.

4.java堆:被JVM中所有线程共享,分为新生代和老年代两部分。新生代用于存入刚刚产生的对象和年轻的对象。老年代用户存放经过垃圾回收次数较多的的对象。

例:

public static void main(String args[]) {
		/**
		 运行参数:
		 -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -Xms40M -Xmx40M -Xmn20M
		 */
		byte[] b1 = new byte[1024*1024/2];
		byte[] b2 = new byte[1024*1024*8];
		b2 = null;
		b2 = new byte[1024*1024*8];//进行一次新生代GC
		//System.gc();
	}

 5.方法区:被JVM中所有线程共享,主要保存的信息是类的元数据(常量和类的定义信息)。也称永久区,是一块独立于Java堆的内存空间。永久区中的对象同样可以被GC回收。

/**
	 * 常量池数据回收
	 */
	public static void test2(){
		/**
		 运行参数:
		 -XX:PermSize=2M -XX:MaxPermSize=4M -XX:+PrintGCDetails
		 */
		for(int i = 0; i < Integer.MAX_VALUE; i++) { 
			String t = String.valueOf(i).intern();//加入常量池
		}
	}

如果虚拟机确认该类的所有实例已经被回收,并且加载该类的ClassLoader已经被回收,GC就有可能回收该类型。

二.JVM内存分配参数

设置堆大小,新生代大小,持久代大小,线程栈大小等。

  1. 设置最大堆内存:可以使用-Xmx指定可以使用的最大堆。最大堆是指新生代和老年代的大小之和的最大值,是 Java应用程序的堆上限。

    使用-Xmx设置系统最大堆。

  2. 设置最小堆内存:使用-Xms设置最小堆内存,也就是JVM启动时所占据操作系统内存的大小。JVM会试图将系统内存尽可能控制在-Xms中,因此,当内存实际使用量到-Xms指定的大小时,会触发 Full gc.因此把-Xms值设置为-Xmx时,可以在系统运行初期减少GC的次数和耗时。

    3.设置新生代:参数-Xmn设置新生代的大小,设置一个较大的新生代会减少老年代的大小。新生代的大小一般设置为整个堆空间的1/4到1/3左右。

     4.设置持久代:使用-XX;MaxPermSize设置持久代的最大值,使用-XX:PermSize设置持久代的初始大小。持久代的大小直接决定了系统可以支持多少个类定义和多少常量.

     5.设置线程栈:线程栈是线程的私有空间。使用-Xss设置线程栈的大小.

     6.堆的分配比例: 使用参数-XX:NewRatio可以用来设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代

        -XX:SurvivorRatio可以设置eden区与survivor区的比例。

      7.堆分配参数使用总结:

-Xms:设置Java应用程序启动时的初始堆大小。

-Xmx:设置java应用程序能获得的最大堆大小。

-Xss:设置线程栈的大小.

-XX:MinHeapFreeRatio:设置堆空间最小空闲比例.当堆空间的空闲内存小于这个数值时,JVM便会扩展空间.

-XX:MaxHeapFreeRatio:设置堆空间最大空闲比例.当堆空间的空闲内存大于这个数值时,JVM便会压缩空间,得到一个较小的堆

-XX:NewSize:设置新生代大小.

-XX:NewRatio:设置老年代和新生代的比例,即:老年代/新生代

-XX:SurvivorRatio:设置eden区和survivor区的比例.

-XX:MaxPermSize:最大持久区大小.

-XX:PermSize:永久区的初始值.

-XX:TargetSurvivorRatio:设置survivor区的可使用率,当survivor区的空间使用率达到这个值时,会将对象送入老年代.

三.垃圾收集

垃圾收集的作用,垃圾回收算法,垃圾收集器的类型,评价GC策略的指标,新生代串行收集器,老年代串行收集器,并行收集器,新生代并行回收收集器,老年代并行回收收集器,CMS收集器,G1收集器,Stop the world案例,收集器对系统性能的影响,GC相关参数的使用总结.


四.常用调优案例和方法


五.实用的JVM参数


六.JVM调优实战操作





© 著作权归作者所有

共有 人打赏支持
xiejunbo
粉丝 41
博文 144
码字总数 132363
作品 0
广州
后端工程师

暂无相关文章

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 12分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 24分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 57分钟前 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部