今天我在玩 OOM 错误,我发现了一些我自己无法解释的东西。
我尝试分配一个大于堆的数组,预期会出现“请求的数组大小超出 VM 限制”错误,但我收到了“ Java 堆空间”错误。
根据JDK 11 文档“3 Troubleshoot Memory Leaks > 了解 OutOfMemoryError 异常”:
线程 thread_name 中的异常:java.lang.OutOfMemoryError:请求的数组大小超出 VM 限制
原因:详细消息“请求的数组大小超出 VM 限制”表明应用程序(或该应用程序使用的 API)试图分配大于堆大小的数组。例如,如果应用程序尝试分配 512 MB 的数组,但最大堆大小为 256 MB,则将抛出 OutOfMemoryError,原因是“请求的数组大小超出 VM 限制”。
代码 :
public class MemOverflow {
public static void main(final String[] args) {
System.out.println("Heap max size: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");
long[] array = new long[100_000_000]; // ~800MB
System.out.println(array.length);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码按预期工作,堆足够大以存储我的数组:
$ javac MemOverflow.java && …Run Code Online (Sandbox Code Playgroud) 我目前正在研究WPF应用程序,但我找不到如何全屏显示我的应用程序.我正在使用MahApps.Metro,所以我的主窗口类型是Controls.MetroWindow.
我试过这个:
<Controls:MetroWindow x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:Views="clr-namespace:MyProject.Views"
WindowStyle="None"
ResizeMode="NoResize"
WindowState="Maximized"
Title="MyProject">
Run Code Online (Sandbox Code Playgroud)
但它不会隐藏Windows任务栏.但是当我使用一个简单的Window时,它可以工作.我看了一下MetroWindow的源代码,它继承了Window类,所以我不明白为什么它不起作用.
我发现使用Metro的全屏窗口的唯一方法是将IgnoreTaskbarOnMaximize属性设置为true并删除ResizeMode ="NoResize"(请参阅下面的代码),运行应用程序并最大化它.
<Controls:MetroWindow x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:Views="clr-namespace:MyProject.Views"
WindowStyle="None"
IgnoreTaskbarOnMaximize="True"
Title="MyProject">
Run Code Online (Sandbox Code Playgroud)
但是我想隐藏最小化和最大化按钮..你有什么想法全屏启动Controls.MetroWindow吗?