Tag: 内存

Jmap堆转储,是否包括年轻一代?

快问 jmap堆转储是仅包含旧代,还是年轻代? 很长的解释 我有2个堆转储( jmap -heap:format=b 9999 ): 我的一台服务器没有加载(没有HTTP请求) 一个工作50%CPU,高负载(基准测试) 现在,第一个转储显示的堆大小比第二个大 (我认为这很奇怪)。 可能是因为Young Generation(高负载)经常变化,因为垃圾收集器经常运行(是的,JVM几乎已满)? 老一代人满99%,我注意到年轻一代的空间使用量差异很大。 因此,这意味着我在GC完成工作后立即进行了第二次转储,这就是为什么它的尺寸更小。 我对吗 ? 附加信息 : Java args: -XX:+UseParallelGC -XX:+AggressiveHeap -Xms2048m -Xmx4096m -XX:NewSize=64m -XX:PermSize=64m -XX:MaxPermSize=512m

Java静态变量和inheritance和内存

我知道如果我有同一个类的多个实例,它们将共享相同的类变量,所以无论我有多少个类的实例,类的静态属性都将使用固定数量的内存。 我的问题是: 如果我有一些子类从它们的超类inheritance一些静态字段,它们是否会共享类变量? 如果没有,确保它们共享相同类变量的最佳实践/模式是什么?

如果多个线程可以访问某个字段,那么它应该标记为volatile吗?

阅读一些线程( 常见的并发问题 , volatile关键字 , 内存模型 )我对Java中的并发问题感到困惑。 我有很多字段可以被多个线程访问。 我应该通过它们并将它们全部标记为易变? 在构建一个类时,我不知道多个线程是否会访问它,所以让任何字段都不易变化是不安全的,所以根据我的理解,你很少会使用它。 它是否正确? 对我来说,这是特定于版本1.5 JVM及更高版本,但不仅限于回答我的特定设置。

我的Bitset的大小是多少?

我想以尽可能小的空间将System.currentTimeInMillis存储在内存中。 因为我必须将数百万存储在内存中。 我将它转换为binaryString ,它给了我41 bits 这是我的计划 public class BitSetSize { public static void main(final String[] args) { final long currentTimeMillis = System.currentTimeMillis(); final String currentTimeToBinaryString = Long.toBinaryString(currentTimeMillis); System.out.println(“Size in bits: ” + currentTimeToBinaryString.length()); final BitSet bitSet = BitSet.valueOf(new long[]{currentTimeMillis}); System.out.println(“Bitset length: ” + bitSet.length()); System.out.println(“Bitset size: ” + bitSet.size()); System.out.println(“Size of biset object(bytes): ” + […]

Java中的流如何影响内存消耗?

我已经多次使用流,但我从来没有读过很多关于它们实际工作的信息。 除了流只是一个比喻之外,我也不太了解它们。 流只表示字节序列。 我不太了解它们实际上是如何工作的,我想在Java中打开一个文件流与具有向流提供“指针”function的操作系统进行交互。 基本上我的问题是流如何影响内存消耗。 例如,当你有一个输入流并开始从它读取时,你只会开始增加内存消耗,读取的字节数是多少? 在Java中打开流时,在开始阅读之前,实际上并没有加载完整的文件? 如果从一个流中读取并直接写入另一个流,则只增加内存的读取字节数(可能还有缓冲区)? 如果你在java中读取一个字节数组的字节,那么你会增加文件大小的内存消耗? 可能听起来像一个奇怪的问题,但我可能需要一些指导/纠正我的理解。 谢谢。

在JVM上禁用本地JMX连接

我们正在编写一个java程序,它将密码保存在内存中。 不幸的是,用户可以轻松地使用jconsole或jmap创建堆转储文件并打开它以查找密码。 我认为jconsole使用本地套接字连接jvm。 我想知道,有没有办法甚至为本地用户禁用jmx? 有没有办法完全禁用堆转储? 由于用户可以访问内存段,因此无论如何都可以访问密码。 但是,我想禁用标准的方法来使行动尽可能昂贵。

如何在Java中有效地存储小字节数组?

小字节数组是指字节数组,长度从10到30。 通过商店我的意思是将它们存储在RAM中 ,而不是序列化并持久保存到文件系统。 系统macOS 10.12.6,Oracle jdk1.8.0_141 64位,JVM args -Xmx1g 示例: new byte[200 * 1024 * 1024]预期行为是堆空间的≈200mb public static final int TARGET_SIZE = 200 * 1024 * 1024; public static void main(String[] args) throws InterruptedException { byte[] arr = new byte[TARGET_SIZE]; System.gc(); System.out.println(“Array size: ” + arr.length); System.out.println(“HeapSize: ” + Runtime.getRuntime().totalMemory()); Thread.sleep(60000); } 但是对于较小的数组,数学并不那么简单 public static […]

在Java中,是否可以增加JVM的可用内存和/或杀死其他Java程序?

我对高级Java缺乏经验,所以请耐心等待。 我很好奇Java能够实现可能被称为“自主”的function。 假设我们有两个Java程序在运行。 并且一个程序确定另一个程序占用内存,从而杀死该程序和/或为JVM分配更多内存。 我知道在Java中你可以看到可用内存是什么(请参阅如何检查Java中的CPU和内存使用情况? ),但是如果我们想深入挖掘怎么办? 谢谢。

静态数组如何存储在Java内存中?

所以在像C这样的语言中,内存分为5个不同的部分:OS内核,文本段,静态内存,动态内存和堆栈。 像这样的东西: 如果我们在C中声明了一个静态数组,那么你必须事先指定它的大小,然后才能永久修复它。 该程序将为arrays分配足够的内存,并按预期将其粘贴在静态数据段中。 但是我注意到在Java中你可以这样做: public class Test { static int[] a = new int[1]; public static void main( String[] args ) { a = new int[2]; } } 一切都会像你期望的那样奏效。 我的问题是,为什么这在Java中有效? 编辑:所以共识是Java中的int[]更像C中的int* 。因此作为后续问题,有没有办法在Java中的静态内存中分配数组(如果没有,为什么不呢) ? 这不会更快地访问这样的arrays吗? EDIT2:^现在这是一个新问题: 静态类变量存储在内存中的哪个位置?

是否有可能在Java中有多个堆?

是否有可能在Java中有多个堆? 如果有可能那么它会在哪些情况下发生?