`

Java虚拟机学习总结一

    博客分类:
  • JVM
阅读更多
  Java运行包括4个方面,Java代码(.java)、Java编译文件(.class),Java虚拟机,Java应用程序接口。Java代码通过编译器编译成为类文件,然后被装载到字节码内存中,通过类加载放入虚拟机中,最后通过操作系统和适配器实现,而JVM则处于核心地位。

Java虚拟机
  Java虚拟机是java基础部分,Java语言具有跨平台的特性,这也是由JVM来实现的。更准确地说,是Sun利用JVM在不同平台上的实现帮我们把平台相关性的问题给解决了。Java语言支持通过JNI(Java Native Interface)来实现本地方法的调用,但是需要注意到,如果你在Java程序用调用了本地方法,那么你的程序就很可能不再具有跨平台性,即本地方法会破坏平台无关性。JVM包括类加载子系统、运行数据区、执行引擎和本地方法接口。
  (生命周期总结:当一个java程序启动时,JVM就产生一个实例;程序结束是,实例也就消失了。Java虚拟机通常开始与一个main方法,这个方法是public static void修饰,JVM要调用必须是public,并且不通过对象调用,所以是static,而且由于JVM已经是底层,不会有任何返回,返回类型就成了void。)



运行时数据区
  即内存空间,通常我们配置-Xms、-Xmx信息都是设置的内存,Xms表示初始内存,Xmx表示最大内存,Xmn表示设置年轻代内存等等。内存空间主要由Java堆heap、方法区method area、本地方法栈、程序计数器、Java栈组成。其中Java堆、方法取每个线程公有,而本地方法栈、程序计数器、Java栈是线程私有。

  程序计数器
  一块较小的内存空间,是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过线程轮流切换执行,一个确定时刻,一个处理器确切说是一个内核,只会执行一条线程的指令,为了线程切换能够恢复正确位置,所以需要有一个独立的程序计数器。

  Java虚拟机栈
  同样为线程私有,就是java方法执行的内存模型,每个方法执行时都会同时创建一个栈帧,用户存储局部变量表、操作栈、动态链接、方法出口信息。每一个方法被调用直至完成过程,就是入栈到出栈的过程。
  局部变量表存放了各种基本数据类型,对象引用类型(一个指向对象起始地址的引用指针,或者一个代表对象相关的位置),和returnAddress类型(指向一条字节码指令的地址)。局部变量表所需的内存空间在编译期间完成分配,并且空间已经固定,不会改变。
  (后期学习:查看java字节码,使用 javap -verbose class文件;java -verbose文件名称 注此处没得后缀 是查看加载了哪些jar包和文件;javac -verbose java文件 是看虚拟器加载类哪些东西)

  本地方法栈
  本地方法栈与Java栈基本一样,只不过Java虚拟机栈是处理java方法(字节码)服务,而本地方法栈是为虚拟机使用Native方法服务。

  Java堆 Heap
  Java堆是虚拟机内存中最大的一块,Java对是被所有线程共享的一块内存区,用来存放对象实例。Java堆也是垃圾收集器管理的主要区域,由于现在垃圾收集器基本都是采用的分代收集算法,所以Java堆基本可以分为新生代、老年代和持久代,新生代再分为Eden空间、From survivor空间和To survivor空间。
  新生代:用于存放新生的对象,对象在分配时首先分配到Eden区,当Eden区没有足够空间时,就会进行一次minor GC。通过-Xmn设置新生代大小,-XX:NewRatio=参数 设置新生代与老年代的内存空间比,-XX:SurvivorRation=参数 设置Eden区和Survivor比。
  当Eden区进行minor GC后,如果对象经过一次回收并且还存活,能被Survivor去接收,就会移到Survivor(From)区,包括原From去中的对象,并将其年龄设置为1,每熬过一次minor GC年龄就会加1,当达到一定年龄后,就会晋升到老年代中。每次进行GC操作(Eden和From区),From区对象引入to区,并且和To区进行逻辑互换,保证一个Survivor区是空的,如果在放入To或者survivor区中内存不够时,会被放入Old区。Survivor设计成为两个区,应该回收中筛选更符合Old区条件的对象,因为Old区进行回收代价比较高
  老年代:存放生命周期长的对象,或者是大对象(包括Eden区或者Survivor区无法放下的对象),当Old区被占满时就会进行完成的垃圾回收Full GC(Major GC)包括新生代。Full GC完成后,留下来的内存就会方法Permanent区(持久代)中。

  方法区
  方法区和Java堆一样,是各个线程共有的公共区域,用来存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。也可以被称作“永久代”,但两者本质上并不一样,只是把GC分代收集扩展到方法区了,相对Java堆而言,垃圾收集行为在访法区比较少见,主要针对常量池的回收和对类型的卸载。

  运行时常量池
  运行时常量池是属于方法区的一部分,是存放编译期生成的各种字面量和符号引用,当类被加载后,这些信息就会放入到访法区运行时常量池中。另外,运行区常量还具有动态特征,不要求常量一定要在编译期产生,运行期间也可能将新的常量放入常量池中,如String的intern方法。

  直接内存
  不是JVM中一部分,是由于new I/O 可以使用native直接分配堆外内存,然后通过存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
  • 大小: 79.3 KB
分享到:
评论

相关推荐

    Java虚拟机学习和总结(1&2)

    Java虚拟机学习和总结(1&2)

    JAVA虚拟机学习路线,思维导图

    JAVA虚拟机学习路线,思维导图,总结JVM的总体情况。跟着来学习,事半功倍

    深入理解Java虚拟机---学习感悟以及笔记

    这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构和算法是一个道理,工欲善其事,必先利其器。曾经的我经常害怕处理内存溢出的问题,因为不知道他为什么会出现这个问题,当我在...

    Java虚拟机(JVM)小白必入.xmind

    此文件为XMID思维导图文件,是个人学习期间总结的Java虚拟机总总结,可以作为面试的一个亮点,反正面试的时候这是我的一个加分项

    java虚拟机中多线程总结

    在本篇内容中小编给大家分享的是关于java虚拟机中多线程的知识点总结内容,需要的朋友们参考学习下。

    java深入学习教程书籍ppt及pdf集合

    这是本文精心搜集的关于java方面的深入学习的资料合集,包括 how tomcat works中文...深入java虚拟机pdf书籍 深入理解java虚拟机pdf 数据结构与算法 java语言版pdf 数据结构与算法分析java版 数据结构与算法项目化教程

    什么是Java虚拟机(JVM)?——–回过头来看

    什么是Java虚拟机(JVM)?——–回过头来看 博客说明 文章所涉及的资料来自互联网整理和个人总结,...Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 Java虚拟机(JVM)是可

    Java内存模型精辟总结

    Java内存模型精辟总结,只有深入JVM才能真正深入Java语言。强烈建议Java程序员深入学习Java虚拟机

    JAVA程序员学习之路总结.zip

    这得益于Java虚拟机(JVM),它充当了代码和底层硬件之间的中介。 面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多...

    java个人总结,觉得还不错

    java资料总结:java两种核心机制:JAVA虚拟机,垃圾收集机制。 一个源文件中最多只能有一个pubilc class类 public static void main(String args[]){...} 。。。。。。。。。。。。。。。

    个人java总结笔记

    Class 对象由Java虚拟机在使用到该类的时候,自动创建; Class 对象的三种获取方式: 1: Class.forName(“全类名”); 2:类对象名.getClass(); 3:类名.Class(); 通过Class 对象获得类的指定成员,构造方法 构造方法...

    jvm指令手册 +JVM必知必会,掌握虚拟机编译过程.rar

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台...

    Java初学者怎么入门.md一份给Java初学者的入门指南

    1. 介绍了学习Java需要了解的四个方面:Java编程语言、Java文件格式、Java虚拟机和Java API。 2. 阐述了Java分为三个技术平台:Java SE、Java EE和Java ME,并解释了它们的关系。 3. 解释了Java编译和运行的过程,...

    java虚拟机内存(jdk1.7为例)-初版理解图.zip_java_jvm

    jvm内存模型理解,是自行学习后的初步总结,供参考

    java总结(1).zip_commandkv3_java_searwg

    学习java基础的一些笔记,总结.如: java开发环境:JVM:java虚拟机:加载.class并运行.class JRE:java运行环境:包含JVM,还包含运行java程序所必须的环境(JRE=JVM+java系统类库)

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.5.4 Java虚拟机(Java Virtual Machine) 17 1.5.5 HelloWorld的整个流程 17 1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.5.4 Java虚拟机(Java Virtual Machine) 17 1.5.5 HelloWorld的整个流程 17 1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-030-Java语言概述-重难点总结.avi 北京动力节点-Java编程零基础教程-031-Java基本语法-注释-单行注释与多行注释.avi 北京动力节点-Java编程零基础教程-032-Java基本语法-注释-...

    Java程序中JNI的编程指南

    2、 自己实现一个java虚拟机 3、 学习不同语言如何进行协作,尤其是如何实现垃圾回收和多线程。 4、 把一个虚拟机实现整合到用C/C++写的程序中。 本书是写给开发者的。JNI在1997年第一次发布,本书总结了SUN工程师和...

    成为Java顶尖程序员必备书籍

    “学习的最好途径就是看书“,这是...本连接内有关书籍:jquery的实例及源码精华,java相关的,深入理解Java虚拟机 JVM高级特性与实践,设计模式,主流框架,敏捷开发的原则模式及实践,企业应的架构等完整版的中文书籍

Global site tag (gtag.js) - Google Analytics