Java虚拟机(二)——JVM内存参数

Java虚拟机内存参数设置 JVM按照其存储数据的内容将所需内存分配为堆区与非堆区两个部分。 所谓堆区即为通过new的方式创建的对象(类实例)所占用的内存空间;非堆区即为代码、常量、外部访问(如文件访问流所占资源)等。 java垃圾回收器GC专门用于回收堆内存,而对于非堆区的资源就束手无策了,非堆区只能由开发人员管理。 Java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容; 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足. 阅读详情
JVM默认运行参数

支持JVM运行的重要配置,根据操作系统/物理硬件不同而不同

分为三类参数:

类型稳定性举例
- 参数标准参数,比较稳定-version
-X 参数非标准参数,不在所有VM通用-Xmx
-XX 参数非Stable参数,容易变更-XX:MaxMetaspaceSize

下面使用-XX:+PrintFlagsFinal 显示堆内存的相关参数

C:\Users\Administrator>java -XX:+PrintFlagsFinal -version | findstr HeapSize
    uintx ErgoHeapSizeLimit                         = 0                                   {product}
    uintx HeapSizePerGCThread                       = 87241520                            {product}
    uintx InitialHeapSize                          := 161480704                           {product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    uintx MaxHeapSize                              := 2571108352                          {product}
openjdk version "1.8.0_202-release"
OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b03)
OpenJDK 64-Bit Server VM (build 25.202-b03, mixed mode)

可以看到当前JVM初始化堆内存和最大堆内存的大小
更多的参数配置可以到官网查看https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

下面来演示如何在程序中配置相关参数

程序启动的两类参数
  • 程序参数:程序需要,存储在main函数的形参数组中
  • 虚拟机参数:更改默认配置,用以指导进程运行

JVM参数M配置

堆(Heap)
  • 共享,内存大户,存储所有的对象和数组
  • -Xms 初始堆值,-Xmx最大堆值

下面代码设置 VM options 的参数为: -Xmx5M (见上图),运行后出现OutOfMemoryError异常

public static void main(String[] args) {
        List<User> users = new ArrayList<>();

        while (true){
            users.add(new User());
            System.out.println(users.size());
        }
    }

输出:
.
.
.
152694
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.nio.CharBuffer.wrap(CharBuffer.java:373)
JVM 栈(JVM Stack)
  • 线程私有,存储类中每个方法的内容
  • -Xss 最大栈值

下面代码设置 VM options 的参数为: -Xss1M,运行后出现StackOverflowError异常

public class MyClass {

    private int count = 1;

    public void sum(){
        count ++;
        System.out.println(count);
        sum();//递归调用
    }

    public static void main(String[] args) {
        new MyClass().sum();
    }
}

输出:
.
.
.
10503
Exception in thread "main" java.lang.StackOverflowError

下面代码设置 VM options 的参数为: -Xmx5M -Xss1M,运行后出现OutOfMemoryError异常

public class MyClass {

    public static void main(String[] args) {
        int num = 0;
        while (true){
            num ++;
            System.out.println(num);
            new MyThread().start();
        }
    }

    static class MyThread extends Thread{
        @Override
        public void run() {
            long a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
            a1=a2=a3=a4=a5=a6=a7=a8=a9=a10=0;
            while (true){
                try {
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

输出:
.
.
.
8191
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
方法区(Method Area)
  • 存储类信息、常量池等
  • 1.7及以前,永久区(Perm),-XX:PermSize, -XX:MaxPermSize
  • 1.8及以后,元数据区,-XX:MetaspaceSize, -XX:MaxMetaspaceSize
C:\Users\Administrator>java -XX:+PrintFlagsFinal -version | findstr Meta
    uintx InitialBootClassLoaderMetaspaceSize       = 4194304                             {product}
    uintx MaxMetaspaceExpansion                     = 5451776                             {product}
    uintx MaxMetaspaceFreeRatio                     = 70                                  {product}
    uintx MaxMetaspaceSize                          = 4294901760                          {product}
    uintx MetaspaceSize                             = 21807104                            {pd product}
    uintx MinMetaspaceExpansion                     = 339968                              {product}
    uintx MinMetaspaceFreeRatio                     = 40                                  {product}
     bool TraceMetadataHumongousAllocation          = false                               {product}
     bool UseLargePagesInMetaspace                  = false                               {product}
openjdk version "1.8.0_202-release"
OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b03)
OpenJDK 64-Bit Server VM (build 25.202-b03, mixed mode)

说明:

MaxMetaspaceSize:用于设置metaspace区域的最大值。

MetaspaceSize:表示metaspace首次使用不够而触发FGC的阈值,只对触发起作用。

  • -XX:MaxMetaspaceSize 最大元数据空间值

下面代码设置 VM options 的参数为: -XX:MaxMetaspaceSize=9M,运行后出现OutOfMemoryError异常

public static void generateClass(){
        String className = "Hello";
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < 10000; i++) {
            System.out.println(i);
            String realClassName = className + i;
            sb.append("class " + realClassName + "{\n");
            sb.append("public static void main(String[] args){\n");
            sb.append("System.out.print(\"hello world\"); \n");
            sb.append("}\n");
            sb.append("}");

            try {
                //使用第三方库InMemoryJavaCompiler(https://github.com/trung/InMemoryJavaCompiler)
                Class<?> helloClass = InMemoryJavaCompiler.newInstance().compile(realClassName, sb.toString());
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

输出:
0
Exception in thread "main" java.lang.OutOfMemoryError: Compressed class space
总结
  • 了解JVM的运行参数有哪些
  • 根据异常信息,调整相应的内存参数
Java 虚拟机(JVM)内存结构详解 Java 虚拟机(JVM)的内存结构是 Java 程序运行的基石,理解其组成对于性能调优、故障排查至关重要。理解 JVM 内存结构是优化 Java 应用性能、解决内存问题的第一步!新生代 Eden/S0/S1。 阅读详情

相关推荐

【JVM】Java虚拟机JVM堆内存调优

JVM堆内存调优是Java性能优化的重要部分,主要目的是为了确保程序稳定运行并充分利用系统资源。

No8g攻城狮的博客 2810

【Java核心-进阶】运行时动态生成Java类

. 技术上可行的方式 生成源码文件 -> 编译源码 -> 加载类 方式1:javac编译 可以用 ProcessBuilder 这个类启动 javac 进程,编译源码文件 方式2:Java Compiler API 编译 JDK中的 Java Compiler API 提供了与 javac 对等的编译能力。(示例:InMemoryJavaCompiler) ...

一个被IT搞的 968

JVM 内存参数

它屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在各种平台上不加修改的运行。‌例如,‌可以将最小堆内存设置为2GB(‌-Xms2048m)‌,‌最大堆内存设置为4GB(‌-Xmx4096m)‌。如果初始化的高水位线设置过低,会频繁的触发FullGC,高水位线会被多次调整。一般来说,垃圾回收器都会有默认的对象晋升到老年代的年龄参数阈值,CMS默认是6,G1默认是15,不过这参数值也不是一成不变的,它会根据动态年龄判断规则来重新被赋值。

专注于计算机研发知识和资讯分享 3525

在内存中编译Java源码:InMemoryJavaCompiler使用指南

在内存中编译Java源码:InMemoryJavaCompiler使用指南 项目介绍 InMemoryJavaCompiler 是一个便捷的工具类,它允许开发者在不创建临时文件的情况下,直接在内存中编译Java源代码。此开源项目由Trung开发并托管在GitHub上(https://github.com/trung/InMemoryJavaCompiler)。通过利用Java标准工具集中的Java...

gitblog_00852的博客 659

ESP32-C5 Wi-Fi CSI感知技术原理与工程实践

Wi-Fi信道状态信息(CSI)是OFDM系统中反映多径信道特性的复数频域响应,源于导频子载波的信道估计过程,本质属于物理层原始观测数据。其高维度(如56子载波)、高时间分辨率(百赫兹级采样)及零硬件增益的特性,使其成为无感人体感知的理想信号源。相比UWB或毫米波雷达,CSI方案依托现有Wi-Fi基础设施,兼具成本优势与部署灵活性,广泛应用于呼吸监测、跌倒检测、手势识别等边缘智能场景。乐鑫ESP32-C5通过5.8GHz低噪接收、亚纳秒级多天线同步与固件级CSI增强,显著提升微动感知鲁棒性,结合AGC锁定、

weixin_42153793的博客 343

【电机控制入门】——电机控制书籍推荐

电机控制入门书籍推荐及分享 阅读须知: 1.电机控制的入门是涉及到机械、电子与控制等复杂交叉学习,它需要持续投入时间才可以看到学习的效果,如同“一万小时定律”。俗话说,九层之台,起于垒土,因此电机控制入门没有所谓的速成培训班。相反,还需要夯实好一定的基础。为此,博主建议从基础理论抓起,故推荐相关的书籍并分享给大家。 2.学习电机贵在动手实践,无论是借助于MATLAB/Simulink仿真平台来验证理论分析,或是使用板子对所设计的控制系统进行物理实现,博主极力推荐在一定基础(看完部分以下推荐的书籍),一边动手

昔时扬尘处 3万+

apache 编译java,动态编译java类Web项目

I'm developing a web application where I can import a java code, compile and then execute it.This class might have some imports from another libraries, which I added to my classpath.Running it as a de...

weixin_39680154的博客 283

基于Python的信用卡欺诈检测机器学习案例报告

当今时代,在线支付已成为一种高效便捷的支付方式,我们可以突破时间和空间的限制,输入我们的信用卡各项信息就可以完成在线支付。但随之而来的是这种支付方式也具备一定的风险性,我们无法辨别对方是否是恶意套取我们资金的非法分子。当信用卡信息数据泄露导致金钱失窃并最终失去客户忠诚度和公司声誉时,组织、消费者、银行和商家都会面临风险。2017 年,未经授权的信用卡操作达到了惊人的 1670 万受害者。此外,据美国联邦贸易委员会 (FTC) 报告,2017 年信用卡欺诈索赔数量比上一年高出 40%。

weixin_45673389的博客 6692

在内存中编译Java源码:InMemoryJavaCompiler 使用指南

在内存中编译Java源码:InMemoryJavaCompiler 使用指南 1. 项目目录结构及介绍 仓库 https://github.com/trung/InMemoryJavaCompiler.git 主要围绕一个核心功能,即在内存中编译Java代码。以下是其基本的目录结构概述: InMemoryJavaCompiler/ │ ├── src/ │ └── main/ │ ...

gitblog_00910的博客 500

STM32 ADC+DMA实战:手把手教你驱动XGZP6847A压力传感器(附完整代码)

本文详细介绍了如何使用STM32的ADC和DMA外设驱动XGZP6847A压力传感器,包括硬件连接、ADC配置、DMA高效传输实现以及数据处理与校准方法。通过实战案例和完整代码,帮助开发者快速掌握高精度压力数据采集技术,适用于工业控制和医疗设备等领域。

weixin_42570484的博客 404

智能车赛道识别:八邻域算法的实战解析与优化

本文深入解析了智能车赛道识别中八邻域算法的核心原理与实战优化。作为兼顾性能与稳定性的经典方案,该算法通过模拟探险家环顾八方的策略,能精准追踪弯道与直道边界。文章详细拆解了代码逻辑,并提供了边界平滑、异常处理及应对十字路口、环岛等复杂场景的关键优化策略,助力开发者提升智能车视觉系统的鲁棒性与实时性。

weixin_29228781的博客 261

InMemoryJavaCompiler:内存中的Java编译器

InMemoryJavaCompiler:内存中的Java编译器 InMemoryJavaCompiler 是一个开源项目,主要使用 Java 编程语言开发。该项目提供了一个实用的工具类,可以在内存中编译 Java 源代码,无需将其写入文件系统。 核心功能 项目的核心功能是提供了一个 InMemoryJavaCompiler 类,该类可以编译 Java 源代码,并将编译后的类加载到 JVM 中。这...

gitblog_00319的博客 457

11、频率响应与伯德图详解

本文详细介绍了电子电路分析中的频率响应与伯德图,涵盖分贝的定义与计算、带宽与3dB点、放大器反馈机制、倍频程与十倍频程概念,并系统讲解了基于实数和复数零极点的伯德图构建方法。通过具体示例分析了传递函数的渐近近似、幅度与相位响应,并结合MATLAB工具展示了伯德图的绘制过程。文章旨在帮助读者深入理解电路在不同频率下的行为特性,为电路设计与优化提供理论支持。

white的博客 172

java虚拟机-d参数配置_Java虚拟机(二)——JVM内存参数

JVM默认运行参数支持JVM运行的重要配置,根据操作系统/物理硬件不同而不同分为三类参数:类型稳定性举例- 参数标准参数,比较稳定-version-X 参数非标准参数,不在所有VM通用-Xmx-XX 参数非Stable参数,容易变更-XX:MaxMetaspaceSize下面使用-XX:+PrintFlagsFinal 显示堆内存的相关参数C:\Users\Administrator>jav...

weixin_42510278的博客 499

Central Finance 全景解析:用 SAP S/4HANA 构建跨系统的财务中台与渐进式转型路径

Central Finance 是基于 SAP S/4HANA 的一种部署与应用场景:在不打断现有异构源系统运营的前提下,把多套 SAP 与非 SAP 系统中的财务与管理会计数据实时/准实时复制到一套中心化的 SAP S/4HANA 中,作为统一的记账与分析底座,逐步把选定的财务流程(如预算控制、付款、固定资产结账等)迁入中心系统。这让企业既能快速获得统一报表与统一核算结构,又为未来的整体迁移留出了弹性路径。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 390

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【DevOps】Java内存分配与JVM参数详解

JVM参数是用来控制JVM行为的一系列选项。这些参数可以影响内存分配、垃圾回收、线程行为等。-Xms:设置JVM堆的最小内存大小。-Xmx:设置JVM堆的最大内存大小。-Xmn:设置年轻代的大小。-Xss:设置线程栈的大小。:设置元空间初始大小。:设置元空间的最大大小。:启用G1垃圾回收器。:启用并行垃圾回收器。:启用CMS垃圾回收器。

TradingAgents-CN专栏 5714

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java虚拟机——JVM的内存结构详解

程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined。Java 虚拟机栈是描述 Java 方法运行过程的内存模型。局部变量表操作数栈动态链接方法出口信息......本地方法栈是为 JVM 运行 Native 方法准备的空间,由于很多 Native 方法都是用 C 语言实现的,所以它通常又叫 C 栈。它与 Java 虚拟机栈实现的功能类似,只不过本地方法栈是描述本地方法运行过程的内存模型。

allen19901008的专栏 2505

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JVM 参数详解:深度剖析 Java 虚拟机调优

JVM 参数的调优对于提升 Java 应用程序的性能至关重要。在本文中,我们详细讲解了 JVM 的内存管理、垃圾回收、JIT 编译以及调试诊断等方面的参数。通过合理的参数配置,开发者可以根据不同的应用场景进行性能优化,提高程序的响应速度和处理能力。希望这篇文章能帮助你更好地理解和掌握 JVM 参数的调优技巧!

一碗黄焖鸡三碗米饭的博客 1633

【详解】JVM调整java虚拟机可使用的最大内存

堆内存(Heap Memory):用于存放对象实例,是垃圾收集器管理的主要区域。非堆内存(Non-Heap Memory):主要包括方法区(Method Area)、运行时常量池(Runtime Constant Pool)、本机方法栈(Native Method Stacks)等。程序计数器(Program Counter Register):每个线程私有,是一块较小的内存空间,用于指示当前线程所执行的字节码指令的位置。虚拟机栈(VM Stack)

牛肉胡辣汤 3315

java虚拟机与jvm内存模型

1.Java虚拟机本质与编译器由来 Java虚拟机jvm(一个c++程序而已,当然也有其他语法实现的)其实是一个进程虚拟机--上面跑进程的(,普通服务器虚拟机是跑操作系统的),启动一个java程序就是启动一个java虚拟机上面跑这个java程序,这个启动的java虚拟机对操作系统来说其实就是一个(c++)进程,这个进程会调用本地方法(C/C++/汇编语言编写,编译成和处理器相关的机

le119126的专栏 5408

二、JVM内存模型及内存参数设置

二、JVM内存模型 1、Java语言跨平台特性 java程序主要通过JVM来实现跨平台的,JVM编译器将Java源代码文件编译成字节码文件(一次编译,随处运行),然后不同的操作系统生成的机器码不同,但是JVM运行是相同的,JVM解释器将字节码文件转换为机器可执行的二进制机器码 2、JVM内存模型 jvm包含两个子系统为类装载子系统和字节码执行引擎。两个组件为运行时数据区和本地接口。 类装载子系统:根据给定的全限定名类名(如:java.lang.Object来装载Class文件到Runtimedat

一名蒟蒻的博客 1655

【Java】虚拟机(JVM)内存模型全解析

JVM 虚拟机在执行 Java 程序的过程中,会把它管理的内存划分成若干个不同的区域,每个区域有各自的不同的用途、创建方式及管理方式。有些区域随着虚拟机的启动一直存在,有些区域则随着用户线程的启动和结束而建立和销毁,这些共同组成了 Java 虚拟机的,也被称为。

weixin_71491685的博客 1825

java jar 默认jvm参数 java -jar 默认内存

Java应用启动时JVM会使用默认参数,包括堆内存分配(-Xms为物理内存1/64,-Xmx为1/4)、垃圾回收器等,但这些参数会随JDK版本变化。可通过命令查看默认设置,建议显式设置关键参数(如-Xms、-Xmx)以确保性能稳定。堆内存分配策略会根据使用率自动调整,32位系统存在2-3GB内存限制。若参数设置不当(如Xms>Xmx)或总内存超限会导致启动失败。对于大型应用或第三方jar较多的情况,需特别设置-XX:MaxPermSize等参数。

DN金猿的博客 1463

调整JVM虚拟机内存大小

随着应用程序处理需求的提升,我们对JAVA虚拟机的内存可能会有更高的要求,那么为了提升程序的处理能力,可以考虑在硬件支持的情况下适当扩大JAVA虚拟机的默认内存大小,下面介绍windows环境和liunx环境如何调整虚拟机内存的方法。

lixinyao5281的专栏 2万+
上一篇: Java虚拟机(一)——JVM内存分类
good_logic
博客等级 码龄15年 54粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值