这是我的情况:我手头的任务需要大量的记忆.我没有足够的RAM,不管我试过什么(Jrockit / 3gb开关等),我不能给JVM足够的ram,并且操作被异常终止,告诉我需要更多的堆空间.

有没有办法强制JVM使用操作系统的交换机制,以免内存不足?这是Windows xp 32位

这将需要年龄,但我不在乎,我只需要这个操作即可完成.

我已经用完了选项,我无法控制任何变量.

这是一个必需的编辑,因为我从几乎所有人都得到相同的回应:)
这不是我的代码.有人写了一个工具,将xml文件读入存储库.该工具使用EMF,并一次加载整个模型.我所能做的就是将它提供给XML文件.
在Windows或Linux等运行本机代码的情况下,操作系统会使用虚拟内存/交换空间为其提供内存,并且应用程序不了解它.
我想知道是否可以对JVM做同样的事情.在Windows 32位下,-Xmx可以达到一定的数量,但这还不够.
出门购买新硬件目前不是我的选择.所以我想知道是否可以使JVM像本地进程一样工作.慢,但仍在工作.
显然这是不可能的,我没有运气.我只需要知道我是否真的出于选择.

解决方法

显然,Java堆的限制有一个方法.它甚至用于名为 BigMemory的商业产品,它基本上允许您通过透明地交换到OS交换和/或磁盘(如果需要)具有几乎无限的内存.

这个想法是使用直接的ByteBuffers来存储你的对象数据.因为直接字节缓冲区的内容存储在本地进程内存(而不是堆)中,您可以依靠操作系统交换机制为您交换内存.我在this website发现了这个(在页面上搜索’直接字节缓冲区’).

这是你如何实现它(java-pseudo-code’ish):

class NativeMemoryCache{
  private Map<Object,ByteBuffer> data = new HashMap<...>();

  public void put(Object key,Serializable object){
    byte[] bytes = serialize(object);
    //allocate native memory to store our object
    ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length);
    buf.put(bytes);
    buf.flip();
    data.put(key,buf);
  }

  public Object get(Object key){
    ByteBuffer buf = data.get(key).duplicate();
    byte[] bytes = new byte[buf.remaining()];
    buf.get(bytes);
    return deserialize(bytes);
  }

  private byte[] serialize(Object obj){ ... }
  private Object deserialize(byte[] bytes){ ... }
}

希望你能得到这个想法.你只需要实现序列化(你也可以使用zip压缩你的对象,如果你有很少的大对象,特别是包含可拉链数据,如字符串),这将是有效的.

当然NativeMemoryCache对象,数据哈希映射和密钥将在堆中,但这不应该占用很多内存.

java – 有没有办法强制JVM使用交换,无论内存要求有多大?的更多相关文章

  1. swift 下 UNcode字符串 转为中文字符

    顺便一提,1F436这个16进制数,也能直接通过UnicodeScalar转换成字符串,就像下面这样DOGFACE

  2. Swift学习第十三枪-使用Swift开发IOS中蓝牙4.0的开发流程

    前面总结了几篇关于Swift的使用,今天要讲的是关于使用Swift开发IOS中蓝牙4.0的开发流程,我以前只是会搞android的蓝牙开发,最近开始了Swift的学习,作为一个swift爱好者,想把蓝牙4.0的这个装逼神器在swift中使用一下。使用Swift开发IOS中蓝牙4.0的开发流程有如下的几个步骤:建立桥接文件案例的实现1.建立桥接文件1.1在用Swift使用OC中得类文件的时候,需要进行桥接,首先建一个.h的头文件。

  3. 往返Swift数字类型到/从数据

    Swift3倾向于Data而不是[UInt8],我试图找出最有效/惯用的编码/解码方式,将各种数字类型转换为Data对象。有thisanswerforusing[UInt8],但似乎使用各种指针API,我不能在数据上找到。在早期的Swift版本中,你可以通过做函数参数本身是一个变量,这不再支持了。>最后声明符合所有类型,可以安全地转换为数据并返回:这使得转换更加优雅:第二种方法的优点是,您不能无意中执行不安全的转化。缺点是你必须显式列出所有“安全”类型。

  4. 在Swift中将两个字节的UInt8数组转换为UInt16

    使用Swift我想将字节从uint8_t数组转换为整数。“C”示例:Swift尝试:从Swift中的UInt8数组创建UInt16值的正确语法或代码是什么?我对NSData版本感兴趣,并且正在寻找一个不使用临时数组的解决方案。如果你想通过NSData去,那么它将像这样工作:或者:两种变体都假定字节是主机字节顺序。

  5. 如何在swift中将Int16转换为两个UInt8字节

    我有一些二进制数据,将两个字节的值编码为有符号整数.解码这很简单–我可以从这些字节中提取Int16值:编码这是我遇到问题的地方.我的大多数数据规范都要求使用UInt,这很简单,但我无法提取组成Int16的两个字节题如何提取构成Int16值的两个字节你应该使用无符号整数:如果您想将UInt16转换为等效的Int16,那么您可以使用特定的初始化程序:反之亦然:在你的情况下:

  6. Swift 3中的数据MD5

    我正在尝试获取我的数据的MD5哈希值.不幸的是,我已经将框架升级到swift3,而我一直使用的方法现在不起作用.我已经转换了大部分内容,但我无法从数据中获取字节数:CommonCrypto已作为自定义模块导入.问题是我得到’字节’不可用:在CC_MD5上使用withUnsafeBytes(data.bytes,…

  7. 使用Swift从NSData获取数据

    2)文档说这个参数应该是_buffer:UnsafeMutablePointer.那么这是如何工作的呢?为什么我要这样做而不是更原生/托管[Uint8]构造?我想知道UnsafeMutablePointer是否是一个协议,但它是一个结构.大胆地直接读取值,我想也许我可以尝试另一种结构.我有一个6字节的结构,看起来像:哪个实际上有效!但这让我担心结构包装细节?

  8. 如何在Swift中创建打包数据结构?

    我正在将一个项目从Objective-C转换为Swift,我正在使用一个打包的结构来输入通过套接字发送的转换二进制消息:我不确定Swift中最好的方法是什么,我能得到的最接近的近似值是:翻译中丢失了两个重要的细节:没有保证整数类型的比特,并且没有结构打包.我不认为这可以在Swift中表达,但如果是这样,怎么样?

  9. android – 基于JVM的语言,没有语言运行时

    ProGuard可以删除特定程序中未使用的部分运行时.如果速度和时间非常关键,另一种方法是使用NDK.

  10. 如何解码base64字符串并将其转换为pdf / jpg并将其保存在存储中

    谢谢大家=)解决方法你可以试试这个:哪里:>filepath:新文件的路径>base64String:您要转换的base64字符串

随机推荐

  1. 使用序列化将对象传递给另一个JVM – 相同的Java版本和jar(都运行我们的应用程序)

    但是想使用纯序列化到bytearray然后进行编码,将它从jvm1中的servlet1发送到jvm2中的servlet2局域网,在两个J2EE应用程序中设置相同的Java版本和jar)基本步骤是:–>将任何Serializable对象序列化为字节数组并生成字符串.确切的代码见下文>Base64输出1.是否需要基于64或可以跳过第2步?

  2. 所有JVM /系统中的Java,Object.hashCode()结果常量?

    Object.hashCode()的输出是否必须在同一个对象的所有JVM实现上相同?例如,如果“test”.hashCode()在1.4上返回1,它是否可能在1.6上返回2.或者如果操作系统不同,或者实例之间存在不同的处理器架构,该怎么办?

  3. Clojure的STM模型可以在多个JVM上运行吗?

    我知道Clojure在多核计算机上运行良好,但我想知道它是否适用于在多台计算机上分布的JVM集群?

  4. java – 加载时出现Eclipse jvm.dll错误

    解决方法按照评论中的要求.您的eclipse版本正在搜索jdk的x86版本.您应该检查您的eclipse是否是64位版本,如果没有,切换到64位jvm.

  5. java – 什么JVM优化导致这些性能结果?

    执行JavaREST服务性能测试我看到一个意外的模式:在每次调用中创建并返回相同值对象的方法比仅返回存储在类或对象字段中的值对象的另一个版本运行得更快.码:字节代码:>内联(更快):getstatic,invokestatic,invokevirtual,areturn>静态归档(较慢):getstatic,areturn>对象字段(较慢):aload,getfield,areturn性能(使用A

  6. java – JVM是否有计划在运行时支持泛型?

    你知道,就像CLR一样.有人甚至承认缺乏运行时通用信息是一个问题,并努力解决它?解决方法Java的设计者选择此解决方案来保持向后兼容性.从那时起,存在更多的Java代码,因此破坏向后兼容性会产生更糟糕的后果.所以我怀疑他们会改变他们的想法.

  7. 如何为多个jvm支持创建单例java类?

    任何想法,如何实现?

  8. java – 强制jvm返回本机内存

    参见英文答案>JVMsendingbackmemorytoOS3个我不时在需要大量内存的eclipse任务中运行.所以jvm在任务运行时吞下大约2-3GB的RAM,没关系.但是一旦jvm占用了那个内存它就不会释放它而且我有一种情况,当堆中使用的内存大约是200mb,总堆大小约为3gb时,这真的是不需要的,因为其他程序正在挨饿.我尝试了Max/MinHeapFreeRatio参数来强制jvm减少未使

  9. java – 获取给定JVM实例中所有当前加载的类的列表

    知道给定JVM实例当前加载哪些类是很方便的.例如,有没有办法让他们通过JVisualVM?

  10. java – JVM Spec,JVM Implementation,JVM Runtime之间的区别

    我读了以下几个字,但我想知道它们之间的差异……JVM规范,JVM实现,JVM运行时解决方法JVMSpec:描述JVM应如何表现的文档.JVM实现:基于JVMSpec的JVM实现.JVM运行时:JVM实现的一个实例.

返回
顶部