heap-memory相关内容
Object.hashCode() 的默认实现通常是对象在内存中的分配地址的一些函数(尽管这不是由 JLS).鉴于 VM 在内存中分流对象,为什么 System.identityHashCode() 返回的值在对象的生命周期内永远不会改变? 如果是“一次性"计算(对象的 hashCode 计算一次并存储在对象头或其他东西中),那么这是否意味着两个对象有可能具有相同的 identityHash
..
有没有办法从正在运行的 Java 程序中设置堆大小? 解决方案 没有. 对于堆要求非常多变的应用,您可以使用 -Xmx 将最大堆大小设置得非常高,并调整 -XX:MaxHeapFreeRatio 和 -XX:MinHeapFreeRatio 以便应用程序在堆收缩时不会挂起大量内存(它使用默认设置执行此操作). 但请注意,当应用实际使用的内存变化剧烈且迅速时,这可能会导致性能问题
..
你能回答我一个关于 JVM 垃圾收集过程的问题吗? 为什么堆分为伊甸园、幸存者空间和老年代? 在处理年轻疏散时,通过从根开始的引用访问对象以找出无法访问的对象.可达对象被标记为“活动",不可达对象不被标记,将被淘汰. 因此,考虑 ALL 个对象,包括在老年代分配的对象,如果它们可达,也会被访问和标记. 据我了解,一次回收年轻代和老代要求很高,因为这些代位于内存的不同连续部分
..
列表list = new ArrayList();for (int i = 0; i 上例中,调用string.intern()方法后,堆(sb.toString)中创建的1000个对象什么时候会被清空? 编辑 1:如果不能保证这些对象可以被清除.假设 GC 没有运行,使用 string.intern() 本身是否已经过时?(就内存使用而言?) 在使用 intern() 方法时,有
..
我正在使用 Java 7u40 附带的新 Java Mission Control Profiler,但我无法配置文件分配和收集对象统计信息.无论我做什么,我都无法在 Memory -> Object Statistics 窗口中看到任何统计信息. 以下命令启动集合: jcmd JFR.start 持续时间=60s 设置=配置文件名=alloc-prof.jfr Java Mi
..
它 是 不 可能在VM启动后增加Java堆的最大大小.造成这种情况的技术原因是什么?垃圾收集算法是否依赖于使用固定数量的内存?还是出于安全原因,通过消耗所有可用内存来防止 Java 应用程序对系统上的其他应用程序执行 DOS 操作? 解决方案 在 Sun 的 JVM 中,最后我知道,整个堆必须分配在一个连续的地址空间中.我想对于大堆值,在启动后添加到您的地址空间同时确保它保持连续是非常困难
..
我正在阅读有关 JVM 调优的文章,我突然想到 JVM 在执行 GC 时会不断移动对象.但是 Java 对象之间存在相互引用,人们会认为这是作为指针实现的,但是 JVM 不可能在每次移动对象后遍历整个堆,并更新所有引用;这肯定会永远持续下去.那么,如果引用没有改变,但对象的物理位置发生了变化,它如何解析引用呢? 我已经阅读了很多关于 JVM 的文章,但从未在任何地方解释过,甚至没有暗示过.
..
在 Java 堆上,我预计年轻一代的大小将是eden空间和两个幸存者空间(从空间和到空间): [young gen size] = [eden space size] + [from space size] + [to space size] 但是,GC 日志(使用 XX:+PrintHeapAtGC)表明 young generation 的大小是 eden 空间大小的总和 并且只有幸存者空
..
我们有一个运行 Java 5 的长期运行的服务器应用程序,对其进行分析我们可以看到老一代随着时间的推移缓慢增长.它在完整的 GC 上被正确释放,但我希望能够使用堆转储查看 Eclipse MAT 中无法访问的对象.我已经使用 +XX:HeapDumpOnCtrlBreak 成功获得了堆转储,但是 JVM 总是在转储堆之前进行 GC.显然这不会发生在 Java 6 上,但我们现在停留在 5 上.有什
..
添加时 -Xmx????m 对于命令行,JVM 为您提供了一个接近此值但最多可超出 14% 的堆.JVM 可以为您提供更接近您想要的数字,但只能通过反复试验. System.out.println(Runtime.getRuntime().maxMemory()); 打印 -Xmx1000m->932184064-Xmx1024m -Xmx1g ->954728448-Xmx1072
..
我对 Heap、Young、Tenured 和 Perm 一代感到困惑. 谁能解释一下? 解决方案 Java 垃圾收集器被称为Generational Garbage Collector.应用程序中的对象存在不同的时间长度,具体取决于它们的创建位置和使用方式.这里的关键见解是,对短期和长期对象使用不同的垃圾收集策略可以针对每种情况专门优化 GC. 粗略地说,随着对象在年轻一代中
..
来自 java 背景,我习惯的一件事是告诉 JVM 最大堆大小应该是多少.如果正在运行的程序尝试吞下的资源超出了允许范围,而垃圾收集器无法释放更多资源,则会抛出 OutOfMemoryError 并且一切都会发生.所以设置最大堆大小在 Java 中很重要. 这适用于 .net 吗?你能设置堆大小限制吗?CLR 是否会不断增长其堆,直到达到机器的物理极限?或者,由于某种微妙的原因,我的 Jav
..
有没有人在 Java 中使用过非常大的堆(12 GB 或更高)? GC 是否使程序无法使用? 您使用哪些 GC 参数? 哪个 JVM、Sun 或 BEA 更适合这个? Linux 或 Windows 哪个平台在这种情况下表现更好? 在 Windows 的情况下,在如此高的内存负载下,64 位 Vista 和 XP 之间是否存在性能差异? 解决方案 如果您的应用程序不是交互式的
..
编辑:codebulb.ch 在这篇文章中很好地解释和确认了这个问题提出的问题,包括 JSF @ViewScoped、CDI @ViewSCoped 之间的一些比较,以及 Omnifaces @ViewScoped,并明确声明 JSF @ViewScoped 是“设计泄漏":2015 年 5 月 24 日 Java EE 7 Bean 范围比较第 2 部分,共 2 部分 编辑:2017-12
..
如何通过环境变量设置 Java 的最小和最大堆大小? 我知道在启动 java 时可以设置堆大小,但我想通过我的服务器上的环境变量进行调整. 解决方案 不能直接使用环境变量.您需要使用传递给 java 命令的一组“非标准"选项.运行:java -X 了解详情.您正在寻找的选项是 -Xmx 和 -Xms(这是“初始"堆大小,因此可能是您正在寻找的.) 某些产品(如 Ant 或 To
..
我有一些 Fortran 代码调用 RESHAPE 对矩阵进行重新排序,这样我现在要循环遍历的维度成为第一个可变维度(Fortran 中的列优先顺序). 这与 C/Fortran 互操作性无关. 现在矩阵相当大,当我调用 RESHAPE 函数时,我得到一个段错误,我非常确信这是堆栈溢出.我知道这一点,因为我可以在 ifort 中使用 -heap-arrays 编译我的代码,问题就消失了
..
可能重复: C 字符串文字:它们去哪儿了? 据我所知 一般来说,指针必须是由 malloc() 分配,并将被分配堆,然后由 free() 取消分配; 和 非指针(int,char,float,etc..) 将是自动分配给堆栈,并且未分配,只要函数转到返回 但是,从以下代码: #include 主函数(){字符 *a;a = "特萨哈";返回0;}
..
这是一个完成大学任务的小程序: #include #ifndef 缓冲区大小#define 缓冲区大小 1#万一主要的(){字符缓冲区[BUFFERSIZE];诠释我;int j = 缓冲区大小;i = 读取(0,缓冲区,BUFFERSIZE);而(i>0){写(1,缓冲区,我);i = 读取(0,缓冲区,BUFFERSIZE);}返回0;} 还有一个替代方法是使用 std
..
我目前正在学习操作系统,我了解到堆栈位于内核和堆之间.令我困惑的是,在大多数实现中,由于堆栈倾向于向下增长而堆增长到更高的内存地址,是什么阻止了堆栈增长到堆中?如果有可能,如果它确实增长到堆中会发生什么? 解决方案 传统上非常简化的内存视图看起来像这样: ====================|操作系统 |高内存====================|您的程序 ||--------
..
我正在处理其中一个线程.一个程序崩溃了,因为它在函数中本地声明了一个 10^6 的数组. 给出的原因是堆栈上的内存分配失败导致崩溃. 当全局声明相同的数组时,它运行良好.(堆上的内存保存了它). 现在,让我们假设,栈向下增长,向上堆. 我们有: ---堆栈--- ------- ---堆---- 现在,我相信如果堆栈分配失败,它也必须在堆上失败.
..