Tag: 内存

Java BigDecimal内存使用情况?

是否有估计BigDecimal消耗的内存量的准则? 寻找类似于这些指南的内容来估算String内存使用情况。

如何破坏java对象?

好吧,我开发了一个使用多个对象关系的java应用程序,这使得内存使用过于昂贵。 我没有管理java内存的经验,因为应用程序设计很难破坏对象并重新利用先前清除的空间。 例如,我正在使用Observer和MVC模式。 所以,理论说…… 如果从任何活动线程或任何静态引用无法访问对象,则该对象符合垃圾收集或GC的条件 换句话说,如果对象的所有引用都为null,则可以说对象符合垃圾回收的条件。 但是,根据我的短暂经验,当我有一个像我这样的场景,你不知道如何从我想要从内存中移除的对象(例如,当一个框架关闭时)销毁所有引用时,对我来说太难了存在许多对类的引用。 根据这个上下文,当有多个引用时,如何处理对象破坏? 或者当你对彼此有复杂的引用时,我如何管理内存?

返回语句之前的局部变量,是否重要?

很抱歉,如果这是一个新手问题,但我找不到答案。 这样做更好: int result = number/number2; return result; 要么: return number/number2; 我知道整数使用内存所以我猜它会略微降低性能? 但另一方面它使东西更清晰,特别是当int / string是一个长计算时。

Java中的指针

C ++支持指针,而Java则不支持。 但是当许多程序员质疑如何在没有指针的情况下工作时,发起人开始说“受限制的指针”。所以我们可以说Java支持受限制的指针?

确定java内存使用情况

嗯。 Java中的内存使用是否有任何入门? 我本以为Sun或IBM本来会有一篇关于这个主题的好文章,但我找不到任何看起来非常可靠的文章。 我有兴趣了解两件事: 在运行时,计算出我的包中的类在给定时间使用了多少内存 在设计时,估计各种事物的一般内存开销要求,例如: 空对象需要多少内存开销(除了其字段所需的空间) 创建闭包时需要多少内存开销 像ArrayList这样的集合需要多少内存开销 我可能已经创建了数十万个对象,我想成为一个“好邻居”,不要过度浪费RAM。 我的意思是我并不在乎我是否比“最佳情况”(无论是那种情况)使用的内存多10%,但是如果我实现了一些使用5倍内存的东西,如果我做了一个简单的话改变,我想使用更少的内存(或者能够为固定数量的可用内存创建更多对象)。 我发现了一些文章( Java专家的时事通讯和来自Javaworld的内容 )和一个内置类java.lang.instrument.getObjectSize() ,它声称要测量内存使用的“近似”(??),但这些似乎都是有点模糊…… (是的,我意识到在两个不同的操作系统上运行的JVM可能会为不同的对象使用不同的内存量)

Java不是垃圾收集内存

我正在读取一个非常大的文件,并从每一行中提取一小部分文本。 但是在操作结束时,我的内存很少。 看起来垃圾收集器在读取文件后无法释放内存。 我的问题是:有没有办法释放这段记忆? 或者这是一个JVM错误? 我创建了一个SSCCE来certificate这一点。 它读取1 mb(由于16位编码而在Java中为2 mb)文件并从每行中提取一个字符(~4000行,因此应该是大约8 kb)。 在测试结束时,仍然使用了完整的2 mb! 初始内存使用情况: Allocated: 93847.55 kb Free: 93357.23 kb 读取文件后立即(在任何手动垃圾收集之前): Allocated: 93847.55 kb Free: 77613.45 kb (~16mb used) 这是预料之中的,因为程序正在使用大量资源来读取文件。 然而,我垃圾收集,但不是所有的内存都被释放: Allocated: 93847.55 kb Free: 91214.78 kb (~2 mb used! That’s the entire file!) 我知道手动调用垃圾收集器不会给你任何保证(在某些情况下它是懒惰的)。 然而,这发生在我的大型应用程序中,其中文件几乎占用了所有可用内存,并且导致程序的其余部分尽管需要它而耗尽内存。 这个例子证实了我怀疑从文件中读取的多余数据没有被释放。 以下是生成测试的SSCCE: import java.io.*; import java.util.*; public class Test { […]

了解JVM内存分配和Java内存不足:堆空间

我正在研究真正了解内存分配在JVM中的工作原理。 我正在编写一个应用程序,其中我正在使用内存:堆空间exception。 我知道我可以将诸如Xms和Xmx之类的VM参数传递给JVM为正在运行的进程分配的堆空间。 这是问题的一种可能的解决方案,或者我可以检查我的代码是否存在内存泄漏并解决问题。 我的问题是: 1)JVM如何为自己实际分配内存? 这与操作系统如何将可用内存传递给JVM有何关系? 或者更一般地说,任何进程的内存分配如何实际工作? 2)虚拟内存如何发挥作用? 假设您有一个具有32GB物理内存的系统,并且您将所有32GB分配给您的Java进程。 假设您的进程实际上消耗了所有32GB内存,我们如何强制使用虚拟内存而不是运行到OOMexception? 谢谢。

在Tomcat 6中重复出现“PermGen”

我在Tomcat 6服务器上遇到“PermGen”错误。 我知道应用程序导致了什么问题,但我不确定它为什么会这样做。 该应用程序使用MySQL 5并在JDK 6上运行。 是否有任何工具/建议可用于诊断或分析特定应用的基础问题? 谢谢

Java进程内存使用情况(jcmd vs pmap)

我在一个docker容器内的Java 8上运行了一个java应用程序。 该过程启动Jetty 9服务器并部署Web应用程序。 传递以下JVM选项: -Xms768m -Xmx768m 。 最近我注意到这个过程耗费了大量的内存: $ ps aux 1 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND app 1 0.1 48.9 5268992 2989492 ? Ssl Sep23 4:47 java -server … $ pmap -x 1 Address Kbytes RSS Dirty Mode Mapping … total kB 5280504 2994384 2980776 $ jcmd […]

Java(JVM)如何为每个线程分配堆栈

Java应用程序启动时,所有线程都有一个堆。 每个线程都有自己的堆栈。 启动Java应用程序时,我们使用JVM选项-Xms和-Xmx来控制堆的大小,使用-Xss来控制堆栈大小。 我的理解是,正在创建的堆成为JVM的“托管”内存,所有正在创建的对象都放在那里。 但堆栈创建如何工作? Java是否在创建每个线程时为其创建堆栈? 如果是这样,堆栈在内存上的确切位置? 它肯定不在“托管”堆中。 JVM是否从本机内存创建堆栈,还是为堆栈预先分配了一部分托管内存区域? 如果是这样,JVM如何知道如何创建线程?