JVM Tips

作者: Ary_zz | 来源:发表于2020-01-03 11:48 被阅读0次

2020-01-03

线程私有的JVM区域

image.png

程序计数器

  • 字节码解释器工作时通过改变计数器的值来选取下一条需要执行的字节码指令

虚拟机栈

  • 每个方法的执行都会创建一个栈帧到虚拟机栈
  • 写递归溢出时就发生在这里

本地方法栈

  • 服务于Native方法

所有的对象实例以及数组都要在堆上分配,Java堆是垃圾收集器管理的主要区域
由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中,是方法区的一部分
一个对象的成员变量,不管他是原始类型还是包装类型,都会被存贮在堆区

Class a = new Class();

此时a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。
Java内存模型允许编译器和处理器对指令进行重排序,虽然重排序不会影响到单线程的正确性,但是会影响到多线程的正确性。

为什么有2个suivivor区

http://ifeve.com/jvm-yong-generation/
年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

因为新生代gc比较频繁、对象存活率低,用复制算法在回收时的效率会更高,也不会产生内存碎片。但复制算法的代价就是要将内存折半,为了不浪费过多的内存,就划分了两块相同大小的内存区域survivor from和survivor to。在每次gc后就会把存活对象给复制到另一个survivor上,然后清空Eden和刚使用过的survivor。

相关文章

网友评论

      本文标题:JVM Tips

      本文链接:https://www.haomeiwen.com/subject/lxlzoctx.html