码迷,mamicode.com
首页 > 其他好文 > 详细

JVM之基本结构

时间:2018-07-20 22:27:02      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:垃圾回收   年龄   寄存器   java程序   str   注意   栈帧   lan   空间不足   

1. Java虚拟机的架构

技术分享图片

    1.1 Java的NIO库允许Java程序使用直接内存,访问直接内存的速度优于Java堆。出于性能的考虑,读写频繁的场合会考虑使用直接内存。

    1.2 本地方法栈和Java栈非常类似,最大的不同在于Java栈用于Java方法的调用,而本地方法栈用于本地方法的调用。

    1.3 PC 寄存器: Program Counter寄存器

    1.4 在任意时刻,一个Java线程总是在执行一个方法。如果这个方法不是本地方法,PC寄存器就会指向当前正在被执行的指令;如果这个方法是本地方法,PC寄存器的值是undefined。

 

2.Java堆

    2.1 结构:根据垃圾回收机制的不同,Java堆可能有不同的结构。最常见的一种结构是将Java堆分为新生代和老年代

技术分享图片    2.2 流程:

        在绝大多数情况下,对象首先会分配到eden区,在一次新生代回收后,如果对象还存活,会进入s0或则s1区;之后,每经历一次新生代回收,如果对象还存活,则年龄加1。年龄达到一定条件后,会被认为是老年对象,进入老年代。

技术分享图片

 

 

 3.Java栈

    3.1栈帧出入栈【函数调用】过程

技术分享图片

        3.1.1 出栈顺序:先入后出

        3.1.2 每次函数调用的数据都是通过Java栈传递的。

        3.1.3 Java栈中保存的主要内容是是栈帧。[栈帧中保存着当前函数的局部变量中间运算结果等数据]。

    3.2 Java栈基本构架

技术分享图片

        3.2.1 栈帧至少包含局部变量表操作数栈帧数据区

    3.4 当栈空间不足时,函数调用无法继续,系统会抛出StackOverflowError栈溢出错误。【可以通过-Xss设置线程的最大栈空间

    3.5 StackOverflowError演示【递归死循环】

package com.blueStarWei.jvm;

public class StackOverflowError {

    private static int count = 0;
    
    public static void main(String[] args) {
        try{
            recursion();            
        }catch(Throwable e){
            System.out.println("deep of calling : "+count);
            e.printStackTrace();
        }
    }
    
    public static void recursion(){
        count++;
        recursion();
    }
}

   3.5.1 日志输出

//根据-Xss配置的参数不同,被调用的次数会不同
deep of calling : 31661
java.lang.StackOverflowError
    at com.blueStarWei.jvm.StackOverflowError.recursion(StackOverflowError.java:18)

 

4. 局部变量表

    4.1 槽位复用

        4.1.1 含义:如果局部变量A超出其作用域,那么在其作用域之后局部变量B复用A的槽位

        4.1.2 优点: 节省资源

        4.1.3 注意:如果A作用域之后没有新的变量,A不会从局部变量表中移除【可以使用-XX:+PrintGC查看GC信息,判断是否触发GC

//局部变量a仍然存在于局部变量表中,不会触发GC
public void localGC1(){
    {
        byte[] a = new byte[6*1024*1024];            
    }
    System.gc();
}

//局部变量a的槽位已经被局部变量b复用,触发GC[回收局部变量a]
public void localGC2(){
    {
        byte[] a = new byte[6*1024*1024];            
    }
    int b = 0;
    System.gc();
}

 

JVM之基本结构

标签:垃圾回收   年龄   寄存器   java程序   str   注意   栈帧   lan   空间不足   

原文地址:https://www.cnblogs.com/BlueStarWei/p/9313584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!