Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hazelcast endup堆空间内存不足错误,即使已分配8GB空间_Java_Hazelcast - Fatal编程技术网

Java Hazelcast endup堆空间内存不足错误,即使已分配8GB空间

Java Hazelcast endup堆空间内存不足错误,即使已分配8GB空间,java,hazelcast,Java,Hazelcast,在我的项目中,我有一个要求,将900万数据从oracle数据库缓存到Hazelcast,但显然Hazelcast消耗的堆空间比预期的要多。我已经为应用程序分配了8bg heapspace,但仍然出现内存不足错误 下面是我的数据加载器类 public class CustomerProfileLoader implements ApplicationContextAware, MapLoader<Long, CustomerProfile> { private static Cus

在我的项目中,我有一个要求,将900万数据从oracle数据库缓存到Hazelcast,但显然Hazelcast消耗的堆空间比预期的要多。我已经为应用程序分配了8bg heapspace,但仍然出现内存不足错误

下面是我的数据加载器类

public class CustomerProfileLoader  implements ApplicationContextAware, MapLoader<Long, CustomerProfile> {

private static CustomerProfileRepository customerProfileRepository;

    @Override
    public CustomerProfile load(Long key) {
        log.info("load({})", key);
        return customerProfileRepository.findById(key).get();
    }

    @Override
    public Map<Long, CustomerProfile> loadAll(Collection<Long> keys) {
        log.info("load all in loader executed");
        Map<Long, CustomerProfile> result = new HashMap<>();
        for (Long key : keys) {
            CustomerProfile customerProfile = this.load(key);
            if (customerProfile != null) {
                result.put(key, customerProfile);
            }
        }
        return result;
    }

   @Override
    public Iterable<Long> loadAllKeys() {

        log.info("Find all keys in loader executed");

        return customerProfileRepository.findAllId();
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        customerProfileRepository = applicationContext.getBean(CustomerProfileRepository.class);
    }
}
数据库表结构:

其他要点:

我现在只有一个hazelcast服务器实例在运行,其中 将heapspace分配为8GB JAVA_OPTS=-Xmx8192m。在4gb之前 但当我得到heapspace错误时,我增加到8GB,但运气不好。 目前,maploader是在访问 第一次。 特定的表customer_profile中有6列 它没有任何二进制类型。它只有基本的价值观,比如 姓姓有点像。 使用的hazelcast版本为3.8 我现在面临的问题是:

我得到了heapspace errorjava.lang.OutOfMemoryError:Java堆空间,当它获取所有数据并将其加载到映射时。现在表中有900万个数据

此外,加载数据需要花费大量的时间,也许我可以通过运行多个hazelcast服务器实例来解决这个问题


我是hazelcast的新手,因此非常感谢您的帮助:

我觉得真正的问题是8GB堆中的数据太多了

您说每行平均有100字节的数据,表示为字符串数据

以下是将9000000行数据表示为HashMap所需空间的一些估计值1。假设有9个字符串、2个日期和一个int

在64位JVM中,字符串的开销为每个字符48字节+2字节。因此,9个Java字符串表示大约100字节的字符数据,大约相当于650字节。 日期是32字节x2->64字节 表示9个字符串、2个日期和1个整数的记录将为112字节。 一个键表示一个整数是24字节。 HashMap条目将为40字节。 650+64+112+24+40 x 9000000->~800000000字节 HashMap的主数组将为2^24 x 8字节==~128000000字节 正如您所能看到的那样,实际数据超过8GB。然后考虑Java堆需要相当多的工作空间这一事实;至少30%

这一点都不奇怪,你得到的是OOMEs。我估计你的堆需要大50%。。。这假设您对每行100字节的估计是准确的

这完全基于loadAll方法,该方法似乎将数据库中的所有行具体化为常规HashMap。它不考虑Hazelcast用于缓存的堆空间或其他内存

虽然您可以只扩展堆,但我认为更改代码使其不会像那样具体化行更有意义。目前尚不清楚这是否有意义。这将取决于地图的使用方式


1-我假设您使用的是Java 8。

我觉得真正的问题是8GB堆中的数据太多了

您说每行平均有100字节的数据,表示为字符串数据

以下是将9000000行数据表示为HashMap所需空间的一些估计值1。假设有9个字符串、2个日期和一个int

在64位JVM中,字符串的开销为每个字符48字节+2字节。因此,9个Java字符串表示大约100字节的字符数据,大约相当于650字节。 日期是32字节x2->64字节 表示9个字符串、2个日期和1个整数的记录将为112字节。 一个键表示一个整数是24字节。 HashMap条目将为40字节。 650+64+112+24+40 x 9000000->~800000000字节 HashMap的主数组将为2^24 x 8字节==~128000000字节 正如您所能看到的那样,实际数据超过8GB。然后考虑Java堆需要相当多的工作空间这一事实;至少30%

这一点都不奇怪,你得到的是OOMEs。我估计你的堆需要大50%。。。这假设您对每行100字节的估计是准确的

这完全基于loadAll方法,该方法似乎将数据库中的所有行具体化为常规HashMap。它不考虑Hazelcast用于缓存的堆空间或其他内存

虽然您可以只扩展堆,但我认为更改代码使其不会像那样具体化行更有意义。目前尚不清楚这是否有意义。这将取决于地图的使用方式


1-我假设您使用的是Java 8。

该表中行的平均大小是多少?@StephenC大约100字节100字节表示为什么?@StephenC。你是说列的数据类型吗?@StephenC我在问题中也添加了数据库表结构。在这个问题中,一行的平均大小是多少
在table?@StephenC中,大约100字节100字节表示为什么?@StephenC。你是说列的数据类型吗?@StephenC我在问题中也添加了数据库表结构。
 @Query("SELECT b.id FROM CustomerProfile b ")
    Iterable<Long> findAllId();
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast
        xsi:schemaLocation="http://www.hazelcast.com/schema/config
        http://www.hazelcast.com/schema/config/hazelcast-config-3.11.xsd"
        xmlns="http://www.hazelcast.com/schema/config"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <!-- Use port 5701 and upwards on this machine one for cluster members -->

    <network>
        <port auto-increment="true">5701</port>

        <join>
            <multicast enabled="false"/>
            <tcp-ip enabled="true">
                <interface>127.0.0.1</interface>
            </tcp-ip>
        </join>
    </network>

    <map name="com.sample.hazelcast.domain.CustomerProfile">
        <indexes>
            <!-- custom attribute without an extraction parameter -->
            <index ordered="false">postalCode</index>
        </indexes>
        <backup-count>0</backup-count>
        <map-store enabled="true" initial-mode="EAGER">
            <class-name>com.sample.hazelcast.CustomerProfileLoader</class-name>
        </map-store>
    </map>
</hazelcast>
ID                   NOT NULL NUMBER(19)        
LOGIN_ID       NOT NULL VARCHAR2(32 CHAR) 
FIRSTNAME              VARCHAR2(50 CHAR) 
LASTNAME               VARCHAR2(50 CHAR) 
ADDRESS_LINE1          VARCHAR2(50 CHAR) 
ADDRESS_LINE2          VARCHAR2(50 CHAR) 
CITY                    VARCHAR2(30 CHAR) 
postal_code                VARCHAR2(20 CHAR) 
COUNTRY                 VARCHAR2(30 CHAR) 
CREATION_DATE  NOT NULL DATE              
UPDATED_DATE   NOT NULL DATE              
REGISTER_NUM          NOT NULL VARCHAR2(10 CHAR)