`

第一篇 初识Java虚拟机

    博客分类:
  • jvm
 
阅读更多

 

 

   一. Java虚拟机的基本结构以及各个部分的作用

          

 



       
每个区域各司其职


  • 1.     类加载系统负责从文件系统或者网络中加载class信息       
  • 2.     方法区存放加载的class信息
  • 3.     java堆存放几乎所有的对象实例。所有线程共享.
  • 4.     直接内存可以用java nio库来分配,直接内存访问速度优于堆内存,但是分配速度会慢,如果频繁读写,那么可以使用它.
  • 5.     Java栈是线程独用的,线程创建时会分配.里面保存着局部变量,方法参数。
  • 6.     本地方法栈用于本地方法调用
  • 7.     PC寄存器是每个线程的私有空间.如果一个线程正在执行的方法不是本地方法,它会指向当前正在被执行的指令.否则,它的值就是undefined.

 

     二.java 堆结构

 

       根据垃圾回收机制的不同,Java堆有不同的结构.最为常见的是java分为新生代和老年代.新生代又分eden,s0,s1,s0,s1也被称为fromto区域,他们大小相等.



 

              一个对象的分配过程可以这样来描述

 

  •        1.         new一个对象的时候会把它分配在eden,
  •        2.        进行一次回收后,如果这个对象还存在,会进入s0或者s1
  •        3.        之后没进行一次垃圾回收,它的年龄就会+1
  •        4.        当它达到一定年龄时,就会进入老年代

 

 

 

       三.函数如何调用

 

         java栈是先进后出的数据结构,主要保存的数据结构是栈帧。

         举例:假设函数1调用函数2函数2调用函数3,那么当函数1被调用时,入栈,函数2被调用时,入栈。以此类推, 一直执行,当前执行的函数对应的帧保存着当前函数对应      的局部变量,中间运算陈果.

          Java又两种返回函数方式,return和抛异常.

         一个栈帧中至少要包含局部变量表,操作数栈和帧数据.-Xss用来指定最大栈空间,它决定了函数调用最大深度.

         局部变量表中的参数个数也决定了函数最大调用深度.用不断递归调用自身的方法可以使得栈空间溢出.

          

         局部变量表
        
      
         里面包含了索引(index ),名字(name),数据类型(descriptor),里面的每一行代表一个槽位,如果一个局部变量过了作用域,那么再它之后申明的变量会复用这个槽位.

             举例说明加上这个参数查看gc情况.  -XX:+PrintGC


public  void local1(){
		//数组被a引用,不会回收
		byte[] a  =new byte [1024*1024];
		System.gc();}
	public  void local2(){
		//byte失去引用,顺利回收
		byte[] a  =new byte [1024*1024];
		a=null;
		System.gc();
	}
	public  void local3(){
		//虽然离开作用域,a仍然存在局部表量表
		{
		byte[] a  =new byte [1024*1024];
		}
		System.gc();
	}
	public  void local4(){
		//a的槽位被c占用
		{
		byte[] a  =new byte [1024*1024];
		}
		int c= 1;
		System.gc();
	}
	public  void local5(){
		//方法执行结束,栈空间弹出,栈帧被销毁
		local1();
		System.gc();
	}
	public static void main(String[] args) {
		LocalVarTableTest l = new LocalVarTableTest();
		l.local1();
	}

 

       栈上分配

       栈上分配是一项优化技术.对于那些不会被其他线程访问到的对象,直接打散分配在栈上.函数调用结束后自行销毁,不需要垃圾回收.

       它的一个技术基础是进行逃逸分析,判断对象的作用域是否能逃逸出函数体,例如,静态成员变量,以及return 返回.

      例子:jvm参数-server  -Xms10m -Xmx10m -XX:+PrintGC -XX:+DoEscapeAnalysis -XX:-UseTLAB -XX:+EliminateAllocations

      可以去掉-XX:+DoEscapeAnalysis -XX:-UseTLAB -XX:+EliminateAllocations

     

public class StackRunawayTest {
	private static class User{
		public int id =0;
		public String name="";
	}

	public static void alloc(){
		User u = new User();//对象头暂居8个字节
		u.id =1 ;//4个字节
		u.name="ffff";//4个字节
		//总共16个字节.
	}
	public static void main(String[] args) {
		for(int i = 0;i<3;i++){
			//创建1亿个对象,约等于1.5g,如果堆空间小于这个值可定会抛出异常
			alloc();
		}
	}
}

 试一试两种情况执行的效率以及GC的情况,你就会发现使用逃逸分析的效率明显高于不使用逃逸分析.

       方法区

         方法区在jdk1.61.7可以理解为永久区(Perm).默认是64M.用参数

     -XX:PermSize -XX:MaxPermSize设置.如果系统使用了动态代理,那么就会出现大量的类把空间撑爆。

     在jdk1.8,取而代之的是元数据区.用参数-XX:MaxMetaspaceSize指定.这个属于堆外直接内存,如果不指定大小,会耗尽所有内存.

  • 大小: 130.6 KB
  • 大小: 88.1 KB
  • 大小: 365.2 KB
分享到:
评论

相关推荐

    第一章 初识Java1

    - JVM(Java虚拟机)是Java程序执行的基础,它负责将源代码文件(`.java`文件)编译成字节码文件(`.class`文件),这些字节码文件可以在任何支持JVM的平台上运行,从而实现了Java的“一次编写,到处运行”的特性。...

    初识java,用springBoot学习java.rar

    JVM:java虚拟机,它是将java代码编译成机器语言,实现java的跨平台。 第一个JAVA程序HelloWorld 1.Java程序的最小单位是“类”,一个Java程序至少包含一个类。 2.Java程序的入口是main函数,main函数的写法是固定的

    初识JAVA的知识

    ### 初识JAVA的知识:配置Java环境变量于Windows 7 #### 一、Java与环境变量的重要性 Java作为一门跨平台的编程语言,其运行环境的配置至关重要。无论是开发还是运行Java程序,都需要确保系统中正确设置了Java环境...

    最新Java面试题

    #### 第一章 初识Java - **Java跨平台原理**:Java的跨平台特性主要得益于字节码文件(`.class`文件)和Java虚拟机(JVM)。Java程序编译成字节码文件后,由不同平台上的JVM解释执行这些字节码文件,从而实现了“一...

    深入理解Android:卷I--详细书签版

    5.2.1 第一板斧——初识影子对象 96 5.2.2 第二板斧——由弱生强 103 5.2.3 第三板斧——破解生死魔咒 106 5.2.4 轻量级的引用计数控制类LightRefBase 108 5.2.5 题外话——三板斧的来历 109 5.3 Thread类及...

    「入门篇」初识JVM (下下) - GC.doc

    对象自救是指在finalize()方法中让对象重新被引用,但这只会发生在第一次回收时,后续回收不会再次调用。 理解JVM的内存管理和垃圾收集机制对于优化Java应用的性能至关重要,尤其是在处理大量对象和复杂数据结构时...

    java核心技术I-II

    3. ** HelloWorld程序**:初识Java,编写第一个"Hello, World!"程序,理解编译和运行过程。 4. **基本语法**:包括数据类型(整型、浮点型、字符型、布尔型)、变量、常量、运算符的使用。 5. **流程控制**:条件...

    张孝祥Java就业培训教程.pdf

    1.1 Java虚拟机及Java的跨平台原理 1.2 Java开发环境的搭建 1.3 体验Java编程的过程 1.4 classpath的设置 1.5 有效利用Java的文档帮助 1.6 JVM(虚拟机)的运行过程 1.7 垃圾回收器 1.8 反编译工具的介绍 第2章 Java...

    第JAVA基础知识学习教案.pptx

    2. 编译和解释:Java代码首先被编译成字节码,然后在不同的平台上通过JVM(Java虚拟机)进行解释执行。 3. 自动无用内存回收:Java提供了垃圾回收机制,自动管理内存,避免了内存泄漏的问题。 4. 面向对象:Java是...

    java复习资料

    - **第一步:编写源程序** 使用文本编辑器或集成开发环境(IDE)如Eclipse、IntelliJ IDEA等编写Java源代码文件,扩展名为`.java`。 - **第二步:编译** 通过Java编译器`javac`将源代码文件编译成字节码文件,扩展...

    java0基础入门(一)

    4. 从第一条指令开始执行:取指令、指令译码、取操作数,运算、送结果、PC 指向下一条指令。 5. 重复第 4 步骤直到程序执行完成。 本节总结了 Java 基础知识,包括二进制基础、Java 语言的历史和特点,以及计算机...

    Java知识梳理.doc

    #### 第一章 初识Java ##### 1.1 Java简介 - **定义**: Java是一种高级的、面向对象的编程语言,它支持跨平台特性,即“一次编写,到处运行”(Write Once, Run Anywhere, WORA)。Java程序经过编译后会转换成字节...

    大数据课程-Scala编程基础-1.Scala语言初识_lk_edit.ppt

    Scala与Java的关系密切,因为Scala是基于Java虚拟机(JVM)运行的。这意味着Scala源代码会被编译成Java字节码,可以在JVM上执行,并能够无缝调用Java类库。对于熟悉Java的开发者来说,理解Scala与Java的异同点是快速...

    Mashibing_High_Concurrency:马士兵高并发,Java基础视频学习

    小统计:代码目录第00章_初识Java 你好,世界初步认识程序格式关键字:如果不这样做,切换,换一会儿,一会儿,做一会儿,中断,继续,无效变量作用域:出了这个大括号就再也没有人认识这个变量了。基本数据类型:...

    JAVA反编译工具 jd-gui.exe

    马士兵是一位知名的IT教育专家,他的课程涵盖了广泛的Java技术,包括“初识JAVA 20. 反编译工具的使用”这一部分。在这一章节中,他可能讲解了如何利用jd-gui.exe来查看和理解Java程序的内部工作原理,这对于分析...

    JavaSE面试题及其参考答案.doc

    ### 第一章 初识 Java 1. **Java跨平台原理**:Java程序通过编译成字节码(`.class`文件),可以在任何支持Java的平台上运行,这得益于Java虚拟机(JVM)。JVM为每个平台提供了不同的实现,使得字节码能在不同操作...

    Java中的问题(3).docx

    #### 第一节:JAVA-初识 - **常见的DOS命令**:文档中提到了几个常见的DOS命令,包括`dir`用于查看当前目录下的所有文件;`cd`用于进入指定的目录;`cd..`用于退出当前目录返回上一级;`cd\`用于直接退出到根目录;...

    JavaSE面试题-含答案.pdf

    ### 第一章 初识Java 1. **Java跨平台原理**:Java的跨平台特性基于“一次编写,到处运行”的理念。Java源代码被编译成字节码(`.class`文件),这些字节码由Java虚拟机(JVM)执行。不同的操作系统上有不同的JVM...

Global site tag (gtag.js) - Google Analytics