- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近运营同事反射(reflect)生产环境有很多full gc,影响app响应时间。他提供了一个图像
他特别说StackTraceElement有85M,建议不要有这些代码,例如
e.printStackTrace();
现在我想在本地模拟这种情况,写了如下测试代码
public class FullGCByLogTest {
private static final Logger log = Logger.getLogger(FullGCByLogTest.class);
public static final byte[] _1M = new byte[1 * 1024 * 1024]; //placeholder purpose
public static void main(String[] args) throws InterruptedException {
int nThreads = 1000; // concurrent count
ExecutorService pool = Executors.newFixedThreadPool(nThreads);
while (true) {
final CountDownLatch latch = new CountDownLatch(nThreads);
for (int i = 0; i < nThreads; i++) {
pool.submit(new Runnable() {
@Override
public void run() {
latch.countDown();
try {
latch.await(); // waiting for execute below code concurrently
} catch (InterruptedException e1) {
}
try {
int i = 1 / 0;
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
// log.error(e.getMessage(), e);
}
}
});
}
try {
Thread.sleep(100); // interval 1s every concurrent calling
} catch (InterruptedException e) {
}
}
}
}
我用这些 vm args 运行这个类
-Xmx4m -Xms4m -XX:NewSize=1m -XX:MaxNewSize=1m -XX:+PrintGCDetails
然后在 jvisualvm VisualGC 中我发现 old gen 是 7 M,但我设置的 max heap 是 4m。
另外在 heapdump 中我没有找到 StackTraceElement。那么我怎样才能成功模拟这个问题呢?
最佳答案
StackTraceElement
对象实际上是在实例化异常对象时创建的,一旦异常对象无法访问,它们就符合垃圾回收条件。
我怀疑你的(明显的)存储泄漏的真正原因是你的代码中的某些东西正在保存大量异常对象。
调用 printStackTrace()
不会泄漏对象。您的同事误诊了问题。然而,到处调用 printStackTrace()
是很丑陋的......如果它频繁发生,那将导致性能问题。
您的模拟和结果是一个转移注意力的问题,但堆比您要求的大的可能原因是 JVM 已“四舍五入”到更大的堆大小。 (4Mb 是一个极小的堆大小,对于大多数 Java 程序来说是不切实际的。)
So how could I emulate this problem successfully?
仿真极不可能告诉您任何有用的信息。您需要从生产系统获取堆转储并对其进行分析。
关于java - 如何通过堆中的许多 StackTraceElement 模拟完整的 gc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35039373/
这个问题有点难以解释,很抱歉问了这么长的问题! 我有方法indexOf(String node),它在字符串数组中查找并返回索引位置,如果在数组中找不到节点字符串,则抛出异常。 该方法在addEdge
public static void main(String[] args) { try{ throw new RuntimeException(); } ca
StackTrace 给出源文件中的类、方法、行号。 有没有办法获取方法执行时的时间戳? 最佳答案 我不这么认为,因为 API 不允许您访问时间戳。 Exception 和 StatckTraceEl
我有这个ste.getClassName(),它返回一个String,就像这样的pack.age.Foo。 ste 是 StackTraceElement。 我怎样才能只得到Foo?或者唯一的方法是执
Thread.getStackTrace()返回StackTraceElement[]。如何将其转换为与 Exception.printStackTrace() 返回格式相同的 String? 澄清一
我想自定义 StackTraceElement class的哈希码。我的问题是如何使用这个新的自定义类而不是 JVM 的默认 StackTraceElement 类。 最佳答案 I want to c
这个问题在这里已经有了答案: Unable to create JAXBContext creating my wsdl (8 个答案) 关闭 4 年前。 我正在尝试部署网络服务,当我这样做时出现下
这是一个示例应用程序,在 Foo.main() 处抛出错误: public class Foo { public static void main(String args[]) {
我有以下问题 我在类中定义了Point []数组,例如 private Point[] dataPoints 课堂积分包括以下内容 public class Point { public double
我正在尝试调试我的应用程序以查看它停止运行的位置,但我对以下日志“Ljava.lang.StackTraceElement;@42088f90”感到困惑,我不知道它的含义或来源. 07-01 13:5
最近运营同事反射(reflect)生产环境有很多full gc,影响app响应时间。他提供了一个图像 他特别说StackTraceElement有85M,建议不要有这些代码,例如 e.printSta
我有一个使用 Apache CXF 2.1.3 构建的 Web 服务。 Web 参数之一是 java.lang.Throwable。当我调用 JaxWsServerFactoryBean.setSer
我正在开发部署在 JBOSS 4.3 上的 Spring3.0、Hibernate 3.2 Web 应用程序。它是实时产品,当有 3 万用户使用它时,就会出现此异常。 Exception : leve
Throwable有方法 printStackTrace()它打印出格式良好的堆栈跟踪。是否有一些函数对 StackTraceElement 的数组执行相同的操作?例如可以通过调用 getAllSta
我想在检测 java 字节码时获取当前代码行号。 Instrumentation是通过ASM实现的。在visitcode后面插入getLineNumber对应的字节码,返回值为-1,但在其他位置插桩得
我有一个自定义日志记录系统,它为每个日志记录语句显示日志记录语句的文件名和行号。除了 lambda 之外,这非常有效。与 lambda 内的位置相对应的 StackTraceElement 不会生成文
我的问题是为什么 ElementModel 构造函数中的代码 this.getClass().getName() 会生成 BaseModel$1 作为结果而不是 ElementModel? 此外,您会
我正在尝试绑定(bind)到在 JBoss 服务器上托管的测试环境中运行的现有旧版 Web 服务,但由于以下异常,Spring 无法创建该 bean: Caused by: javax.xml.ws.
我是一名优秀的程序员,十分优秀!