当堆没有足够的内存来创建新对象时会发生OutOfMemoryError
。如果堆没有足够的内存,则创建对象的位置在哪里。我想了解这一点,请告知。Java中创建的OutOfMemoryError对象在哪里
5
A
回答
4
6
当然,这是一个依赖于实现的行为。 HotSpot有一些堆内存不能用于普通的分配,JVM可以用来构造一个OutOfMemoryError
英寸。但是,由于Java允许任意数量的线程,任意数量的线程可能同时撞墙,所以没有保证该存储器足够用于为它们中的每一个构建不同的OutOfMemoryError
实例。
因此,在贯穿整个会话的JVM启动时创建一个紧急情况OutOfMemoryError
实例,以确保即使没有剩余内存也能抛出错误。因为所有遇到错误的线程都会共享实例,而实际上没有剩余内存,所以您将通过这个错误将没有堆栈跟踪的事实来识别这个无关的条件。
下面的程序jdk1.8.0_65
下运行与-Xmx100M
ConcurrentHashMap<OutOfMemoryError,Integer> instances = new ConcurrentHashMap<>();
ExecutorService executor = Executors.newCachedThreadPool();
executor.invokeAll(Collections.nCopies(1000,() -> {
ArrayList<Object> list = new ArrayList<>();
for(;;) try {
list.add(new int[10_000_000]);
} catch(OutOfMemoryError err) {
instances.merge(err, 1, Integer::sum);
return err;
}
}));
executor.shutdown();
System.out.println(instances.size()+" distinct errors created");
instances.forEach((err,count) -> {
StackTraceElement[] trace = err.getStackTrace();
System.out.println(err.getClass().getName()+"@"+Integer.toHexString(err.hashCode())
+(trace!=null&&trace.length!=0? " has": " has no")+" stacktrace, used "+count+'x');
});
,等待半分钟给我
5 distinct errors created
[email protected] has no stacktrace, used 996x
[email protected] has stacktrace, used 1x
[email protected] has stacktrace, used 1x
[email protected] has stacktrace, used 1x
[email protected] has stacktrace, used 1x
表示保留的内存可以成为四个不同OutOfMemoryError
实例的建设(包括内存需要记录他们的堆栈跟踪),而所有其他线程必须回退到保留的共享实例。
当然,不同环境下的数字可能会有所不同。
+0
非常有趣,我不知道这个 – Eugene
相关问题
- 1. Stringbuilder对象在哪里创建?
- 2. Rails在哪里创建:通过对象
- 3. DDD:在哪里创建实体对象?
- 4. 在类中创建对象 - 该对象在哪里?
- 5. java,swing;简单的gui在哪里创建对象
- 6. 在onCreate(Bundle savedInstanceState)中创建的Bundle对象在哪里
- 7. .Net中创建的内存不足异常对象在哪里?
- 8. 在java中创建对象
- 9. 在哪里创建HibernateUtil实例Java Servlet
- 10. 创建对象的Java中
- 11. 这个Swift函数创建的对象在哪里?
- 12. 在哪里删除工厂创建的对象?
- 13. 在OutOfMemoryError(Java)之前计算对象
- 14. 存储在Java中的对象的条目数在哪里
- 15. Java在对象内创建对象
- 16. 在java中创建对象的位置
- 17. 在java中创建对象的麻烦
- 18. 在Java中创建对象的数组
- 19. 在Java中创建对象的列表
- 20. 在Java中的OOP - 创建对象
- 21. 新操作符在哪里创建新对象?
- 22. 在哪里创建自定义IPrincipal对象?
- 23. 创建线程对象在哪里?堆栈还是堆?
- 24. C++ stl for_each()和functor,它在哪里创建新对象
- 25. 我应该在哪里创建对象?库?厂?
- 26. 我应该在哪里创建一个对象?
- 27. 我应该在哪里创建实体对象?
- 28. 对象创建JAVA
- 29. C++中抛出的对象在哪里?
- 30. UserPrincipal对象中的域名在哪里?
优秀的面试问题国际海事组织 - 但我会失败。感谢您发布它 – Eugene