如果我从Java命令行中省略-Xmxn选项,则使用默认值.根据Java文档 "默认值是在运行时根据系统配置选择的".
哪些系统配置设置会影响默认值?
我已经在我的Android eclipse项目中添加了一个2.45mb的 jar文件,现在我继续得到"转换为Dalvik格式失败:无法执行dex:Java堆空间",无论我做什么.
我已经在线研究,并被告知更新我的eclipse.ini以增加我的Java VM堆积.我已经为eclipse.ini中的所有值完成了这个,我继续得到构建错误.
有任何想法吗?
Maven项目的导入以
Exception java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
MAVEN_OPTS = -Xmx1g.-Xmx1g通过设置 - >构建工具 - > Maven - > Runner 添加到Maven VM选项.没有成功.我还可以做些什么?
我想做的就是找到任何给定字符串的情绪(正/负/中性).在研究中,我遇到了斯坦福NLP.但遗憾的是它在Java中.关于如何让它适用于python的任何想法?
而在一般情况,是用于单位-Xmx,-Xms和-Xmn选项("K","M"和"G",或不太标准的可能性"K","m"或"G")的二进制前缀倍数(即,功率1024),还是1000的力量?
手册说它们代表千字节(kB),兆字节(MB)和千兆字节(GB),表明它们是原始SI系统中定义的1000的幂.我的非正式测试(我不是很自信)表明他们真的是kibibytes(kiB),mebibytes(MiB)和gibibytes(GiB),所有权力都是1024.
哪个是对的?例如,什么Java代码会显示当前大小?
使用1024的倍数对于RAM大小来说并不奇怪,因为RAM通常通过加倍硬件模块来物理布局.但是,随着我们获得越来越大的权力,以明确和标准的方式使用单位变得越来越重要,因为混乱的可能性会增加.单位"t"也被我的JVM接受,1 TiB比1 TB大10%.
注意:如果这些确实是二进制倍数,我建议更新文档和用户界面以非常清楚,例如" 附加字母k或K表示kibibytes(1024字节)"或m或M表示mebibytes( 1048576字节) ".这就是采用的方法,例如在Ubuntu:UnitsPolicy - Ubuntu Wiki中.
注意:有关选项用途的更多信息,请参阅例如java - 启动JVM时Xms和Xmx参数是什么?.
我真的很困惑.
Xmx根据java文档,是允许的最大堆大小.
Xms是所需的最小Java堆大小,并在JVM启动时分配.
在32位JVM(4GB内存)上,java -Xmx1536M HelloWorld给出了一个无法分配足够内存错误的内容.
在64位JVM(4GB Ram)上,java -Xmx20G HelloWorld工作正常.但我甚至没有分配那么多的虚拟或物理内存.
因此,我得出结论,Java 32位在JVM启动时分配1536M,但Java 64位不是.
为什么?一个简单的Hello World不需要运行1536M.我只是指定1536M是最大值,而不是它需要的.
有人解释吗?
当我在IntelliJ中以调试模式运行我的项目时,我收到以下错误.
有谁知道原因是什么?

我已经增加了我的堆大小idea.vmoptions:
-ea
-server
-Xms1g
-Xmx3G
-Xss16m
-Xverify:none
-XX:PermSize=512m
-XX:MaxPermSize=1024m
Run Code Online (Sandbox Code Playgroud)
我已经将编译器的堆大小增加到1024,如下所示:

这个SO答案澄清了有关-XmxJVM标志的一些事情.试着尝试我做了以下事情:
import java.util.List;
import java.util.ArrayList;
public class FooMain {
private static String memoryMsg() {
return String.format("%s. %s. %s"
, String.format("total memory is: [%d]",Runtime.getRuntime().totalMemory())
, String.format("free memory is: [%d]",Runtime.getRuntime().freeMemory())
, String.format("max memory is: [%d]",Runtime.getRuntime().maxMemory()));
}
public static void main(String args[]) {
String msg = null;
try {
System.out.println(memoryMsg());
List<Object> xs = new ArrayList<>();
int i = 0 ;
while (true) {
xs.add(new byte[1000]);
msg = String.format("%d 1k arrays added.\n%s.\n"
, ++i
, memoryMsg());
}
} finally { …Run Code Online (Sandbox Code Playgroud) 我有一个递归方法,遍历包含数千个音乐文件的大型目录.每次扩展符合条件时,它都会将音乐文件添加到observableList <>.在递归方法执行之前,该列表被挂接到另一个线程中的TableView <>,以便用户可以实时查看正在添加到TableView <>的文件.
问题是我对如何在java中管理内存知之甚少,并认为我可能会妨碍垃圾收集.在大约3,000首歌曲之后,递归方法会占用近6 GB的内存,然后开始忽略它应该能够读取的文件.此外,在"完成"逐步通过目录结构之后,ram不会减少,(即,递归方法的堆栈没有被破坏,我认为所引用的所有对象仍然在堆内存中).
它更进一步..我将播放列表导出到XML文件并关闭程序.当我重新启动它时,内存是完全合理的,所以我知道它不是包含文件的大型列表,它必须与递归方法有关.
这是位于音乐处理程序中的recusive方法:
/**
* method used to seek all mp3 files in a specified directory and save them
* to an ObservableArrayList
*
* @param existingSongs
* @param directory
* @return
* @throws FileNotFoundException
* @throws UnsupportedEncodingException
*/
protected ObservableList<FileBean> digSongs(ObservableList<FileBean> existingSongs,
File directory) throws FileNotFoundException,
UnsupportedEncodingException {
/*
* Each directory is broken into a list and passed back into the digSongs().
*/
if (directory.isDirectory() && directory.canRead()) {
File[] files = directory.listFiles();
for …Run Code Online (Sandbox Code Playgroud) java ×8
heap-memory ×2
memory ×2
android ×1
eclipse ×1
heap ×1
intellij-13 ×1
java-7 ×1
javafx ×1
jvm ×1
maven ×1
python ×1
recursion ×1
stanford-nlp ×1