Java虚拟机

来源:互联网 发布:百通世纪免费网络视频 编辑:程序博客网 时间:2024/06/18 07:49

1、JDK目录结构

http://www.th7.cn/Program/java/201306/138877.shtml




2、 Java程序的启动过程?

http://blog.csdn.net/jun55xiu/article/details/6325518




写了一段代码,编译器编译成为字节码文件.class,然后运行的时候,创建java虚拟机,然后加载类,类加载bootstrap,然后加载extclassloader,apiclassloader。加载了用户类之后。执行代码,执行的代码的时候会开一个线程,然后又线程栈,里面存储局部变量等,然后还有程序计数器,也是以线程为单位的,可以知道字节码当前运行到哪一行。然后对于初始化的变量,然后存放在堆里面。在栈里面运行的内容可以知道自己指向的堆里面的对象在哪,知道对象的方法区中的方法在哪。对于常量和静态方法等都是存放在方法区的。


3、 Java内存管理?[此部分引用较多,可参看原博文]

http://liu1227787871.blog.163.com/blog/static/205363197201263103320466/

1、  java程序可以分为java程序,java虚拟机和操作系统三个层次。Java程序与虚拟机打交道,虚拟机和操作系统打交道。程序运行前,jvm申请一定的内存,运行时,jvm负责分配java程序的内存,如果初始化的内存不够,那么jvm可以继续向操作系统申请内存直到最大可申请内存。

2、  可以通过runtime获取内存的一些数据。

3、  Jvm会将申请到的内存分为三部分:

方法区:用于存储加载进来的java类,类的属性和方法以及静态成员等内容。

堆:用于存储对象的属性,可以理解为对象的属性存储在堆中,对象的方法存储在方法区。

栈:每当出现方法调用的时候,会在栈用开辟一块空间用于存储局部变量,引用等,方法结束后,该块内存释放。





4、 深入内存区域?[此部分引用较多,可参看原博文]

http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html

http://www.cnblogs.com/gw811/archive/2012/10/18/2729490.html









5、 JVM?



6、 类加载器?

http://www.cnblogs.com/chenying99/archive/2013/04/02/2994642.html

继承ClassLoader类,重写findClass方法,在其构造函数里面可以通过super()或者super(classloader)来指明其父加载器。在调用loadClass的时候,先看其父加载器能否加载到类,如果加载不到,那么自己再加载。

子加载器可以看到父加载器加载的所有类,而父类是看不到子类的。如果没有直接或者间接父子关系的加载器加载的类是彼此不可见的,但是可以通过java的反射机制获取类的属性和方法。

一般重写loadclass的时候都是说我想要存在相同全名的类可以有两份,和正常的双亲代理不同,这个从底部的类加载器开始加载。这样是为了保证不同的应用所使用的类不会有冲突。








0 0