以下内容源于个人对《深入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. 你真的了解javascript吗

    原文地址:http://dmitry.baranovskiy.com/post/91403200 看了文章中五个小例子,写了写自己的理解 #demo1 if (!("a" in w ...

  2. keytool 错误 java.io.IOException: incorrect AVA format

    给一个APK做签名,选择新建一个key并填写相关信息,但在Finish时,keytool报出了一个错误:keytool error: java.io.IOException: Incorrect AV ...

  3. 什么是CSS清除浮动?

    在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外 ...

  4. 【开源项目4】Android ExpandableListView

    如果你对Android提供的Android ExpandableListView并不满意,一心想要实现诸如Spotify应用那般的效果,那么SlideExpandableListView绝对是你最好的 ...

  5. 剑指Offer07 斐波那契数列

    /************************************************************************* > File Name: 07_Fibona ...

  6. CF 319C - Kalila and Dimna in the Logging Industry 斜率优化DP

    题目:伐木工人用电锯伐木,一共需要砍n棵树,每棵树的高度为a[i],每次砍伐只能砍1单位高度,之后需要对电锯进行充电,费用为当前砍掉的树中最大id的b[id]值.a[1] = 1 , b[n] = 0 ...

  7. About TI CC3000 Wifi

    http://forums.adafruit.com/viewtopic.php?f=22&t=44384http://learn.adafruit.com/adafruit-cc3000-w ...

  8. UIToolbar自定义背景及按钮设置

      //1.创建toolbar(MyToolbar继承UIToolbar) _myToolbar = [[MyToolbar alloc]initWithFrame:CGRectMake(kZero, ...

  9. 【转】亿欧盘点:杭州十家代表性O2O企业

    [ 亿欧导读 ] 11月13日亿欧网将走入杭州,联合B座12楼.正和岛召开“2014 中国O2O新商业峰会“.亿欧网据O2O产业图谱,整理出杭州十家O2O企业:点我吧.快的打车.杭州19楼.婚礼纪.淘 ...

  10. Android Bitmap详细介绍(转)

    转自: Bitmap详细介绍 package com.testbitmapscale; import java.io.File; import java.io.FileInputStream; imp ...