我需要监视由我的应用程序生成的线程消耗的内存量.如果贪婪的线程消耗太多内存,那么我们的想法是采取纠正措施.我已经提到我的java线程需要多少内存?.关于该链接的建议之一是getThreadAllocatedBytes在ThreadMXBean.我尝试使用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) 我有一个这样的 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) 我知道,只要Y> = X,就可以保证版本JDK X生成的字节码可以在JVM Y上运行。
这对所有版本的JDK / JVM都适用吗?即期望JDK 1生成的类文件在JVM 11上运行是否公平?
参考JVM规范,JDK 8兼容性指南和Java 11 JSR 在那里找不到精确的答案。