- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
下面是检查内存的代码片段
public class TestFreeMemory {
public static void main(String ... args){
Runtime rt = Runtime.getRuntime();
System.out.println("Free Memory (Before GC): " + rt.freeMemory());
rt.gc();
System.out.println("Free Memory (After GC1): " + rt.freeMemory());
rt.gc(); // Second time to ensure results are consistent
// MAY BE has collected all non-reachable objects
System.out.println("Free Memory (After GC2): " + rt.freeMemory());
String s = new String("abcd");
Integer i = new Integer(12345);
System.out.println("Free Memory (After String Creation): " + rt.freeMemory());
// Why is freeMemory not reflecting the memory consumed by two objects
}
}
输出是
Free Memory (Before GC): 1859672
Free Memory (After GC1): 1911768
Free Memory (After GC2): 1911768
Free Memory (After String Creation): 1911768
为什么 freeMemory 没有反射(reflect)两个对象消耗的内存?
更清楚地说,问题是关于 getMemory() 调用没有显示预期结果,即使创建了两个对象并且与 GC 无关。进行两次 GC 调用只是为了尝试确保 getMemory() 调用的次数正确..顺便说一句,创建对象后没有 GC 调用..所以请注意,我不是在创建对象后尝试 GC ..
最佳答案
HotSpot JVM 上的内存管理:
Another desirable garbage collector characteristic is the limitation of fragmentation. When the memory for garbage objects is freed, the free space may appear in small chunks in various areas such that there might not be enough space in any one contiguous area to be used for allocation of a large object. One approach to eliminating fragmentation is called compaction, discussed among the various garbage collector design choices below.
Memory Management in HotSpot JVM (PDF Format).
此行为可能非常依赖于垃圾回收的特定实现。例如:
Parallel Mark Compact
- Stop-the-world
- Heap divided into fixed-size chunks (> 2kb now, will likely increase or be subject to ergonomics)
- Chunk is unit of live data summarization
- Parallel mark
- Record live data addresses in external bitmap
- Find per chunk live data size
- Find dense chunks, i.e., ones that are (almost) full of live objects
我制作了这个示例(滥用字符串连接以占用更多内存):
public class TestFreeMemory {
static void allocateSomeMemory(){
long[][] array = new long[400][400];
}
public static void main(String ... args){
Runtime rt = Runtime.getRuntime();
allocateSomeMemory(); // once we leave, our array is not reachable anymore
System.out.println("Free Memory (Before GC): " + rt.freeMemory());
rt.gc();
System.out.println("Free Memory (After GC): " + rt.freeMemory());
String a = new String("A");
for(int i = 0; i < 100; i++){
a+="B";
}
System.out.println("Free Memory (After String Creation): " + rt.freeMemory());
// Less free memory expected.
}
}
输出:
Free Memory (Before GC): 3751800
Free Memory (After GC): 5036104
Free Memory (After String Creation): 5012048
如果我在循环中使用相对较少的迭代次数(例如 10 次),额外的空间不会出现在 freeMemory()
中,我会得到如下内容:
Free Memory (Before GC): 3751800
Free Memory (After GC): 5036040
Free Memory (After String Creation): 5036040
关于java - 运行时 - 为什么 freeMemory() 没有显示正确消耗的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3421869/
我在部署war到云服务器时遇到问题(PasS,128Mb),然后我的应用程序中有两个定时器。 Timer1 将每隔一小时执行一次任务来记录我的内存(以及 #2 中描述的 map )。 每次我创建一个
我试图查看 Runtime.freeMemory() 的用法。 文档说它“返回 Java 虚拟机中的空闲内存量” 我执行了一个简单的程序测试这个。程序如下: public class Test {
Runtime.getRuntime().freeMemory() 返回空闲堆内存空间还是堆+非堆内存空间? 最佳答案 javadoc说: @return an approximation to th
我有以下测试程序: public static void main(String[] args) { HashMap hm = new HashMap(); int i =
为什么我得到以下代码的变量输出: Runtime rt = Runtime.getRuntime(); long x,y; x = rt.freeMemory(); char z[] = new ch
下面的代码为内存打印相同的值?理想情况下,在对象分配后,应减少可用内存。我的理解正确吗? System.out.println(Runtime.getRuntime().freeMemory());
无论出于何种原因,我想看看可以创建多少个对象并填充 LinkedList。我使用 Runtime.getRuntime().freeMemory() 来获取 JVM 中可用内存的近似值。我写的是: p
我正在编写一个程序,根据 JVM、堆大小和用户设置,它可能会抛出一些 OOM经常出错。 我不想给它一些任意的限制,但是因为当这个错误发生时,程序可能需要很长时间才能产生一些有意义的输出,我希望它至少尽
为什么当我创建新的字节[1000]时,这个程序打印0,并为新的字节[1000 * 1000]打印1000016? long m0 = Runtime.getRuntime().freeMemo
嘿,我正在用这段代码测试 Runtime.freeMemory(): Runtime runtime = Runtime.getRuntime(); long freeMemory = runti
我搜索并看到了一些主题,但没有一个能解决我遇到的具体问题。 我正在尝试使用 Runtime.getRuntime().freeMemory()、Runtime.getRuntime().maxMemo
下面是检查内存的代码片段 public class TestFreeMemory { public static void main(String ... args){ Run
我想在没有分析器的情况下计算内存中 HashMap 的大小。所以我做了以下事情: HashMap map = new HashMap(); long start = System.currentTim
我遇到了一个奇怪的问题。我有多个 JVM 正在运行,我需要获取它们的内存使用详细信息。当我通过 Runtime.getFreeMemory() 获取详细信息并将其与 jconsole 输出进行比较时,
我用java写了简单的代码如下 public static void main(String[] args) { String st ="Java"; StringBuffer sb
我有一些分析 Runtime.freeMemory 的代码。这是我的代码: package misc; import java.util.ArrayList; import java.util.Ran
我需要使用 定期收集 JVM 的统计信息。稍后,我需要记录 JVM 可用内存/空闲内存、已用内存、总内存。 以下是我想到的两个方案。 ManagementFactory.getMemoryPoolMX
每当我的 JVM 创建一个新对象时,我都想在日志中打印一些内容。我试图使用 Runtime.getRuntime().freeMemory() 来检测它,但不幸的是,在它被提升到堆(check her
我正在运行一个 java 应用程序,我在下面观察到: 我通过代码计算内存利用率: long freeMemory = Runtime.getRuntime().freeMemory(); this.m
我使用 Runtime.getRuntime().totalMemory() 和 freeMemory() 来计算内存。但是,我对结果感到困惑。 我已经阅读了以下帖子: What are Runtim
我是一名优秀的程序员,十分优秀!