JVM 内存分配详解

深入解析rknn-toolkit2混合量化:如何为RK3588和RK356X选择最佳量化策略 本文深入解析了RKNN-Toolkit2混合量化技术,针对瑞芯微RK3588和RK356X芯片的硬件特性差异,提供了最佳量化策略选择指南。通过混合量化技术,开发者可以在保持较高推理效率的同时显著降低精度损失,特别适用于边缘计算场景。文章详细介绍了混合量化的技术原理、实战流程及芯片专属优化策略,帮助开发者充分利用硬件特性提升模型性能。 阅读详情
JVM 内存分配详解
2010-12-13 11:25

使用Java程序从数据库中查询大量的数据时出现异常: 
java.lang.OutOfMemoryError: Java heap space 
在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 
解决办法: 
理方法是 
在myeclipse中设置TOMCAT的内存大小 

Tomcat是目前应用十分广泛的一个Java servlet container与web服务器,但java.lang.OutOfMemoryError与java.lang.OutOfMemoryError: PermGen space的异常相信真正用过tomcat的人都遇到过(用户量大,应用使用频繁等),这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不够的,所以你可以给JVM分配上1G甚至更多,这样就可以避免内存溢出。 
     分配方法: 
1)linux下 
     编辑tomcat的catalina.sh文件,在第一行的后面增加一句: 
JAVA_OPTS='-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M' 
注意:单引号不能少,-server表示以server模式运行(运行效率比默认的client高很多,自己云去测试),-Xms256m是最小内存,-Xmx512m是最大内存,其中的256与512可根据你自己的内存做相应调整,PermSize/MaxPermSize最小/最大堆大小.一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置,我自己的文件如下: 
#!/bin/sh 
JAVA_OPTS='-server -Xms1024m -Xmx1024m XX:PermSize=128M -XX:MaxPermSize=256M' 
# ----------------------------- 

2)windows下 

     编辑tomcat的catalina.bat文件,在第一行的后面增加一句: 
set JAVA_OPTS=-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M 
注意:没有单引号 

2.1)如果windows下tomcat被作为一种服务安装了,可通过tomcat monitor的java页进行配置 



注:Java Options中每一行的最后不能有空格。 
上面配置的catalina.bat中-server选项对应:Java Virtual Matchine 
D:/Java/jdk1.6.0_03/jre/bin/server/jvm.dll 

这里的jvm.dll不是jre/bin/client/jvm.dll而是/jre/bin/server/jvm.dll(要安装JDK不是JRE) 
如果你不想提高tomcat的执行效率,你可以按默认的配置 



现在说明一个各个配置参数 

提示中给出了设置的参数: 

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M MyEclipse内存不足之JVM内存浅谈的几个问题: 

1. 各个参数的含义什么? 

2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 

3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 

下面我们就MyEclipse内存不足之JVM内存一一对一些概念进行回答 

1. 各个参数的含义什么? 

参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 

◆堆(Heap)和非堆(Non-heap)内存 

按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 

◆堆内存分配 

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 

◆非堆内存分配 

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。 

◆JVM内存限制(最大值) 

首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。 

2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 

通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因: 

1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize; 

2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。 

3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 

那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则: 

参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:/Java/jre1.6.0/bin/javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样: 

-vm   C:/Java/jre1.6.0/bin/javaw.exe 按照上面所说的,最后参数在eclipse.ini中可以写成这个样子: 

-vmargs   -Xms128M   -Xmx512M   -XX:PermSize=64M   -XX:MaxPermSize=128M 实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。 

另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的: 

-showsplash   org.eclipse.platform   --launcher.XXMaxPermSize   256m   -vmargs   -Xms40m   -Xmx256m 其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。

【教程4>第1章>第11节】使用MATLAB快速产生批量verilog语句加快FPGA开发 ...........如果手动写,那么就非常麻烦,这个时候,我们借助matlab,则可以快速生成上述类型的verilog程序,我们编写如下的MATLAB语句。\n");\n");end。 阅读详情

相关推荐

实用工具系列 - Xshell安装下载与使用

一、介绍 二、下载 三、安装 四、使用

Passerby_Wang的博客 1万+

JVM内存配置详解

本文转自:http://vanadiumlin.iteye.com/blog/1267857 JVM堆模型,GC算法 基本概念 堆/Heap  JVM管理的内存叫堆;在32Bit操作系统上有4G的限制,一般来说Windows下为2G,而Linux 下为3G;64Bit的就没有这个限制。  JVM初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1

fan510988896的博客 402

反激电源占空比为何必须小于0.5?次谐波振荡与斜坡补偿详解

在开关电源设计中,峰值电流模式控制因其优异的动态响应和逐周期限流保护而被广泛应用。其工作原理是通过采样电感电流的峰值,与误差电压比较来控制开关管的导通与关断。然而,这种控制方式在反激等隔离拓扑中,当占空比超过50%时,会面临一个固有的稳定性挑战——次谐波振荡。这是由于电流扰动会在相邻开关周期内被放大而非衰减,导致系统在开关频率一半处发生振荡,严重影响输出纹波和可靠性。为解决这一问题,工程上引入了斜坡补偿技术,通过向控制信号叠加一个固定斜率的斜坡,改变环路增益条件,从而在宽输入电压或高占空比需求下维持系统稳定

weixin_29631169的博客 623

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

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

一名蒟蒻的博客 1655

保姆级教程:在Ubuntu 22.04上用Conda搞定nuPlan数据集环境(Python 3.9 + PyTorch)

本文提供了一份详细的Ubuntu 22.04环境下使用Conda配置nuPlan自动驾驶数据集的保姆级教程,涵盖Python 3.9安装、Conda环境管理、PyTorch配置及数据集可视化验证等关键步骤,帮助开发者高效搭建开发环境。

weixin_29061997的博客 254

代号OneNET02 STM32+ESP8266 WIFI系列-第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级

第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级,这一节主要是实现通过OneNET OTA服务器将需要更新的程序远程下载到STM32单片机,这一节主要是引导程序和应用程序的讲解。

weixin_44862509的博客 1904

4g内存 堆内存分配多少_我需要多少内存

4g内存 堆内存分配多少 什么是保留堆? 我需要多少内存? 在构建解决方案,创建数据结构或选择算法时,您可能会问自己(或其他人)这个问题。 如果此图包含1,000,000条边并且我使用HashMap进行存储,此图是否适合我的3G堆? 构建我的自定义缓存解决方案时,我可以使用标准的Collections API还是它们带来的开销过多? 显然,简单问题的答案要复杂一些。 在这篇文章中,我们将对...

最佳 Java 编程 1133

Kalibr标定避坑指南:如何用AprilGrid板快速完成双目IMU标定

本文详细介绍了使用AprilGrid板进行Kalibr双目IMU联合标定的实战技巧,包括标定工具选型、数据采集优化、标定流程及结果验证。通过AprilGrid板的唯一标识性和抗遮挡优势,结合IMU静止标定和运动激励设计,显著提升标定精度。文章还提供了常见报错处理和高级优化技巧,帮助开发者高效完成传感器标定。

sunny的博客 282

JVM内存分配机制

Java虚拟机最重要的工作就是如何给对象分配内存空间,以及通过GC如何回收已经不再使用的内存空间。这篇文章主要介绍JVM中的Java对象是创建过程、对象内存的分配机制以及对象内存的回收机制。 一、对象的创建 在前面的文章《JVM类加载机制》中讲过,JVM中所有对象的创建,都需要先将对应的.class文件加载进内存,所以JVM中通常一个对象的创建包含了如下几个步骤: 1.1 检查类是否加载 当JVM执行到new字节码指令时,首先会去运行时常量池检查该指令指定的参数能够找到对应类的符号引用,并检查这个符号引用

sermonlizhi的博客 3781

ESP32-IDF开发之旅 基础篇⑨ ESP-IDF的FreeRTOS任务间通信和同步

本文介绍了FreeRTOS任务间通信中的队列机制,重点讲解了队列的创建、发送和接收数据的API使用方法。文章提供了详细的技术说明和示例代码,包括xQueueCreate、xQueueSend、xQueueReceive等核心函数的参数说明和返回值解释。通过一个2生产者+1消费者的实际案例,展示了如何在ESP-IDF环境下使用FreeRTOS队列实现任务间通信。示例中包含了数据发送失败处理和接收数据验证等实用技巧,为开发者提供了可参考的实现模式。

单片机菜鸟哥的博客 427

Oracle EBS 如何处理MMT表错误-WIP 实体未定义或不具有期间余额项

错误说明:WIP 实体未定义或不具有期间余额项。(The wip entity is either not defined or does not have a period balance entry)由于工单的创建日期为4月份,工单的余额表记录的期间是4月份,而3月份工单余额表中没有记录。公司将上一个新的库存组织,有一部分测试的工单创建日期在4月份,而工单的发放日期、发料事务处理日期和完工事务处理日期均在3月份。1、关闭3月份库存会计期,待定事务处理存在未计成本物料/WMS。成本类型: PAC成本。

陈显平的专栏-Oracle EBS 651

JVM的内存分配

JVM的内存分配与GC回收机制JVM内存分配元空间与方法区与永久代堆新生代老年代合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 JVM内存分配 JVM内存分为五部分:元空间(方法区)、堆、虚拟机栈、本地方法栈、程序计数器 元空间与方法区

weixin_51849480的博客 2583

107.在 Vue 3 中使用 OpenLayers 实现视图联动功能

是一个非常强大的 Web 地图渲染库,支持多种地图数据格式和交互操作。在 Vue 3 中,我们可以利用。绑定到真实的 DOM 元素上,我们就可以用它们来初始化 OpenLayers 地图。来封装和管理 OpenLayers 地图的状态,从而更高效地开发地图应用。,即两个地图窗口共享同一个视图(View),从而实现同步缩放、拖动等操作。这可以确保 Vue 组件销毁时,OpenLayers 也正确销毁地图实例。,并且它们会同步缩放和拖动,达到地图联动的效果。这样,无论你拖动哪个地图,另一个都会同步变化。

小彭的博客 1938

JVM内存分配详解

这节内容会详细讲源码怎么编译成字节码文件,类如何加载到jvm以及类在调用时如何在JVM中进行内存分配的。通常情况下,我们使用的编码工具idea会进行实时编译,不需要我们手动进行编译,当然,你也可以进行测试,使用javac自行进行编译,如下: javac [options] [sourcefiles] [classes] [@argfiles] -d:将所有生成的 .class 文件(包括包结构)输出到 D:\myproject\classes。 -cp:指定了依赖的第三方库的路径。lib/* 表示 lib

m0_68472894的博客 1222

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JVM内存分配机制详解

1. JVM内存分配机制(TODO) A a = new A()过程分为: 1. 类加载检查,如果加载过进行下一步,没有加载过使用类加载器加载类 2. 分配内存 3. 初始化 4. 设置对象头 5. 执行init方法 1.1 jvm分配内存 jvm分配内存方式: 1.指针碰撞:将一块内存分配为已使用和未使用,中间分配使用指针分隔,分配内存就是将指针移动到与对象大小相同的内存块处。 2.空闲列表:一般内存中可能有不相邻的内存块,虚拟机会维护一...

qq_21575929的博客 1731

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

TradingAgents-CN专栏 5714

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

详解JVM的内存分配策略

JVM的内存结构模型由方法区、堆、虚拟机栈、本地方法区和程序计数器五个部分组成,对象的生存和死亡,垃圾的收集和内存的分配策略,感觉都是一些很有趣的思想和设计。

林风自在 2386

JVM内存分配策略详解

所以,如果以后再有人问你:是不是所有的对象和数组都会在堆内存分配空间?那么你可以告诉他:不一定,随着JIT编译器的发展,在编译期间,如果JIT经过逃逸分析,发现有些对象没有逃逸出方法,那么有可能堆内存分配会被优化成栈内存分配。但是这也并不是绝对的。就像我们前面看到的一样,在开启逃逸分析之后,也并不是所有User对象都没有在堆上分配。

白话机器学习 190

Jvm内存分配与回收详解

MinorGC执行时从Eden区分配到Survivor区的时候,假设现在有多个对象需要移入,JVM会根据对象的年龄进行分组,并求出每个组的总和,然后每个年龄对象相加,如果相加结果大于Survivor区内存大小的50%,那么大于等于这批对象年龄最大值的对象就直接进入老年代;特点:是JVM采用的默认方式。通俗的讲,就是对象不会跳出出方法、作用域范围的对象,JVM会将这个对象直接分配到栈帧内存中,不会放到堆上,但是如果分配的对象的内存栈帧没有空间存放的情况下还是会分配到堆上;这个参数单位是“字节”

weixin_73412838的博客 1067

第10课:jvm的gc中关于对象的age问题以及jvm的内存分配策略彻底详解

内容:     1.对象的Age的问题     2.JVM的内存分配策略 一、JVM内存结构图 二、对象的Age的问题以及内存分配策略 详细文章:JVM的内存分配策略     1.Eden中比较频繁的GC,每次GC都会导致内存分布的变化。对象的计数器:对象的Age是标记的关键。年轻代的GC又叫minor GC。对象GC年龄阈值默认是15。每次GC后还存活就将对象Age加1。     2....

someby的博客 499

JVM内存分配与管理详解

概述 了解C++的程序员都知道,在内存管理领域,都是由程序员维护与管理,程序员用于最高的管理权限,但对于java程序员来说,在内存管理领域,程序员不必去关心内存的分配以及回收,在jvm自动内存管理机制的帮助下,不需要想C++一样为每一个new操作去编写delete/free代码,这一切交给jvm,但正是这一切都交给了jvm,一旦出现内存泄漏与溢出,如果不了jvm,那么对于程序的编写与调试将会非常

不清不慎的博客 1万+
上一篇: Tomcat启动内存设置
下一篇: 一个Socket连接管理器(心跳机制)
java85140031
博客等级 码龄18年 34粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值