idea中设置JVM参数,简单理解JVM常见参数,JVM调优

idea中设置JVM参数,简单理解JVM常见参数,JVM调优简单入门

前面学习了JVM的内存分布,今天就来验证下。顺便通过测试学习一下JVM的几个参数,不过测试是在idea中,所以先要在idea上设置JVM参数。

一、idea设置全局的JVM参数

一共三步,第一步在菜单栏Help下选择Edit Customer VM Options.......

1e46ad3a3f86092f7dfb012fc4d5dc09.jpeg image.png

第二步:可以看到选中后的参数,然后就可以设置常规参数,设置完成后记得重启idea。如下图:


a1cf0b20cf2641cb85d2cc1fca2f1ec0.jpeg image.png

第三步:重启后,查看结果,在idea的最右下角会显示总的和使用的,如果没有显示可以设置显示,如下图,在setting中勾选红色框那个选项,点击应用完成。

83eaa7ab3844f5df01dcc8236220a00f.jpeg image.png

二、针对应用配置JVM参数

第一步:选择Run下面的Edit Configurations....

1d61b4c2c8261875231cc05d3c84fd55.jpeg image.png

第二步:选择想配置的应用,然后在右侧的VM options设置JVM参数。

acc5d7c468bb8fd106d3fad78bc98f1d.jpeg image.png

三、JVM内存验证

又要祭出那张内存分布图了,

500ad9ada49ab815bb6cc75f3ee422fb.jpeg image.png

如上图,程序计数器不会抛出异常,先不管了,主要是剩下几个的验证。

1、Java堆验证

从之前的学习知道,堆里面放的都是对象和数组,主要是对象。首先是控制堆大小的两个参数-Xms(初始堆大小)、-Xmx(最大对大小)。

测试应用的JVM参数设置:

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

其中+HeapDumpOnOutOfMemoryError参数可以是内存溢出存储内存快照,可用于分析错误。测试结果如下图:

d16595b168a5488485956ae4aec1dfc1.jpeg image.png

红框内就是创建的文件就是内存快照文件,在你的项目的工作目录下,这个是内存溢出前存储的内存情况,可以用专门的工具去分析。这里分享一个在线的分析网站,把Dump文件传上去就可以简单分析下了,网址就不打了,具体如下图:

8525d06c22916e59d72ec71ed2239013.jpeg image.png

2、虚拟机栈和本地方法栈验证

HotSpot虚拟机不区分虚拟机栈和本地方法栈(通过java -version可查看是什么虚拟机),所以一起测试了。对应的JVM参数-Xss(每个线程的栈大小)

我们知道栈里面存的是栈帧,栈帧对应的就是线程的方法,所以只要调用的方法多就可以测试出来,最好的办法就是递归了。

测试应用的参数配置:

-Xss128k -XX:+HeapDumpOnOutOfMemoryError

测试结果如下图:

27170dda947f3936062ecc487f418c9d.jpeg image.png

虚拟机栈之前说过有两种溢出,线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常。如果虚拟机栈可以动态扩展,当扩展的时候没有申请到内存的时候抛出OutOfMemoryError。

这里我们是第一种情况。对于第二种情况,如果在单线程的情况下栈去动态扩展导致内存不足,那么应该也是属于栈不能申请到更多空间,所以是栈溢出,可以明显看出来OutOfMemoryError和StackOverflowError存在包含关系。如果在多个线程下。每个线程的栈都在扩展内存,就会耗光物理内存而造成了OutOfMemoryError。

一个机器的内存是有限的。建立过多线程导致的内存溢出。如果不能减少线程,那么可以通过减少堆和减少栈容量来换取更多线程。这部分可以深入讨论,主要讨论各个模块的关系,和各自的限制。

3、方法区验证

方法区中主要存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码。所以我们平时遇到的这类异常一般都是加载的类太多,比如spring这类的框架都会对类进行增强,都会使用到CGLib这类字节码技术,增强的类越多,就需要越大的方法区来保证动态生态的Class可以加载入内存。

jdk8的方法区变成了元空间,使用的是直接内存。所以和jdk7使用的参数不一样具体参数如下:

jdk7:-XX:PermSize=10m -XX:MaxPermSize=10m

jdk8:-XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m

结果如下图:

6f685439213a1ef1ed21999875ef7661.jpeg image.png fd8ea7adb3d4b3fff234d6ef2f3d403d.jpeg image.png

jdk8的异常更加明显,明确表明是了元空间内存溢出。

4、直接内存验证

直接内存如果不设置和-Xmx(堆最大)一样。可通过参数-XX:MaxDirectMemorySize来设置直接内存。直接内存一般和NIO有关,DirectByteBuffer中通过Unsafe去操作的直接内存,DirectByteBuffer是通过计算知道内存不足抛出的异常,unsafe.allocateMemory()才是去申请内存的方法。测试代码如下图:

测试参数:-Xms20m -XX:MaxDirectMemorySize=10m

dd98ffba0e55ee1818691b0796c8d3d8.jpeg image.png

直接内存的溢出比较简单,dump文件也比较小。如果发现内存溢出也没有明显异常,dump文件比较小,那么就应该想到可以能直接内存溢出,是不是程序中使用了NIO的原因。

四、总结

学习了几个常用JVM参数,总结如下

624f369403b8cf0aa965b31c57243131.jpeg image.png

OutOfMemoryError简称OOM,学习了几个基本的内存溢出后,对以后才能有更好的帮助。工作中遇到了内存溢出时,能根据异常信息来判断是那个区域的内存溢出,也知道什么样的代码可能会造成这些区域会出现内存溢出,并且知道一些处理手段。



作者:楼兰King
链接:https://www.jianshu.com/p/fe067662155b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### 如何在 IntelliJ IDEA设置或打开 JVM 参数配置 #### 方法一:通过全局配置文件修改 JVM 参数 IntelliJ IDEAJVM 参数可以通过其安装目录下的 `vmoptions` 文件进行配置。具体路径位于 IDE 安装目录的 `/bin/` 下,存在两个主要文件用于不同架构的支持: - **32 位系统** 使用 `idea.exe.vmoptions` - **64 位系统** 使用 `idea64.exe.vmoptions` 编辑这些文件可以JVM 启动参数,例如内存分配、垃圾回收器的选择等。默认情况下,该文件的内容可能类似于以下内容[^5]: ```plaintext -Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow ``` 完成编辑后保存文件即可生效。 --- #### 方法二:通过运行/试配置界面设置 JVM 参数 对于特定项目或者模块的 JVM 参数配置,可以在运行/试配置对话框中进行操作。以下是具体的步骤说明: 1. 打开项目的运行/试配置窗口(快捷键为 `Alt + Shift + F10` 或者菜单栏选择 `Run -> Edit Configurations...`)。 2. 在弹出的窗口中找到目标运行配置项(如 Application, JUnit Test 等),然后定位到 `VM Options` 字段。 3. 输入所需的 JVM 参数,例如 `-Xms`, `-Xmx`, `-XX:` 类型的选项[^1]。 如果发现某些新版本中 VM Options 被隐藏,则需要手动启用显示功能。通常可通过勾选高级选项或者重新定义模板来实现[^3]。 --- #### 方法三:代码级别的 JVM 参数注入 除了上述两种外部手段外,在实际应用开发过程中还可以利用程序内部逻辑动态指定部分 JVM 参数。这种方式适用于更灵活的需求场景,比如基于条件加载不同的 GC 实现策略或其他性能化措施[^4]。 示例代码展示如何通过 Java API 设置自定义属性: ```java public class CustomJvmSettings { public static void main(String[] args) { System.setProperty("my.custom.property", "value"); // 输出确认已成功设定 String customValue = System.getProperty("my.custom.property"); System.out.println(customValue); } } ``` 注意这种方法仅限于影响当前进程范围内的行为表现,并不会改变启动时的整体环境状态。 --- ### 总结 综上所述,针对 IntelliJ IDEA 用户而言,至少存在三种途径可供选用以达成对 JVM 参数的有效管理目的——即直接修改 vmoptions 配置文档、借助内置 GUI 工具定制化每种任务类型的专属选项以及采用编程手法间接干预执行上下文中涉及的相关变量值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值