小编Sar*_*ram的帖子

线程占用的内存

我需要监视由我的应用程序生成的线程消耗的内存量.如果贪婪的线程消耗太多内存,那么我们的想法是采取纠正措施.我已经提到我的java线程需要多少内存?.关于该链接的建议之一是getThreadAllocatedBytesThreadMXBean.我尝试使用getThreadAllocatedBytes以下工作时使用.

List<Long> primes = new ArrayList<Long>();
long i = 0;
while (true) {
            primes.add(++i);
            if ((i % 10) == 0) {
                primes.clear();
                System.runFinalization();
                System.gc();
            }
        }
Run Code Online (Sandbox Code Playgroud)

我花了很长时间在四个线程上运行这个工作.虽然作业不会持续累积内存,但返回的值getThreadAllocatedBytes会不断增加,甚至不会下降一次.这意味着getThreadAllocatedBytes不会返回线程使用的堆上的实际内存量.它返回自启动以来线程在堆上分配的内存总量.我的平台详细信息如下:

Linux的PG85213.egi.ericsson.com 3.5.0-030500泛型#201207211835 SMP周六7月21日22时35分55秒UTC 2012 x86_64的x86_64的x86_64的GNU/Linux的Java版本"1.7.0_45"
的Java(TM)SE运行时环境(建1.7.0_45-b18)Java HotSpot(TM)64位服务器VM(内置24.45-b08,混合模式)

上述行为是否符合预期的行为getThreadAllocatedBytes?如果是这样,是否无法在线程使用的堆上找到有效内存.

我列出了完整的程序供参考:

package workbench;

import java.lang.management.ManagementFactory;
import com.sun.management.ThreadMXBean;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AnotherWorkBench {

private static final CountDownLatch latch = …
Run Code Online (Sandbox Code Playgroud)

java memory multithreading memory-management

12
推荐指数
1
解决办法
2万
查看次数

删除 protobuf 中的字段

我有一个这样的 protobuf 消息:

message MyMessage{
    string foo = 1;
    int toBeRemovedBar = 2 [deprecated = true];
    string zag = 3;
}
Run Code Online (Sandbox Code Playgroud)

toBeRemovedBar属性不再需要,需要删除。根据此处此处的指南,我可以保留字段名称或数字。这里的最佳实践是什么?

  • 保留字段编号或名称
  • 保留字段编号和名称

保留字段编号只会防止字段编号的重复使用。无法阻止字段名称的重复使用。类似的论点适用于仅保留字段名称。

那么,删除属性的正确方法是保留字段名称和编号,如下所示?

message MyMessage{
    string foo = 1;

    reserved 2;
    reserved "toBeRemovedBar";

    string zag = 3;
}
Run Code Online (Sandbox Code Playgroud)

protocol-buffers proto grpc

8
推荐指数
1
解决办法
7234
查看次数

Java字节码是否始终向前兼容?

我知道,只要Y> = X,就可以保证版本JDK X生成的字节码可以在JVM Y上运行。

这对所有版本的JDK / JVM都适用吗?即期望JDK 1生成的类文件在JVM 11上运行是否公平?

参考JVM规范JDK 8兼容性指南Java 11 JSR 在那里找不到精确的答案。

java compatibility jvm jvm-bytecode

6
推荐指数
2
解决办法
786
查看次数