...

Callwoola

大雄'blog

Home 主页 Blog 博客 Tag标签 GitHub开源 about me关于我


JVM 一些关键词讲解

程序计数器(Program Counter Register)

程序计数器(Program Counter (PC))是在电脑处理器中的一个寄存器, 用来指示电脑下一步要运行的指令序列。

依照特定机器的细节而不同,他可能是保存着正在被运行的指令,也可能是下一个要运行指令的地址。

程序计数器在每个指令周期会自动地增加,所以指令会正常地从寄存器中连续地被取出。

某些指令,像是跳跃和子程序调用,会中断程序执行的序列,将新的数值内容存放到程序计数器中。

对于一个运行中的Java程序而言,其中的每一个线程都有自己的PC,在线程启动时创建,大小是一个字长。

由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的, 在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。

因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,

各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

如果线程正在执行的是一个Java方法, 这个计数器记录的是正在执行的虚拟机字节码指令的地址; 如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。

此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

类加载子系统

JVM中类加载器有两种:

启动类加载器(Bootstrap ClassLoader)

是JVM实现的一部分。这个类负责将存放在\lib目录中的, 或者被-Xbootclasspath参数所指定的路径中的, 并且是虚拟机识别的(如 rt.jar,)

类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用,

其他的类加载器(ClassLoader Objects)

这些类加载器对象是运行中程序的一部分,都由Java实现,独立于虚拟机外部, 并且全部集成自java.lang.ClassLoader。

这部分类加载器由可以细分以下几种:

jvm struct

双亲委派模型(Patterns Delegation Model)

下面是java.lang.ClassLoader中loadClass的实现:

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // First, check if the class has already been loaded
        Class c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    c = parent.loadClass(name, false);
                } else {
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }

            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                long t1 = System.nanoTime();
                c = findClass(name);

                // this is the defining class loader; record the stats
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}
  • 文档信息:
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 发表日期: 2017-07-2017:56:18+0800
  • 更多内容:
  • Feed订阅:
相关内容:

disqus评论区:

0