< prev index next >

src/java.base/share/classes/jdk/internal/util/ArraysSupport.java

Print this page
rev 54801 : [mq]: 8223593-Refactor-code-for-reallocating-storage

*** 1,7 **** /* ! * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 26,36 **** import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.misc.Unsafe; /** ! * Utility methods to find a mismatch between two primitive arrays. * * <p>Array equality and lexicographical comparison can be built on top of * array mismatch functionality. * * <p>The mismatch method implementation, {@link #vectorizedMismatch}, leverages --- 26,38 ---- import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.misc.Unsafe; /** ! * Utility methods to work with arrays. This includes a set of methods ! * to find a mismatch between two primitive arrays. Also included is ! * a method to calculate the new size of an array to be reallocated * * <p>Array equality and lexicographical comparison can be built on top of * array mismatch functionality. * * <p>The mismatch method implementation, {@link #vectorizedMismatch}, leverages
*** 569,574 **** --- 571,621 ---- } } return -1; } + + /** + * The maximum size of array to allocate (unless necessary). + * Some VMs reserve some header words in an array. + * Attempts to allocate larger arrays may result in + * OutOfMemoryError: Requested array size exceeds VM limit + */ + public static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + /** + * Calculates new size of an array to be reallocated. + * + * The result will be at least {@code X = oldCapacity + growAtLeastBy}. + * The result can be greater (normally, up to + * {@code oldCapacity + preferredGrowBy}). + * This function will not return values greater than + * {@link #MAX_ARRAY_SIZE} unless the minimum required size + * {@code X} is greater. + * + * @param oldCapacity current size of the array (must be non negative) + * @param growAtLeastBy minimum required growth of the array size (must + be positive) + * @param preferredGrowBy preferred growth of the array size + * @return the new size of the array + * @throws OutOfMemoryError if increasing {@code oldCapacity) by + * {@code growAtLeastBy} overflows. + */ + public static int newCapacity(int oldCapacity, + int growAtLeastBy, + int preferredGrowBy) { + // assert oldCapacity >= 0 + // assert growAtLeastBy > 0 + + int newCapacity = oldCapacity + Math.max(growAtLeastBy, preferredGrowBy); + return (newCapacity - MAX_ARRAY_SIZE > 0) + ? hugeCapacity(oldCapacity + growAtLeastBy) : newCapacity; + } + + private static int hugeCapacity(int minCapacity) { + if (minCapacity < 0) { // overflow + throw new OutOfMemoryError("Required array size too large"); + } + return (minCapacity > MAX_ARRAY_SIZE) + ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; + } }
< prev index next >