java8 metaspace issue

Bengt Rutisson bengt.rutisson at oracle.com
Tue May 5 09:05:11 UTC 2015


Hi Brian,

On 2015-05-05 05:17, Brian Harris wrote:
> Hi,
>
> I find that this code crashes in 8u40 after getting up to about 900 
> when run with -XX:MaxMetaspaceSize=10m. When run in 7u60 with 
> -XX:MaxPermSize=10m it does not crash.

Thanks for providing the example program. For me it does not crash but 
if I run with -XX:MaxMetaspaceSize=10m I get an OutOfMemoryError. Does 
it crash for you?

The OutOfMemoryError can be explained by the fact that when you run with 
-XX:MaxPermSize=10m there is some aligning going on and in the end you 
actually end up with a perm gen that is 20m large. Here's what I get 
when I use

$ java -XX:+PrintGCDetails  -XX:MaxPermSize=10m

Heap
  PSYoungGen      total 150528K, used 10363K [0x0000000758c80000, 
0x0000000763400000, 0x0000000800000000)
   eden space 129536K, 8% used 
[0x0000000758c80000,0x000000075969ed58,0x0000000760b00000)
   from space 20992K, 0% used 
[0x0000000761f80000,0x0000000761f80000,0x0000000763400000)
   to   space 20992K, 0% used 
[0x0000000760b00000,0x0000000760b00000,0x0000000761f80000)
  ParOldGen       total 342016K, used 0K [0x000000060a600000, 
0x000000061f400000, 0x0000000758c80000)
   object space 342016K, 0% used 
[0x000000060a600000,0x000000060a600000,0x000000061f400000)
  PSPermGen       total 20480K, used 3382K [0x0000000609200000, 
0x000000060a600000, 0x000000060a600000)
   object space 20480K, 16% used 
[0x0000000609200000,0x000000060954dae0,0x000000060a600000)

As you can see the perm gen is 20 m even though I specified 10m on the 
command line.

If I run your program with -XX:MaxMetaspaceSize=20m it passes and does 
not run out of memory.


There are no guarantees that you can always just replace MaxPermSize 
with MaxMetaspaceSize. Often it works, but sometimes you have to adjust 
the values. Especially at boundary cases as low as 10m.

Hths,
Bengt


>
> Is that expected? It seems similar to 
> https://bugs.openjdk.java.net/browse/JDK-8025635
>
> Thanks,
> Brian
>
> // uses Guava's CacheBuilder
> public class Main {
>     public static void main(String[] args) throws Exception {
>         Cache<Integer, Object> cache = CacheBuilder.newBuilder()
>                 .softValues()
>                 .build();
>         for (int i = 0; i < 50_000; i++) {
>             URL[] dummyUrls = {new URL("file:" + i + ".jar")};
>             URLClassLoader cl = new URLClassLoader(dummyUrls, 
> Thread.currentThread().getContextClassLoader());
>             Object proxy = Proxy.newProxyInstance(cl, new 
> Class[]{Foo.class}, new InvocationHandler() {
>                 @Override
>                 public Object invoke(Object proxy, Method method, 
> Object[] args) throws Throwable {
>                     return null;
>                 }
>             });
>             cache.put(i, proxy);
>             System.out.println(i);
>         }
>     }
>     public interface Foo {
>             void x();
>     }
> }
>
>
> _______________________________________________
> hotspot-gc-use mailing list
> hotspot-gc-use at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-gc-use/attachments/20150505/38ec9410/attachment.html>


More information about the hotspot-gc-use mailing list