- 浏览: 20790 次
- 性别:
- 来自: 北京
-
最新评论
-
milk_36:
很巧,最近和楼主遭遇很类似.之前我也是做手游mmorpg.现在 ...
sns的服务器架构设计 -
134564:
论坛规则小测验
明珠首月
目标:
1、 程序在内存中的经历。
2、 静态类,内部类,静态内部类。在虚拟机里是什么形状的。
3、 变量,常量,静态常量,final静态常量,在虚拟机里是什么样子
4、 锁机制是怎么实现的
虚拟机分为三大系统: 类装载器、 运行时数据区、 执行引擎。
我的问题主要集中在虚拟机运行时数据区这块
第一个问题: 程序的经历
分析这段程序:
public class Test { public double[] spaceStone = new double[10000]; public static void main(String[] args) throws InterruptedException { String s = "1"; List<Test> list = new ArrayList<Test>(); int t1 = 0; for(;;) { Test t = new Test(); list.add(t); System.out.println(" " + t1++); Thread.sleep(100); } } }
当程序运行时这段代码的类文件将被类加载器加载到 运行时数据区中的方法区
下面汇总一下都是些什么东西存进去了。
javap Test 生成字节码
Compiled from "Test.java"
public class com.myjava.test.Test extends java.lang.Object 1、该类型的全限定名; 2、 直接超类的全限定名; 3、是一个类;4、是public的; SourceFile: "Test.java" minor version: 0 major version: 50 Constant pool: // 4、常量池; const #1 = Method #20.#36; // java/lang/Object."<init>":()V const #2 = Field #6.#37; // com/myjava/test/Test.spaceStone:[D const #3 = String #38; // 1 const #4 = class #39; // java/util/ArrayList const #5 = Method #4.#36; // java/util/ArrayList."<init>":()V const #6 = class #40; // com/myjava/test/Test const #7 = Method #6.#36; // com/myjava/test/Test."<init>":()V const #8 = InterfaceMethod #41.#42; // java/util/List.add:(Ljava/lang/Object;)Z const #9 = Field #43.#44; // java/lang/System.out:Ljava/io/PrintStream; const #10 = class #45; // java/lang/StringBuilder const #11 = Method #10.#36; // java/lang/StringBuilder."<init>":()V const #12 = String #46; // const #13 = Method #10.#47; // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; const #14 = Method #10.#48; // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; const #15 = Method #10.#49; // java/lang/StringBuilder.toString:()Ljava/lang/String; const #16 = Method #50.#51; // java/io/PrintStream.println:(Ljava/lang/String;)V const #17 = long 100l; const #19 = Method #52.#53; // java/lang/Thread.sleep:(J)V const #20 = class #54; // java/lang/Object const #21 = Asciz spaceStone; const #22 = Asciz [D; const #23 = Asciz <init>; const #24 = Asciz ()V; const #25 = Asciz Code; const #26 = Asciz LineNumberTable; const #27 = Asciz main; const #28 = Asciz ([Ljava/lang/String;)V; const #29 = Asciz StackMapTable; const #30 = class #55; // java/lang/String const #31 = class #56; // java/util/List const #32 = Asciz Exceptions; const #33 = class #57; // java/lang/InterruptedException const #34 = Asciz SourceFile; const #35 = Asciz Test.java; const #36 = NameAndType #23:#24;// "<init>":()V const #37 = NameAndType #21:#22;// spaceStone:[D const #38 = Asciz 1; const #39 = Asciz java/util/ArrayList; const #40 = Asciz com/myjava/test/Test; const #41 = class #56; // java/util/List const #42 = NameAndType #58:#59;// add:(Ljava/lang/Object;)Z const #43 = class #60; // java/lang/System const #44 = NameAndType #61:#62;// out:Ljava/io/PrintStream; const #45 = Asciz java/lang/StringBuilder; const #46 = Asciz ; const #47 = NameAndType #63:#64;// append:(Ljava/lang/String;)Ljava/lang/StringBuilder; const #48 = NameAndType #63:#65;// append:(I)Ljava/lang/StringBuilder; const #49 = NameAndType #66:#67;// toString:()Ljava/lang/String; const #50 = class #68; // java/io/PrintStream const #51 = NameAndType #69:#70;// println:(Ljava/lang/String;)V const #52 = class #71; // java/lang/Thread const #53 = NameAndType #72:#73;// sleep:(J)V const #54 = Asciz java/lang/Object; const #55 = Asciz java/lang/String; const #56 = Asciz java/util/List; const #57 = Asciz java/lang/InterruptedException; const #58 = Asciz add; const #59 = Asciz (Ljava/lang/Object;)Z; const #60 = Asciz java/lang/System; const #61 = Asciz out; const #62 = Asciz Ljava/io/PrintStream;; const #63 = Asciz append; const #64 = Asciz (Ljava/lang/String;)Ljava/lang/StringBuilder;; const #65 = Asciz (I)Ljava/lang/StringBuilder;; const #66 = Asciz toString; const #67 = Asciz ()Ljava/lang/String;; const #68 = Asciz java/io/PrintStream; const #69 = Asciz println; const #70 = Asciz (Ljava/lang/String;)V; const #71 = Asciz java/lang/Thread; const #72 = Asciz sleep; const #73 = Asciz (J)V; { //方法区 public double[] spaceStone; 5、字段信息; public com.myjava.test.Test(); 6、方法信息; Code: Stack=2, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: aload_0 5: sipush 10000 8: newarray double 10: putfield #2; //Field spaceStone:[D 13: return LineNumberTable: line 18: 0 line 20: 4 public static void main(java.lang.String[]) throws java.lang.InterruptedException; 6、方法信息; Code: Stack=3, Locals=5, Args_size=1 0: ldc #3; //String 1 2: astore_1 3: new #4; //class java/util/ArrayList 6: dup 7: invokespecial #5; //Method java/util/ArrayList."<init>":()V 10: astore_2 11: iconst_0 12: istore_3 13: new #6; //class com/myjava/test/Test 16: dup 17: invokespecial #7; //Method "<init>":()V 20: astore 4 22: aload_2 23: aload 4 25: invokeinterface #8, 2; //InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z 30: pop 31: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream; 34: new #10; //class java/lang/StringBuilder 37: dup 38: invokespecial #11; //Method java/lang/StringBuilder."<init>":()V 41: ldc #12; //String 43: invokevirtual #13; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 46: iload_3 47: iinc 3, 1 50: invokevirtual #14; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 53: invokevirtual #15; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 56: invokevirtual #16; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 59: ldc2_w #17; //long 100l 62: invokestatic #19; //Method java/lang/Thread.sleep:(J)V 65: goto 13 LineNumberTable: line 23: 0 line 24: 3 line 25: 11 line 27: 13 line 28: 22 line 29: 31 line 30: 59 line 31: 65 StackMapTable: number_of_entries = 1 frame_type = 254 /* append */ offset_delta = 13 locals = [ class java/lang/String, class java/util/List, int ] Exceptions: 7、 异常表 throws java.lang.InterruptedException }
其余还可能会有:
●任何直接超接口的全限定名的有序列表。
●类静态变量。
●指向ClassLoader类的引用。任何类都需要被类装载器装入内存。如果是被用户自定义类装载器装载的,那么JVM必须在类型信息中存储对该装载器对象的引用。
●指向Class类的 引用。对于每一个被装载的类型,虚拟机都会相应的为它创建一个java.lang.Class类的实例,而且虚拟机还必须以某种方式把这个实例和存储在方 法区中的类型信息关联起来。
●方法表。 为了能快速定位到类型中的某个方法。JVM对每个装载的类型都会建立一个方法表,用于存储该类型对象可以调用的方法的直接引用,这些方法就包括从超类中继 承来的。
好了,终于把所有class二进制文件都读进来了, 下一步执行。
从哪开始呢?
main? static块?
当然,执行是从main方法开始的,但是加载的时候static块就完事了。
发表评论
文章已被作者锁定,不允许评论。
-
java的shutdown钩子
2011-12-01 11:21 1430线程内加个钩子 Runtime.getRuntime().ad ... -
分析"一个很伤脑的笔试题"
2011-12-01 11:11 1309int a=2; int b=a+3*a++; Syste ... -
利用创建JMock模拟session,packet等必要的类。并构建模拟类虚拟的返回值。执行HANDLER方法,截取方法参数来检测程序正确性
2011-10-09 17:02 1644需要的几个包. 只是编译时的lib,方在文件夹compile- ... -
杂<十三>
2011-10-09 17:01 6922011-9-30 自从搬家到石景山, 自己的时间少了很多. ... -
杂<十二>
2011-10-09 17:00 7762011-6-8 轩辕上线在即, 项目会议频开, bug解决 ... -
杂<十一>
2011-10-09 17:00 6679号 今天继续内部演示 演示功能几乎没变 12月 2 ... -
杂<十>
2011-10-08 17:25 66411月 4号 这周一演示,效果还不够满意,原因是稳定性和几 ... -
杂<九>
2011-10-08 17:25 65419号 昨天周一,大家开始根据效果图画细节了, 下午请了2个 ... -
杂<八>
2011-10-08 17:25 66214号 随着脚本的逐渐熟悉,对经常用的组件已经比较熟练。 不 ... -
杂<七>
2011-10-08 17:25 7318号 上午进入了一下状态,没有能够写一些具体的东西。 遇到了 ... -
杂<六>
2011-10-08 17:25 65125号宣布负责商店的开发 下午申请权限,安装开发环境。 26 ... -
杂<五>
2011-09-30 10:41 692上周使用脚本开发了两个demo, 目标是使用现有脚本实现功能, ... -
杂<四>
2011-09-30 10:38 772实现了两个可以运行的小例子 第一个是可以往返跑的小人,另一个是 ... -
杂<三>
2011-09-30 10:34 653开始使用JO集成开发工具来学习脚本。 脚本系统的实现似乎就是 ... -
杂<二>
2011-09-30 10:33 580没有等到有关脚本系统的任何信息,自己在下午看了一下实现脚本系统 ... -
杂<一>
2011-09-30 10:32 6192010年9月15日 上午办入职手续,剑鸿交代熟悉公司内网, ... -
hibernate
2010-11-06 21:04 749晚上开始写邮件部分,看了代码。像是用hibernate做 ... -
阶段总结
2010-10-30 18:42 665这周家里来人,很多事凑一块了。 正好原定28号的演示推迟 ... -
明珠首月
2010-10-16 11:13 794明珠首月 到明珠已经一个月了, 这 ... -
cygwin
2010-06-30 12:27 687看了修炼之道中一片讲cygwin的
相关推荐
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...
Java OCR(Optical Character Recognition,光学字符识别)技术是一种计算机视觉领域的应用,它能将图像中的文字转换成可编辑的文本格式。这项技术在各种场景下都有广泛应用,比如文档扫描、车牌识别、发票处理等。...
Java API文档是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)中的所有类、接口、方法和常量的详细说明。这份中文网页版的Java API文档为中国的开发者提供了便利,无需通过英文版本来学习和查找API信息,...
java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java...
JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...
### Java基础知识概述 #### 1. 前言 Java是一种广泛使用的面向对象的编程语言,因其跨平台性、安全性和强大的功能而受到欢迎。Java的设计理念是“一次编写,到处运行”,这意味着编写的Java程序可以在任何安装了...
java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
java简易小游戏java简易小游戏java简易小游戏java简易小游戏 java简易小游戏java简易小游戏java简易小游戏java简易小游戏 java简易小游戏java简易小游戏java简易小游戏java简易小游戏 java简易小游戏java简易小游戏...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JavaCV(Java Computer Vision)是一个基于Java的计算机视觉库,它为Java和Android开发者提供了方便的接口来使用多个流行的计算机视觉框架,如OpenCV、FFmpeg等。在本项目中,我们将探讨如何配置JavaCV以及如何使用...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...
HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...
### Java 错误处理:java.lang.OutOfMemoryError: Java heap space 在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang....