草庐IT

java - 以编程方式设置最大 Java 堆大小

有没有办法以编程方式设置最大Java堆大小而不是作为vm参数?类似于:System.getProperties().put("","1000m"); 最佳答案 不适用于任何HotspotJVM。JVM堆参数只能在命令行中指定,然后在JVM的生命周期内固定不变。对于HotspotJava实现,“更改”应用程序堆大小的唯一方法是使用不同的命令行参数在新的JVM中重新启动它。(我依稀记得一些其他供应商的JVM确实允许在运行的JVM中更改一些堆参数。也许有人可以澄清。) 关于java-以编程方式

java - 对于堆上 Java 缓存来说,多少数据太多了?我应该什么时候开始考虑堆外缓存?

多少数据对于像ehcache这样的堆上缓存来说太多了?我得到了一个24GB内存的服务器。我可能会开始投入2-4GB用于缓存,但最终可能投入20GB左右用于缓存。什么时候我应该担心堆上缓存的GC会花费太长时间?顺便问一下,DirectMemory是唯一可用的开源堆外缓存吗?准备好迎接黄金时段了吗? 最佳答案 取决于您的JVM,尤其是使用的GC。尤其是较旧的GC并不能真正处理非常大的堆,但人们正在努力解决这个问题。例如,Azul系统销售具有数百GB堆的硬件而没有出现问题(即gc在ms内暂停而不是半分钟),这要归功于他们的specialG

java - 我可以启动一个 Eden 空间如此之大的 JVM,它运行到完成而没有任何 GC。假设我有一堆空闲内存

如果我有足够的空闲内存,我可以启动一个Java应用程序(说mMven)来单独使用Eden空间运行直到完成而不需要任何GC吗? 最佳答案 是的,我已经为Java6+中的实际应用程序完成了此操作。我从一个24GB的Eden空间、微型幸存者空间和永久空间开始。后来发现8GB绰绰有余。当有bug或错误时它仍然会GC,但在正常操作下不会。我相信选项是-Xmn24g-Xmx26g-XX:SurvivorRatio=100使用默认GC。该应用程序经过优化,生成的数据量低于1GB/小时,因此使用GC运行一天。

java - jvm堆设置模式

我在设置堆大小时观察到人们更喜欢值64,128,256,1024..。如果我给出一个介于这些数字之间的值(比如500),JVM是否会接受该值?为什么这些数字很重要并且是首选?为什么我们也以这种模式升级内存?请帮助我理解。 最佳答案 JVM将接受任何值,这没有问题。使用2^n值只是一种“约定”,使用其他值在实践中不会产生负面影响。 关于java-jvm堆设置模式,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.

java - 堆污染,Java

Listl=newArrayList();Listls=l;//uncheckedwarningl.add(0,newInteger(42));//anotheruncheckedwarningStrings=ls.get(0);//ClassCastExceptionisthrownjava文档说;Furthermore,aheappollutionsituationoccurswhenthel.addmethodiscalled.ThestatictypesecondformalparameteroftheaddmethodisString,butthismethodiscalle

java - 为什么Java不支持自动堆扩容?

为什么Java在达到操作系统强加的进程内存限制之前不会像.NETCLR那样扩展堆大小?这只是JVM开发人员制定的策略,还是.NETCLR架构优于JVM架构的优势?换句话说,如果Oracle工程师想为JVM实现自动堆扩容,他们能做到吗?谢谢编辑:我真的认为这对java来说是一个糟糕的设计选择。将Xmx设置得尽可能高(例如100GB!)是不安全的。如果用户需要在更大的数据上运行我的代码,他可能会在具有更多可用RAM的系统上运行它。作为开发人员,我为什么要设置程序的最大可用内存?我不知道数据的大小!!! 最佳答案 当JVM需要达到您设置的

java - 在堆中创建的抽象类的私有(private)实例变量在哪里?

abstractclassA{privateinta;publicA(intx){a=x;}publicintgetA(){returna;}}classBextendsA{publicB(intx){super(x);}}classTestB{publicstaticvoidmain(Stringargs[]){Bb=newB(5);System.out.println(b.getA());}}在这种情况下,当我说Bb=newB(5);时,调用父类(superclass)构造函数并将私有(private)实例变量初始化为5。所以当我说getA()在B引用的b对象上返回5。由于clas

java - Java PriorityQueue(堆)插入n个元素的时间复杂度?

这个问题在这里已经有了答案:HowcanbuildingaheapbeO(n)timecomplexity?(18个答案)关闭5年前。我想知道JavaPriorityQueue.Add()对n元素的时间复杂度是多少。我知道插入单个元素的潜在更坏情况是O(log(n)),但我不清楚插入n集合的时间复杂度是多少元素?我从各种来源(没有证据)中看到,构建一个n元素的优先级队列堆的时间是O(n),并且还看到声称它是O(nlog(n)),这是有意义的,因为插入是O(log(n)),它乘以n时间确实等于O(nlog(n))注意:我只对最坏的情况感兴趣,而不是摊销。这个问题假设有一种逻辑方法来描述用

java - 如何读取由 jconsole 创建的堆转储文件?

我通过在jconsole中调用com.sun.management.HotSpotDiagnosticMXBean的dumpHeap操作手动执行堆转储。所以我得到了一个转储文件。我的问题:jconsole可以读取转储文件吗?如果不是,哪个工具可以读取它?谢谢!编辑:现在我知道jconsole不提供读取功能,我想知道为什么jconsole只写转储文件而没有读取功能。(这不是我的问题,我只是好奇而已) 最佳答案 我找到了一个Eclipse插件MemoryAnalyzer自己读取转储文件。仍然欢迎使用其他工具。

java - 我应该在使用后重置 Java 堆空间最大值吗?

我正在使用R中的一些建模算法,其中之一在Java中运行(bartMachine)。我发现根据我的数据大小,我需要在运行建模算法之前增加Java的最大堆空间。我是这样做的:选项(java.parameters="-Xmx16g")我的问题是,如果没有其他算法将使用java(或至少那么大的堆空间),我之后是否需要重置堆空间?还是会根据需要回收分配给java的内存而不会造成性能损失?我已经围绕这个主题进行了一些搜索,并且我了解如何更改/降低堆空间。我也明白R/Java会进行垃圾收集以从内存中删除旧对象以释放更多空间。我不明白的是改变堆空间如何影响其他程序可用的内存,以及在这种情况下是否有必要