看看以下程序
public class YoungGC {
public static void main(String[] args) {
long i = 0;
long start = System.currentTimeMillis();
while (true) {
int length = 1;
for (int j = 0; j < length; j++) {
byte[] x = new byte[1024];
}
i++;
if (i % 1000 == 0) {
if (System.currentTimeMillis() > start + 30000) {
break;
}
}
}
}
}
以如下参数运行 java -Xms1G -Xmx1G -Xmn512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -cp . YoungGC,会在console中看到如下的GC输出,持续30s。
11.285: [GC [PSYoungGen: 2096640K->0K(2096960K)] 2096800K->160K(4194112K), 0.0010110 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
11.769: [GC [PSYoungGen: 2096768K->0K(2096960K)] 2096928K->160K(4194112K), 0.0029880 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
12.257: [GC [PSYoungGen: 2096768K->0K(2096960K)] 2096928K->160K(4194112K), 0.0009180 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
然后让我们把临时变量的大小从1024改成64,再次重跑以下程序,你看见了什么?
public class YoungGC {
public static void main(String[] args) {
long i = 0;
long start = System.currentTimeMillis();
while (true) {
int length = 1;
for (int j = 0; j < length; j++) {
byte[] x = new byte[64];
}
i++;
if (i % 1000 == 0) {
if (System.currentTimeMillis() > start + 30000) {
break;
}
}
}
}
}
我在 hotspot jdk 1.7.0_21测试的结果都是 什么都没看见!完全没有GC,用jvisualvm连上线程后会发现young gen size根本没有变,而如果 把64改成 65,则GC又出现了。
换到jdk 1.6.0_21下就没有这种问题,即使临时变量的大小是1也会出现GC。
byte[64] 正好是64位下的一个word,看起来hotspot jvm 在1.7的对于一些小对象作了重用?
补充:
这个变化貌似是从1.6.0_23的Java Hotspot VM 19.0引入的,但是没找到具体说明。。。
相关推荐
java JWM 源码 ,版本jdk1.8 。java JVM 源码,版本 jdk 1.8。java JWM 源码 ,版本jdk1.8 。java JWM 源码 ,版本jdk1.8 。java JWM 源码 ,版本jdk1.8 。
OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)
OpenJDK
技术文档分享。
对象的创建加载:先去检测new指令能否再常量池中定位到一个类的符号引用,如果未被加载、解析、初始化过 执行相应的类加载过程分配内存: 为对象分配空间时采用指针碰
本书深入浅出地讲解了 HotSpot 虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包 括 OpenJDK 与 HotSpot 项目、编译和调试 HotSpot 的方法、HotSpot 内核结构、Launcher、OOP-Klass 对象表 示系统...
• HotSpot • ClassFile • ClassLoader • 内存模型、锁、同步 • JVM内存管理和垃圾收集 Java发展历程 JVM列表 OpenJDK 编译执行过程 解析执行和JIT编译
官方完整版JVM源码Hotspot VM,文件名hotspot.tar.gz。官方完整版JVM源码Hotspot VM,文件名hotspot.tar.gz。
HotSpot JVM针对Linux-x86平台的源代码学习研究(包括代码注释,文档,用于代码分析的测试用例) 构建HotSpot请运行make / mybuild.sh
包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器...
资源描述: 1.HotSpot虚拟机对象探秘-xmind脑图pdf 2.资源内容:HotSpot虚拟机对象探秘 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开
jvm 结构介绍、GC相关知识总结
每次调整时,jvm会对堆进行一次完全的垃圾收集。 使用-XX:MaxPerSize标志来增加永久域搭大小。在WebLogic Server应用程序加载较多类时,经常需要增加永久域的最大值。当jvm加载类时,永久域中的对象急剧增加,从而...
官网英文文档介绍GC的各个版本发展、GC选取、调优参数等; 当前压缩包为官网文档截图文件集合,个人觉得资源珍贵且比网上各个帖子更有参考价值,故存储自用并分享。
jvm调优.zip
资源概要:JVM基础知识;类加载子系统;运行时数据区;对象的创建流程与内存分配; 对象内存布局;如何访问一个对象;GC基本原理;串行收集器;并行收集器; 能学到什么:1,JVM底层运行机制和原理;2JVM参数;3,...
JVM,JVM内存结构、HotSpot 虚拟机对象探秘、垃圾收集策略与算法、HotSpot 垃圾收集器、内存分配与回收策略、JVM 性能调优、类文件结构。。
JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧