以下内容源于个人对《深入java虚拟机》的理解总结

基本概念:

java虚拟机可以指一种抽象规范,也可以指一种具体实现,亦可以指一个java虚拟机实例。

虚拟机生命周期:

一个java虚拟机实例的天职是:负责运行一个java程序。当启动一个java程序时,一个虚拟机实例诞生。程序关闭退出,虚拟机实例亦随之消亡。如果在同一台计算机上运行三个java程序,将得到三个java虚拟机实例。每个java程序都运行与它自己的java虚拟机实例中。

一个java虚拟机实例通过调用main()方法来运行一个java程序。

垃圾收集  垃圾收集器的主要工作就是自动回收不再被运行的程序引用的对象所占的内存。此外它也可能去移动那些还在使用的对象,以此减少碎片。

在谈论垃圾回收前,首先了解下java虚拟机的内部体系结构,如下图所示

中间虚线框部分为运行时数据区域,由5部分组成,分别为方法区,堆,栈,程序计数器及本地方法栈。

1.程序计数器

对于一个运行中的java程序而言,其中每一个线程都有自己的PC寄存器,它是该线程启动时创建。

它的作用可以看做当前字节码执行的位置指示器。

2.本地方法栈

任何本地方法接口都会使用本地方法栈。当线程调用本地方法时,虚拟机会创建一个新的栈帧并压人java栈,然而当它调用的是本地方法时,虚拟机会保持java栈不变,不再在线程的java栈中压人新的帧。虚拟机只是简单的动态连接,并直接调用指定的本地方法。

3.方法区

在java虚拟机中,关于被装载类型的信息存储在一个逻辑上被称为方法区的内存中。类变量(静态变量)也是存储在方法区。方法区是线程共享的,必须被设计为线程安全的。

4.java栈

当启动一个新线程时,java虚拟机都会为它分配一个java栈,java栈以帧为单位保存线程的运行状态。虚拟机只会直接对java栈执行两种操作:以帧为单位的压栈和出栈。

某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。

当线程执行一个方法时,它会跟踪当前类和当前常量池。

java栈上的所有数据都是线程私有的,任何线程都不能访问另一个线程的栈数据,因此不需要考虑多线程下栈数据的访问同步问题。

5.java堆

java程序在运行时创建的所有类实例和数组都放在同一个堆中。每个java程序独占一个虚拟机实例----它们不会互相干扰,而一个java虚拟机实例中只存在一个堆空间,所有线程都共享这个堆,这种情况下,必须考虑多线程情况下堆数据的同步问题。

java类性的生命周期

一个java的装载、连接、初始化见下图:

类被初始化后就可以使用了,程序可以访问它的静态字段,调用它的静态方法,或者创建它的实例即对象。

类被实例化有4中途径:1.显式的new   2.Class,或Construtor对象的newInstance()方法;3 .  调用任何现有对象的clone()方法 4.ObjectInputStream.getObject()方法反序列化。

一个对象一旦不再被引用,就需要进行垃圾收集。至于how,when进行垃圾收集,取决各虚拟机实现。下面介绍常见hotSpot虚拟机的垃圾回收机制。

java虚拟机理解探索1的更多相关文章

  1. 对Java虚拟机理解

    深入理解Java虚拟机 Java技术体系 Java体系分为四个平台 Java card 运行在小内存上的 Java ME 运行在手机上 Java SE 完整Java 核心api JavaEE 支持使用 ...

  2. Java虚拟机理解-内存管理

    运行时数据区域 jdk 1.8之前与之后的内存模型有差异,方法区有变化(https://cloud.tencent.com/developer/article/1470519). java的内存数据区 ...

  3. 《深入理解Java虚拟机》类文件结构

    上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...

  4. 深入理解java虚拟机(1)------内存区域与内存溢出

    在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...

  5. 读书笔记之《深入理解Java虚拟机》不完全学习总结

    写在前面: 之所以称作不完全总结,因为我其实没有完完全全地看完此书,但是涵盖了大部分重要章节:同时以下总结是我自己认为很重要知识,细枝末节处难免遗漏,还请详细参考原著. 转载请注明原文出处:http: ...

  6. 《深入理解Java虚拟机》第2版挖的坑终于在第3版中被R大填平了

    这是why技术的第34篇原创文章 本周还是在家办公的一周,上面的图就是我在家的工位,和上周<Dubbo Cluster集群那点你不知道的事>这篇文章里面的第一张图片比起来,升级了显示器支撑 ...

  7. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  8. 《深入理解Java虚拟机》垃圾收集器

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...

  9. 《深入理解Java虚拟机》Java内存区域与内存溢出异常

    注:“蓝色加粗字体”为书本原语 先来一张JVM运行时数据区域图,再接下来一一分析各区域功能:   程序计数器 程序计数器(program Counter Register)是一块较小的内存空间,它可以 ...

随机推荐

  1. oc-31-多对象的内存管理

    在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器. 引用计数器的常见操作 retain消息:堆内存中对象的计数器变量 +(该方法返回对象本身,要想计数器变量加1就要调用对象的retain ...

  2. oc-28-构造函数

    Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { NSString *_name; int _age; ...

  3. BIOS 深入学习 转

    http://blog.csdn.net/lightseed/article/category/547391

  4. python代码查询港澳通行证办理进度

    查询港澳通行证办理进度查询的python 3.3代码.利用socket请求相关网站,获得结果后利用正则找出办理进度.其实用urllib代码会更简洁,不过当时在下还不熟悉urllib~ 直接上代码: i ...

  5. SQL Server 表和索引存储结构

    在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或 ...

  6. 【源码】基于SQLite实现CMS论坛(BBS)----附件SQLite可视化界面客户端

              使用说明:管理员账号:admin  密码:523523523   一.  账号管理(登陆注册审核) 1.账号注册 url:/BBS/Account/pregister.aspx 2 ...

  7. Balloon Comes!

    Problem Description The contest starts now! How excited it is to see balloons floating around. You, ...

  8. 1.6.9 UIMA Integration

    1. UIMA 集成 你可以使用solr集成Apache的非结构化信息管理架构(UIMA).UIMA可以让你定义自己的分析引擎通道,逐步添加元数据到文档的标注. 关于Solr UIMA的更多信息,参考 ...

  9. about tomcat ssl

    http://www.kuqin.com/shuoit/20140615/340573.html 1SSL单向认证概念 当客户端(服务请求方)向服务端(服务提供方)发起请求时,服务器端需要向客户端提供 ...

  10. nodejs(一) 简单登录验证 使用mongoose 操作MongoDB

    ---恢复内容开始--- 开发使用webstorm 9  新建nodejs+express 项目 newfarmer 文章目录 配置Mongoose 创建目录及文件 插入数据,POST提交JSON增加 ...