JVM Flags介绍-Heap相关

前言

此篇文章是关于Userful JVM Flags系列2系列4的总结

JVM flag类别

  • 标准flags,标准flags一般都是最基本的flags,而且在将来JVM的发布版本中基本不会改变的,例如-server -client
  • X flags,这类的特点是非标准,随着JVM版本不同可能会改变;这类flags都是以-X开头,通过java -X可以列出所有(少了-Xcomp)
  • XX flags,这类也是非标准的。Xflags很稳定,XXflags可能更加实验性(主要被JVM开发者用于debug和优化JVM实现)。在使用X flags或者XX flags之前一定要明白flag的使用方式和可能带来的副作用。XX flags都以-XX开头,但是语法根据flag type不同而不同

XXflags使用方式

  • 如果是boolean flag,使用+ -。例如<b>-XX:+<name></b> activate <b><name></b>,-号表明deactives that option.
  • 对于非boolean flag,使用-XX:<name>=<value>的方式

关于堆调整(Heap Tuning)的Flags

以下的讨论的heap是这样的heap(堆):基于经典分类,分为young gen, old gen , permanent gen 。1.8已经没有permanent gen,不在该讨论范围

-Xms and -Xmx(or: -XX:InitialHeapSize and -XX:MaxHeapSize)

-Xms和-Xms是目前最流行的JVM flags,用来指定初始heap大小和最大heap大小 一般用k表示kilo,m表示mega,g表示giga,例如 <pre>java -Xms128m -Xmx2g myapp</pre>表示myapp应用堆初始化大小为128m bytes,最大为2g bytes。 主要注意的是-Xms -Xmx相当于对应-XX的别名,当我们使用-XX:+PrintCommandLineFlags时,需要搜索InitialHeapSize和MaxHeapSize,而不是Xms和Xmx

-XX:+HeapDumpOnOutOfMemoryError ,-XX:HeapDumpPath=<path>

当我们系统发生OOM错误的时候,通过我们需要jmap heap dump,但是有可能虚拟机已经crash了的时候,我们最好设置-XX:+HeapDumpOnOutOfMemoryError,这样在发生OOM的时候回自动heap dump,由于通常heap dump文件都很大,所有最好是指定path

-XX:OnOutOfMemoryError

当我们需要在发生OOM的时候执行一些脚本或命令,我们可以通过该flag指定 <pre>$ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp</pre>

-XX:PermSize and -XX:MaxPermSize

可以使用-XX:PermSize指定初始化Permanent大小,使用MaxPermSize指定最大大小

-XX:InitialCodeCacheSize and -XX:ReservedCodeCacheSize

一个经常被忽视的JVM内存区域是"code cache",用来存储方法编译后的native code。平常该区域不会存在性能问题,但是一旦发生问题都是灾难性的。当code cache区域用尽时,JVM会给出警告信息然后切换到"interpreted-only "模式,该模式下停止JIT编译器,字节码不能编译成native code,性能急速下降。可以通过设置-XX:InitialCodeCacheSize and -XX:ReservedCodeCacheSize来调整code cache区域大小

-XX:+UseCodeCacheFlushing

这个参数与code cache有关,当code cache持续增长时,发生overflow是迟早的事情,此时可以通过设置UseCodeCacheFlushing来避免最终切换到interpreted-only模式。从名字可以看出,用法就是当JVM code cache填满时会丢掉一些编译了的代码从而避免进入interpreted-only 模式。但是该种方法治标不治本,还是得找出根源修复内存泄露的问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余林丰

关于日志打印的几点建议以及非最佳实践

  日志的打印在软件开发过程中必不可少,一般分为两个大类: 操作日志 系统日志   操作日志,主要针对的是用户,例如在Photoshop软件中会记录自己操作的步...

41170
来自专栏java技术学习之道

理解MVC及快速入门

12130
来自专栏运维

ElasticSearch2.3/2.4升级到ElasticSearch5.0

注意最好用elasticsaerch-migration跑一下注意事项,我这里是抱着丢数据index的目的来升级的。

21720
来自专栏微信公众号:Java团长

面试的角度诠释Java工程师(二)

反射:反射是Java开发的一类动态相关机制。因为本身Java语言并不是一款动态语言,如果我们想要得到程序动态的效果,因此便引入了反射机制这一概念。

9710
来自专栏FreeBuf

JoomScan:一款开源的OWASP Joomla漏洞扫描器

OWASPJoomla!漏洞扫描器(JoomScan)是一个开源项目,其主要目的是实现漏洞检测的自动化,以增强Joomla CMS开发的安全性。该工具基于Per...

29730
来自专栏扎心了老铁

Linux Redis集群搭建与集群客户端实现

硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本:3.2.1 Redis已经成功安装,安装...

458130
来自专栏挖掘大数据

Apache NiFi 简介及Processor实战应用

Apache NiFi是什么?NiFi官网给出如下解释:“一个易用、强大、可靠的数据处理与分发系统”。通俗的来说,即Apache NiFi 是一个易于使用、功能...

2K100
来自专栏友弟技术工作室

PHP相关概念及配置

php MIME,http,html MIME:MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型 ...

452130
来自专栏张善友的专栏

使用Hystrix提高系统可用性

今天稍微复杂点的互联网应用,服务端基本都是分布式的,大量的服务支撑起整个系统,服务之间也难免有大量的依赖关系,依赖都是通过网络连接起来。 ? (图片来源:htt...

22250
来自专栏IT技术精选文摘

Netty高性能之道

1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K...

38470

扫码关注云+社区

领取腾讯云代金券