当前位置: 首页 > 面试题库 >

无论内存需求多大,有没有办法强制JVM使用swap?

养学
2023-03-14
问题内容

这是我的情况:我手头的一项任务需要大量内存。我没有足够的内存,无论我尝试什么(使用/
3gb开关的Jrockit等),我都不能给JVM足够的内存,并且操作因异常而终止,告诉我我需要更多的堆空间。

有什么方法可以强制JVM使用操作系统的交换机制,以使其不会耗尽内存?这是Windows XP 32位

这将花费很多时间,但是我不在乎,我只需要完成此操作即可。

我用完了所有选项,并且无法控制此处的任何变量。

这是必需的编辑,因为几乎每个人都对我有同样的答复:)这不是我的代码。有人编写了将XML文件读入存储库的工具。该工具使用EMF,并立即加载整个模型。我所能做的就是向它提供XML文件。如果本机代码在Windows或Linux等下运行,则OS使用虚拟内存/交换空间为其提供内存,而应用程序对此一无所知。我想知道是否可以对JVM执行相同操作。在Windows
32位下,-Xmx可以增加一定数量,但这还不够。目前,外出购买新硬件对我来说不是一种选择。所以我想知道是否有可能使JVM像本机进程一样工作。速度慢,但仍在工作。显然这是不可能的,我很不走运。我只需要知道我是否


问题答案:

显然,有一种方法可以绕过Java堆的限制。它甚至用在名为BigMemory的商业产品中,该产品基本上可以通过透明地换成OS交换和/或磁盘(如果需要)来拥有几乎无限的内存。

这个想法是使用direct
ByteBuffer来存储对象数据。因为直接字节缓冲区的内容存储在本机进程内存(而不是堆)中,所以您可以依靠OS交换机制为您交换内存。我在这个网站上找到了这个(在页面上搜索“ direct byte buffer”)。

这是实现它的方法(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对象,data哈希映射和keys将在堆中,但这不会占用太多内存。



 类似资料:
  • 问题内容: 我有一个方法返回基类的集合: 由于()的返回类型与方法()的返回类型不匹配,因此无法编译。我理解为什么会这样:由于泛型类型不同,所以两个类之间没有继承关系。 有很多方法可以解决编译器错误,从将方法的返回类型更改为不使用Arrays.asList并将派生对象之一转换为Base。 当解析Arrays.asList调用的通用类型时,有没有办法告诉编译器使用其他但兼容的类型?(我一直在尝试使用

  • 我改进了代码,以便从垃圾收集器中获得更好的结果。 现在,当我调用时,它确实释放了所有内存。但是,当我在不调用 的情况下观察内存使用情况时,应用程序确实会保留并使用越来越多的内存。 这是否意味着我的改进正在起作用,我的所有引用都是正确的,我可以忽略JVM是如何自己释放内存的。或者,我的代码中是否存在其他问题,这些问题是JVM在不运行垃圾收集器的情况下保留更多内存的原因。

  • 本文向大家介绍jvm最大内存限制多少?相关面试题,主要包含被问及jvm最大内存限制多少?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JVM (1)堆内存分配 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小 于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到

  • 问题内容: 当我们在程序中启动线程时,是否有任何方法可以为每个线程分配内存限制? 我的意思是我们为新流程分配了以下内容: 我们可以用Java线程做任何类似的事情吗? 基本上,我的每个线程都将执行某项任务,我希望对每个线程的内存使用量设置一些最大限制。 问题答案: 我们可以用Java线程做任何类似的事情吗? 不能。进程中的线程通常用于访问进程(在本例中为JVM)中的共享主内存。 基本上,我的每个线程

  • 我想在PyCharm中为我的Python 3项目输出。有什么想法吗?

  • 问题内容: 我正在尝试使用Swift(不是Xcode项目)编写脚本。需要明确的是,我文件的第一行是 我只是从命令行调用它。 但是,我无法弄清楚该脚本如何使用另一个.swift文件中的代码。它不会从同一目录中拾取它,而且我看不到任何方法。 支持吗? 问题答案: 有更好的方法! 如果您要从中导入文件,将像: