精华内容
下载资源
问答
  • <p>int a=6; if(a=2) printf(“%d\n”,a); else printf(“%d\n”,a+1); return 0;</p>
  • 当不是抢占式的调度时,高优先级的线程将在当前线程终止,得到优先的执行权。 调用sleep方法,当前线程j进入阻塞状态,sleep执行完成重新进入就入就绪状态 线程结束的三个原因: 1、run方法执行完成,线程正常...

    在这里插入图片描述
    当一个优先级高的线程进入就绪状态时,当前线程执行时,如果是抢占式的调度方式,是会暂停当前线程的执行的,当仍然不是终止它的执行。当不是抢占式的调度时,高优先级的线程将在当前线程终止后,得到优先的执行权。
    调用sleep方法,当前线程j进入阻塞状态,sleep执行完成后重新进入就入就绪状态

    线程结束的三个原因: 1、run方法执行完成,线程正常结束 2、线程抛出一个未捕获的Exception或者Error 3、直接调用该线程的Stop方法结束线程(不建议使用,容易导致死锁)

    当创建一个新的线程时,该线程也加入到了抢占cpu执行权的队伍中,但是是否能抢到,并不清楚
    在这里插入图片描述
    父类没有无参构造函数,z子类需要显示调用父类的有参构造函数,super(形参);
    子类第一行都有默认的super( );
    在这里插入图片描述
    1)此处是类对方法的调用,不是对象对方法的调用。
    2)方法是static静态方法,直接使用"类.方法"即可,因为静态方法使用不依赖对象是否被创建。
    null可以被强制类型转换成任意类型(不是任意类型对象),于是可以通过它来执行静态方法。
    3)非静态的方法用"对象.方法"的方式,必须依赖对象被创建后才能使用,若将testMethod()方法前的static去掉,则会报 空指针异常 。此处也验证了2)的观点
    在这里插入图片描述
    本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上),下面的讨论都不针对新开辟对象的情况:
    1、基本型和基本型封装型进行“”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
    2.Integer的
    比较应该与其声明方式与值范围有关.像Integer a = new Integer(3),这样声明的两个Integer对象==比较返回的应该是false.因为堆中指向不同的地址值.但是像用Integer b = 3这样声明的,只要在-128127的范围内时==比较返回的是true,这是因为在方法去存在一个数组,存储着-128127的数,这时b的值是直接指向方法区的地址值.
    3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
    4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

    展开全文
  • 图3-25 程序3-18运行结果 测试结果: 无法访问此网站 localhost 意外终止了连接。 请试试以下办法: 检查网络连接 检查代理服务器和防火墙 运行 Windows 网络诊断 ERR_CONNECTION_CLOSED
  • 上面是程序运行是没问题的,但是有个小问题,就是我在执行程序后要输入两个字母才能得到结果。举个例子,我想让h变成 l,理论上我只要在程序上打h按回车就行了,但是上面这个程序不仅需要我输入h,还要我输入一个...
  • 作者就层遇到很多坑最近遇到的一个问题就是输出问题,虽然不影响输出结果但就是看起来不顺眼,现在我将问题,描述如下 这就是遇到的问题输出不在正常的run中,直接输出到控制台了也不知道怎么搞的,查阅相关资料...

      问题描述
      Pycharm是一款很好用的IDE,但是有一些细节问题需要我们注意。作者就层遇到很多坑最近遇到的一个问题就是输出问题,虽然不影响输出结果但就是看起来不顺眼,现在我将问题,描述如下
    就是输出不在run中了
      这就是遇到的问题输出不在正常的run中,直接输出到控制台了也不知道怎么搞的,查阅相关资料后下面说一下解决方案直接上图:
      1、
    在这里插入图片描述
      2、点击框出来的这里进去页面
    在这里插入图片描述
      3、最后一步把这个框起来的对号去掉就好了。
      特别注意这只是改了一个py文件,如果创建新的py文件还是会在控制台输出所以要从根源上解决问题,下面附上解决方法
    在这里插入图片描述
      还是在原来改RUN的那个地方改进默认模板,这样的话才会完整的解决这个问题

    参考文献
    1、参考解决方案

    展开全文
  • 【单选题】某个 main() 方法中有以下代码: 请问以上程序编译运行后结果是【单选题】给定如下 Java 代码,编译运行时,结果是_________ 。【单选题】下面 正确 的表达式是 ________ 。【单选题】下列程序输出结果为...

    【单选题】某个 main() 方法中有以下代码: 请问以上程序编译运行后的结果是

    【单选题】给定如下 Java 代码,编译运行时,结果是_________ 。

    【单选题】下面 正确 的表达式是 ________ 。

    【单选题】下列程序的输出结果为_________ 。

    【单选题】下列程序运行的结果是

    【判断题】在嵌套循环中,内层循环和外层循环不能交叉。( )

    【单选题】给定如下 Java 代码,编译运行时,结果是_________ 。

    【单选题】下列哪个赋值语句是不正确的________ 。

    【单选题】若定义有变量 float f1,f2 = 8.0F, 则下列说法正确的是 ________ 。

    【单选题】关于选择结构,下列说法正确的是_________ 。

    【单选题】下面程序段的输出结果为___________________。

    【单选题】以账簿记录为依据,采用表格和文字形式将会计信息提供给使用者的书面文件是( )

    【单选题】下列创建数组的语句中正确的是

    【单选题】当一个char型变量a和一个int型变量b进行混合运算时,正确的说法是____________________。

    【单选题】给定如下程序,编译运行,错误出现在_________ 。

    【单选题】有如下程序段,下列说法正确的是_________ 。

    【单选题】若 intArray 为整型数组,i 为整型变量,则下列有关数组元素的访问方法中错误的是

    【其它】项目一 C语言编程基础 1. 熟悉 Dev c++ 集成环境。调试一个 HelloWorld 的程序。 2. 字符数据的输入与输出,编写一个输入与输出字符练习的程序。 3. 格式输入与输出,编写一个可输入整型数据和实型数据的程序。 具体请参看我们的第一次实训指导书,自己写的程序也可以一同提交,请大家将程序的逐句的讲解,程序讲解拍成视频,同时程序拍成照片,提交。 交程序照片(没机器的课后可总结写到笔记本上或作业本上,然后拍照) 交程序逐条讲解视频(没机器的课 后可总结写到笔记本上或作业本上,一边拿着本子讲解一边拍,机房里面拍了的,讲解清楚的视频也可以 )

    【简答题】

    【单选题】下面哪项可以得到一维数组元素的个数,Java 中定义数组名为 abc

    【单选题】下面程序代码段执行后输出结果是_________ 。

    【单选题】下面代码段的输出结果是_________ 。

    【单选题】分析如下程序段,输出结果为_________ 。

    【单选题】在以下整型常量的表示方法中,不正确的是________ 。

    【判断题】在多重循环中,可以使用break语句控制跳转出相应的嵌套层次;使用continue语句控制跳转到相应的嵌套层次

    【简答题】3.通过二维数组实现,统计四个同学的五门学科的成绩(c,c#,java,html,sql). 要求1:求出全班单科成绩的总成绩和平均成绩,并存放到一个二维数据中。 要求2:求出每位同学的的总成绩和平均成绩,并存放到一个二维数据中。

    【判断题】当 continue和标号一起使用时,其含义是结束标号标记的那重循环的当次循环。( )

    【单选题】对于语句“float s;”,能正确得到1.5的赋值语句是____________________。

    【单选题】有 Java 语句“int[] a,b=new int[3];”,则说法正确的是

    【单选题】下列关于数组的描述错误的是

    【单选题】下列程序的输出结果是_________ 。

    【单选题】定义 3 个整型数组 a1、a2、a3,下面声明正确的语句是

    【判断题】在循环语句中,break可以立即结束当次循环而执行下一次循环。 ( )

    【单选题】执行下面的 for 循环后,a[5] 的值是 int[] a = new int[10]; a[0] = 0; for (int i = 1; i < 10; i++) { a[i] = a[i – 1] + i; }

    【单选题】数组元素之所以相关,是因为它们具有相同的

    【单选题】设 a、b 为 long型变量,x、y 为 float型变量,ch为 char类型变量,且它们均已被赋值,则下列语句中正确的是__________。

    【单选题】在下列 Java 的基本数据类型中,所占字节数最少的是 ________ 。

    【判断题】break语句和continue语句只能用于循环语句中。( )

    【简答题】通过学习文件这一章,完成对文件的读,与写的操作。 将结构体的练习也一起提交到这个部分!!

    【简答题】1工资 2库存 3解密 等 都参看实训文档

    【单选题】企业对融资租入的固定资产视同自有固定资产进行会计核算,符合会计信息质量的( )要求

    【多选题】有关会计基本职能的关系,下列说法中正确的有( )

    【单选题】下面程序说法正确的是

    【单选题】下列程序的运行结果是______________________。

    【简答题】2.已知有一个已被初始化的字符串:char strarray[]="This is an cup.";要求将里面多余的字母‘n’去除后重新保存,然后再输出这个字符中数组.

    【单选题】下列________表达式的值为真。

    【单选题】假设 a是 int类型的变量,并初始化为 3,则下列_________ 是合法的条件语句。

    【简答题】1.注册QQ账号,用字符数组存放注册QQ号码及密码。然后再提示用户登录,用户从键盘输入,最后再判断登录成功。

    【单选题】下面程序的执行结果是_________ 。

    【单选题】程序段“for(int i=0; i<=3; ++i){System.out.print("a");}”,输出语句共执行_________ 次。

    展开全文
  • 一个java程序是怎样运行起来的(2)

    千次阅读 2017-11-28 22:37:48
    接上一篇---- 一个java程序是怎样运行起来的(1),当我们执行java Test程序会在控制台输出我们想要的结果,那么这个过程中经历了些什么呢?我们知道,java程序要想运行起来,必须建立在java虚拟机上。下面结合...

    接上一篇---- 一个java程序是怎样运行起来的(1),当我们执行java Test后,程序会在控制台输出我们想要的结果,那么这个过程中经历了些什么呢?我们知道,java程序要想运行起来,必须建立在java虚拟机上。下面结合hotspot vm(sun实现的java虚拟机)简单看下执行java Test命令后,java虚拟机的处理过程。

     在执行java Test命令后,会去启动java虚拟机来执行程序,在启动java虚拟机之前有一些初始化的工作需要进行

    1、创建java虚拟机环境前期的一些准备工作

    hotspot vm的入口在 java.c 中,当执行java Test 时,首先进入到java.c的main方法

    /*
     * Entry point.省略掉了部分代码
     */
    int
    main(int argc, char ** argv)
    {
        char *jarfile = 0;
        char *classname = 0;
        char *s = 0;
        char *main_class = NULL;
        ............
    
        CreateExecutionEnvironment(&argc, &argv,
                                   jrepath, sizeof(jrepath),
                                   jvmpath, sizeof(jvmpath),
                                   original_argv);
    
        printf("Using java runtime at: %s\n", jrepath);
    
        if (!LoadJavaVM(jvmpath, &ifn)) {
          exit(6);
        }
    
        /* Set default CLASSPATH */
        if ((s = getenv("CLASSPATH")) == 0) {
            s = ".";
        }
    #ifndef JAVA_ARGS
        SetClassPath(s);
    #endif
    
        /*
         *  Parse command line options; if the return value of
         *  ParseArguments is false, the program should exit.
         */
        if (!ParseArguments(&argc, &argv, &jarfile, &classname, &ret, jvmpath)) {
          exit(ret);
        }
    
        /* Override class path if -jar flag was specified */
        if (jarfile != 0) {
            SetClassPath(jarfile);
        }
    
        /* set the -Dsun.java.command pseudo property */
        SetJavaCommandLineProp(classname, jarfile, argc, argv);
    
        /* Set the -Dsun.java.launcher pseudo property */
        SetJavaLauncherProp();
    
        /* set the -Dsun.java.launcher.* platform properties */
        SetJavaLauncherPlatformProps();
    
        { /* Create a new thread to create JVM and invoke main method */
          .........
    
          return ContinueInNewThread(JavaMain, threadStackSize, (void*)&args);
        }
    }
    

    1.1、首先是创建执行执行环境,主要的过程在CreateExecutionEnvironment这个函数中,这个函数的实现在java_md.c文件

    void
    CreateExecutionEnvironment(int *_argcp,char ***_argvp,char jrepath[],jint so_jrepath,char jvmpath[],jint so_jvmpath,char **original_argv) {
      /*
       * 省略部分代码
       */
    
        char *execname = NULL;
        int original_argc = *_argcp;
        jboolean jvmpathExists;
    
    	..............
    
      { char *arch = (char *) ARCH; /* like sparc or sparcv9 */
        char *p;
    
        if (!GetJREPath(jrepath, so_jrepath, arch, JNI_FALSE) ) {
          fprintf(stderr, "Error: could not find Java 2 Runtime Environment.\n");
          exit(2);
        }
    
        if (!GetJVMPath(jrepath, NULL, jvmpath, so_jvmpath, arch )) {
          fprintf(stderr, "Error: no JVM at `%s'.\n", jvmpath);
          exit(4);
        }
      }
    }
    这个函数主要干了两件事,一是寻找jre路径,在本人的机器上,这个jre路径是D:\java\jdk1.7.0_79\jre,二是寻找jvm路径,主要是找到jvm.dll的路径

    1.2、加载java虚拟机,主要在函数LoadJavaVM中实现:

    jboolean LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn)
    {
    	................
        Dl_info dlinfo;
        void *libjvm;
        libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);
        ..................
        ifn->CreateJavaVM = (CreateJavaVM_t)
          dlsym(libjvm, "JNI_CreateJavaVM");
        if (ifn->CreateJavaVM == NULL)
            goto error;
    
        ifn->GetDefaultJavaVMInitArgs = (GetDefaultJavaVMInitArgs_t)
            dlsym(libjvm, "JNI_GetDefaultJavaVMInitArgs");
        if (ifn->GetDefaultJavaVMInitArgs == NULL)
          goto error;
    
        return JNI_TRUE;
    
    }
    首先加载jvm.dll,windows下使用WinApi函数LoadLibrary函数来加载jvm.dll,接下来指定了使用 "JNI_CreateJavaVM" 创建java虚拟机,这个函数在jni.cpp,以及"JNI_GetDefaultJavaVMInitArgs"函数用于获取默认的java虚拟机初始化参数。

    1.3、设置jvm运行时需要用到的一些属性

    	SetClassPath(xxxx)
     /* set the -Dsun.java.command pseudo property */
        SetJavaCommandLineProp(classname, jarfile, argc, argv);
    
        /* Set the -Dsun.java.launcher pseudo property */
        SetJavaLauncherProp();
    
        /* set the -Dsun.java.launcher.* platform properties */
        SetJavaLauncherPlatformProps();

    1.4、创建一个新的线程去初始化jvm并执行java程序

    { /* Create a new thread to create JVM and invoke main method */
          struct JavaMainArgs args;
    
          args.argc = argc;
          args.argv = argv;
          args.jarfile = jarfile;
          args.classname = classname;
          args.ifn = ifn;
    
          return ContinueInNewThread(JavaMain, threadStackSize, (void*)&args);
        }
    该线程指定了执行的函数为JavaMain,这个函数在java.c文件中.

    到此,创建jvm前期的一些准备工作已经完成!!!

    2、创建java虚拟机

    创建java虚拟机的函数入口在java.c中:

    int JNICALL JavaMain(void * _args)
    {
        ..........
        if (!InitializeJVM(&vm, &env, &ifn)) {
            ReportErrorMessage("Could not create the Java virtual machine.",
                               JNI_TRUE);
            exit(1);
        }
    }
    static jboolean InitializeJVM(JavaVM **pvm, JNIEnv **penv, InvocationFunctions *ifn)
    {
        ........
        r = ifn->CreateJavaVM(pvm, (void **)penv, &args);
        JLI_MemFree(options);
        return r == JNI_OK;
    }
    还记得上面的ifn这个指针吧,ifn->CreateJavaVM(pvm, (void **)penv, &args);实际上是调用JNI_CreateJavaVM去完成虚拟机的初始化工作。

    JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
    	........................
      result = Threads::create_vm((JavaVMInitArgs*) args, &can_try_again);
      ......................
      return result;
    }

    java虚拟机的创建是一个比较复杂的过程,细节实现比较多,下面我们来简单看下其中的主要步骤,参见thread.cpp

    1,if (!is_supported_jni_version(args->version)) return JNI_EVERSION;校验当前jvm是否支持该版本

    2,ostream_init();初始化输出模块

    3,Arguments::process_sun_java_launcher_properties(args);处理java命令行中指定了“-Dsun.java.launcher”属性,

    4,os::init();初始化系统信息,如处理器个数,页文件大小等

    5,Arguments::init_system_properties();初始化system properties,

    // Initialize system properties key and value.
    void Arguments::init_system_properties() {
    	...........
      _java_ext_dirs = new SystemProperty("java.ext.dirs", NULL,  true);//初始化key--->value:"java.ext.dirs"---->null
      _java_endorsed_dirs = new SystemProperty("java.endorsed.dirs", NULL,  true);//"java.endorsed.dirs"---->null
      _sun_boot_library_path = new SystemProperty("sun.boot.library.path", NULL,  true);//"sun.boot.library.path"---->null
      _java_library_path = new SystemProperty("java.library.path", NULL,  true);//"java.library.path"--->null
      _java_home =  new SystemProperty("java.home", NULL,  true);//"java.home"---->null
      _sun_boot_class_path = new SystemProperty("sun.boot.class.path", NULL,  true);//"sun.boot.class.path"---->null
      _java_class_path = new SystemProperty("java.class.path", "",  true);//"java.class.path"---->""
    
      // Add to System Property list.
      PropertyList_add(&_system_properties, _java_ext_dirs);
      PropertyList_add(&_system_properties, _java_endorsed_dirs);
      PropertyList_add(&_system_properties, _sun_boot_library_path);
      PropertyList_add(&_system_properties, _java_library_path);
      PropertyList_add(&_system_properties, _java_home);
      PropertyList_add(&_system_properties, _java_class_path);
      PropertyList_add(&_system_properties, _sun_boot_class_path);
    
      // Set OS specific system properties values
      os::init_system_properties_values();
    }
    void os::init_system_properties_values() {
      /* sysclasspath, java_home, dll_dir */
      {
    	..............
          Arguments::set_java_home(home_path);//设置java_home,即上面的_java_home =  new SystemProperty("java.home", NULL,  true);"java.home"---->环境变量中配置的值
    	.........
          Arguments::set_dll_dir(dll_path);//"sun.boot.library.path"----->当前机器的dll路径,在本人机器上为D:\java\jdk1.7.0_79\jre\bin
    	  if (!set_boot_path('\\', ';'))//"sun.boot.class.path"---->classpath
              return;
      }
    	..............
        Arguments::set_library_path(library_path);//"java.library.path"--->环境变量path的值,以及windows目录,system目录
        ............
        Arguments::set_ext_dirs(buf);//"java.ext.dirs"---->本机上为D:\java\jdk1.7.0_79\jre\lib\ext
    	..................
        Arguments::set_endorsed_dirs(buf);//"java.endorsed.dirs"---->本机上为D:\java\jdk1.7.0_79\jre\lib\ext\endorsed
    }
    6,JDK_Version_init();初始化jdk版本信息

    7,Arguments::init_version_specific_system_properties();更新jdk特定system properties

    8,jint parse_result = Arguments::parse(args);解析参数

    9,jint os_init_2_result = os::init_2();//设置 stack_size,线程优先级等

    10,ThreadLocalStorage::init();初始化thread local storage,

    11,ostream_init_log();初始化日志输出

    12,vm_init_globals();初始化全局的数据结构并在堆上创建system classes

    void vm_init_globals() {
      check_ThreadShadow();
      basic_types_init();//初始化基本类型,比如int所能表示的最大值与最小值以及一个int占多少个字节
      eventlog_init();//初始化eventlog
      mutex_init();//初始化一堆的锁,比如gc lock等
      chunkpool_init();//初始化hotspotvm 内存池chunkpool
      perfMemory_init();//初始化jvm性能统计
    }
    13,创建一个java线程

    // Attach the main thread to this os thread
      JavaThread* main_thread = new JavaThread();
      main_thread->set_thread_state(_thread_in_vm);//线程在jvm中执行
      main_thread->record_stack_base_and_size();//记录线程的基址和大小
      main_thread->initialize_thread_local_storage();//初始化TLS
      main_thread->set_active_handles(JNIHandleBlock::allocate_block());//设置jni句柄
      if (!main_thread->set_as_starting_thread()) {
        vm_shutdown_during_initialization(
          "Failed necessary internal allocation. Out of swap space");
        delete main_thread;
        *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
        return JNI_ENOMEM;
      }
      // Enable guard page *after* os::create_main_thread(), otherwise it would
      // crash Linux VM, see notes in os_linux.cpp.
      main_thread->create_stack_guard_pages();
    14,ObjectMonitor::Initialize() ;初始化java对象监视器,关键字synchronized就是通过对象监视器实现的

    15,MemTracker::bootstrap_multi_thread();//当vm进入多线程模式时,create nmt lock for multi-thread execution

    16,jint status = init_globals();//初始化全局模块
          -----management_init();//init java.lang.management API support,vm创建信息,线程信息,运行时信息,类加载信息

          -----bytecodes_init();//初始化jvm指令集

          -----classLoader_init();//初始化classLoader

    void ClassLoader::initialize() {
      .........//初始化jvm性能统计的信息
      // lookup zip library entry points
      load_zip_library();
      // initialize search path
      setup_bootstrap_search_path();
      if (LazyBootClassLoader) {
        // set up meta index which makes boot classpath initialization lazier
        setup_meta_index();
      }
    }
    void ClassLoader::load_zip_library() {
      assert(ZipOpen == NULL, "should not load zip library twice");
      // First make sure native library is loaded
      os::native_java_library();//确保verify.dll,java.dll已加载
      // Load zip library
      char path[JVM_MAXPATHLEN];
      char ebuf[1024];
      os::dll_build_name(path, sizeof(path), Arguments::get_dll_dir(), "zip");
      void* handle = os::dll_load(path, ebuf, sizeof ebuf);//加载zip.dll
      if (handle == NULL) {
        vm_exit_during_initialization("Unable to load ZIP library", path);
      }
      // Lookup zip entry points
      ZipOpen      = CAST_TO_FN_PTR(ZipOpen_t, os::dll_lookup(handle, "ZIP_Open"));
      .................//获取zip.dll中有关函数的入口地址
      
      // Lookup canonicalize entry in libjava.dll
      void *javalib_handle = os::native_java_library();
      CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, os::dll_lookup(javalib_handle, "Canonicalize"));//获取canonicalize入口地址
    }
    void ClassLoader::setup_bootstrap_search_path() {
      assert(_first_entry == NULL, "should not setup bootstrap class search path twice");
      char* sys_class_path = os::strdup(Arguments::get_sysclasspath());//获取system class path信息,在第5步中进行了初始化_sun_boot_class_path
      if (TraceClassLoading && Verbose) {
        tty->print_cr("[Bootstrap loader class path=%s]", sys_class_path);
      }
    
      int len = (int)strlen(sys_class_path);
      int end = 0;
    
      // Iterate over class path entries
      for (int start = 0; start < len; start = end) {
        while (sys_class_path[end] && sys_class_path[end] != os::path_separator()[0]) {//解析路径字符串
          end++;
        }
        char* path = NEW_C_HEAP_ARRAY(char, end-start+1, mtClass);
        strncpy(path, &sys_class_path[start], end-start);
        path[end-start] = '\0';
        update_class_path_entry_list(path, false);//将路径信息添加到ClassPathEntry中,ClassPathEntry是一个链表
        FREE_C_HEAP_ARRAY(char, path, mtClass);
        while (sys_class_path[end] == os::path_separator()[0]) {
          end++;
        }
      }
    }
    //此步骤后,等于告诉了jvm bootclassloader的搜索路径,后续用来加载这些路径下的class文件

           ----codeCache_init();//初始化代码缓存

           ----VM_Version_init();//初始化vm版本

           ----os_init_globals();//初始化os额外的全局信息,目前从代码上看应该是没有额外的处理

           ----stubRoutines_init1();//初始化stubRoutines,便于在c文件中调用java代码

           ----jint status = universe_init();//java堆初始化

    jint universe_init() {//比较复杂
      ........
      GC_locker::lock();  // do not allow gc during bootstrapping
      JavaClasses::compute_hard_coded_offsets();//计算硬编码偏移,如Throwable中各个变量的offset,该方法计算了Throwable Class,java_lang_boxing_object,java_lang_ref_Reference,java_lang_ref_SoftReference Class,java_lang_ClassLoader,java_lang_System,java_lang_StackTraceElement中成员变量的offset.
    	...................
      jint status = Universe::initialize_heap();//堆初始化
      if (status != JNI_OK) {
        return status;
      }
      
      // We have a heap so create the methodOop caches before
      // CompactingPermGenGen::initialize_oops() tries to populate them.
      Universe::_finalizer_register_cache = new LatestMethodOopCache();
      Universe::_loader_addClass_cache    = new LatestMethodOopCache();
      Universe::_pd_implies_cache         = new LatestMethodOopCache();
      Universe::_reflect_invoke_cache     = new ActiveMethodOopsCache();
    
        SymbolTable::create_table();//创建SymbolTable,大小360*1024
        StringTable::create_table();//创建StringTable,大小40
        ClassLoader::create_package_info_table();//创建 PackageHashtable,大小31
    
      return JNI_OK;
    }
    jint Universe::initialize_heap() {
    	.....................//针对不同的gc收集器使用不同的_collectedHeap,主要有ParallelScavengeHeap,G1CollectedHeap,GenCollectedHeap,
    	不同类型的collectedHeap有不同的收集策略,默认使用GenCollectedHeap,策略MarkSweepPolicy
      jint status = Universe::heap()->initialize();//GenCollectedHeap初始化,这个值得细细研究.....
      if (status != JNI_OK) {
        return status;
      }
      ................
      if (UseTLAB) {
        assert(Universe::heap()->supports_tlab_allocation(),
               "Should support thread-local allocation buffers");
        ThreadLocalAllocBuffer::startup_initialization();//初始化TLAB
      }
      return JNI_OK;
    }

    ,     ----interpreter_init();//初始化模板解释器,将所有字节码的目标代码生成函数和参数保存在_template_table,每个字节码、程序和函数的调用都要进行计数,后面细读后在分析,先看个大概

         ----invocationCounter_init();//初始化计数

         ----marksweep_init();//初始化标记整理,用于gc

         ----accessFlags_init();//初始化访问标志,just checking size of flags

         ----templateTable_init();//每个字节码对应有相应的汇编指令,所有字节码的template封装成templateTable,里面包含每个字节码指令的具体机器码映射

         ----SharedRuntime::generate_stubs();//

         ----universe2_init();  // dependent on codeCache_init and stubRoutines_init1
         ----referenceProcessor_init();
         ---jni_handles_init();
         ---vmStructs_init();
         ---vtableStubs_init();
         ---InlineCacheBuffer_init();
         ---compilerOracle_init();
         ---compilationPolicy_init();
         ---compileBroker_init();
         ---VMRegImpl::set_regName();
         ---if (!universe_post_init()) {
            return JNI_ERR;
      }
         ---javaClasses_init();   // must happen after vtable initialization
         ---stubRoutines_init2(); // note: StubRoutines need 2-phase init

    17,main_thread->cache_global_variables();//缓存全局变量

    18,// Create the VMThread

    19,//初始化jdk核心类,如java.lang.String,java.lang.Thread等

    ..............

    在java虚拟机初始化完成后,接下就该执行实际的java程序了

    ============================我是分割线===================================================

    hotspot vm是一个庞大的工程,涉及到的知识点太多。对于刚开始接触不久的我来说,是在是复杂。所以基于本人对jvm有限的理解(更多的可能是自己yy),尝试做一个简单的jvm实现,目前功能非常有限,正在慢慢积极的完善,github上地址:https://github.com/reverence/czvm




















    展开全文
  • // 输出结果的分隔符, 比如: 如果想要换行输出, 可以改为: \n // 有个特殊的例外, 如果设置为 gop, 则会输出 "xxx", "xxx" 样式 "OutputSeparator": "gop", // IP 或 IP 段文件...
  • // 加上下面程序(改变步长d)则运行停止工作,没有时运行良好? /* if((0.3*r[i])&&(X*r[i])) { d=0.7*d; if((0.6*r[i])&&(X*r[i])) d=0.4*d; if((0.9*r[i])&&(X[i])) d=0.1*d; }*/ ...
  • 任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出,程序运行后才能告诉用户任务的结果。输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,或者简写为...
  • 下列程序中函数append的功能是将b指向的数组前blen个元素中存储的一个升序数列(简称b数列)追加到a指向的数组前alen个元素中存储的一个降序数列(简称a数列)之后,合并的数列中前半部分是原a数列中的数据但改为...
  • 阅读分析下面程序后写出程序的运行结果 运行结果 2 6 12 20 2.写出以下程序的功能如果输入14写出程序的输出结果 输出结果no 3.阅读下面的程序并回答问题 1数组中a[10]号元素中存储的是什么字符? 答a[10]元素中存储的...
  • Python的输入和输出非常方便,下面详细记录一下任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出程序运行后才能告诉用户任务的结果。输入是Input,输出是Output...
  • 修改的代码其实也有问题,那就是虽然可以运行,但是假如在一个矩形内输出了n(n>1)行,那么只有第一行能被保留(啊啊啊,要疯了!!!) ## 最终预期功能 嗯,这里在重申一下,那个TextPrint函数是低配版的...
  • 修改的代码其实也有问题,那就是虽然可以运行,但是假如在一个矩形内输出了n(n>1)行,那么只有第一行能被保留(啊啊啊,要疯了!!!) ## 最终预期功能 嗯,这里在重申一下,那个TextPrint函数是低配版的...
  • 【单选题】以下赋值语句中合法的是【单选题】字符串:s= abcde',n=len(s)。...)的输出结果为( )【单选题】执行下面代码,程序运行的结果为:( )【单选题】下列表达式的值为True的是()【单选题】我们通过使用turt...
  • python学习-输入输出

    2019-03-01 16:00:00
    任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出程序运行后才能告诉用户任务的结果。输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,...
  • 运行结果对比输出(OJ_SHOW_DIFF)中提示每个数据点的结果(AC/WA/TLE...)。 11-16 优化 @muzea 开发了从 GitHub 到 Gitee 的同步机制,并部署了CI。 11-13 更新 在运行时错误(RuntimeError)中显示数据点...
  • 【单选题】以下程序运行后输出结果是: #include void main() { char *s="abcde"; s+=2; printf("%d\n",s);}【单选题】关于强制联想的描述,哪一项是错误的?【单选题】下面那个电子器件能够储存电场能( )。【单选题】...
  • %输出结果并绘图 figure(1); plotif=1; X=Xp; [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif); figure(2); plot(LC1); figure(3); plot(LC2); function [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif) % JSPGA的内联子函数,用于求...
  • Python的输入与输出

    2018-08-08 15:07:45
    任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出,程序运行后才能告诉用户任务的结果 input() 和 print() 是在命令行下面最基本的输入和输出 一 Python的输入 1)...
  • 思路是先找到最高点,然后在四周着比他低的最高点,长度加一,但是运行不了,不知错在哪 改为记忆化搜索代码提交总是runtimeerror,请问到底咋回事 ``` #include using namespace std; #define ...
  • 任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出程序运行后才能告诉用户任务的结果下面我们在Python交互模式进行一些简单的输入输出 开始 找到安装的...
  • 任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出程序运行后才能告诉用户任务的结果。输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,...
  • 程序没有使用p.StandardOutput.ReadtoEnd()和p.StandardOutput.ReadLine()方法来获得输出,因为这些方法执行画面容易卡死。而是通过调用异步方法BeginOutputReadLine来获取输出,并在事件p.OutputDataReceived的...
  • 以下为程序运行结果示例 x1=-0.5000 x2=-1.0000 输入格式: 无 输出格式:  "x1=%.4f\n"  "x2=%.4f\n" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 我的程序:#include #...
  • C#隐式运行CMD命令

    千次阅读 2015-06-09 14:50:12
    本文实现了C#隐式运行CMD命令的功能。...本程序没有使用p.StandardOutput.ReadtoEnd()和p.StandardOutput.ReadLine()方法来获得输出,因为这些方法执行画面容易卡死。而是通过调用异步方法BeginOutputReadLi
  • 任何计算机程序都是为了执行一个特定的任务,有了输入,用户才能告诉计算机程序所需的信息,有了输出程序运行后才能告诉用户任务的结果。 输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,...
  • '''一开始的符号总是得不到下面运行结果,总是有点错乱,其实是符号选择错误...... 后来在各个符号前后都留有空格。''' for h in range(1,12): for l in range(1,12): if h in [1,6,11] and l in [1,6,11]:
  • 把之前的程序导进来试运行下安装是否成功,发现控制台里的显示结果有乱码。乱码部分是一个目录的输出,这个目录里含有中文路径网上搜了下,有人说把下面图中的两个Encoding设置为UTF-8会解决这个问题。这么配置了下...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 359
精华内容 143
关键字:

下面程序运行后输出结果是