虚拟机

带着新人看java虚拟机01

淺唱寂寞╮ 提交于 2020-02-16 04:06:03
1.前言(基于JDK1.7)      最近想把一些java基础的东西整理一下,但是又不知道从哪里开始!想了好久,还是从最基本的jvm开始吧!这一节就简单过一遍基础知识,后面慢慢深入。。。   水平有限,我自己也是很难把jvm将清楚的,我参考一本书《深入java虚拟机第二版》(版本比较老,其实很多大佬的博客都是参考的这本书的内容。。。),电子档pdf文件链接:https://pan.baidu.com/s/1bxs4i0gnVpz7Lkjl2fxS9g 提取码:n5ou ,有兴趣的小伙伴可以自己下载自己好好看看;   所谓jvm,又名java虚拟机。我们平常写java程序的时候几乎是感觉不到jvm的存在的,我们只需要根据java规范去编写类,然后就可以运行程序了,当然只有我们程序出现bug了,我们才有可能在控制台上看到一些jvm报错的信息,比如内存溢出异常等。   java之所以能够跨平台,就是因为jvm屏蔽了各个操作系统之间的差异,举个形象的例子,我们手机要充电吧,但是充电的方式有很多种,你可以直接数据线插到插座充电,也可以用数据线插到电脑USB口充电,一个是电脑一个是插座,为什么都能给手机充电呢?原因就是有数据线屏蔽了插座和电脑的差异,对于手机来说,它是看不到数据线另外一头连接的是什么设备,只知道有电通过数据线向自己传过来就ok了,顺便一提,这也是所谓的适配器的原理!  

Java 虚拟机 - 2.2 运行时数据区 Runtime Data Area

牧云@^-^@ 提交于 2020-02-15 23:05:04
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 JVM是一个内存中的虚拟机, Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。 运行时数据区Runtime Data Area 一、程序计数器(Program Counter Register) Java虚拟机栈描述的是Java 方法执行 的内存模型:每个方法执行的同时会创建一个 栈帧 ,栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 Java虚拟机栈是 线程私有 的,它的生命周期与线程相同。 程序员主要关注的所谓的“堆和栈”里的“栈”,就是指 VM stack 虚拟机栈内存 ,更细致的讲,就是虚拟机栈中 局部变量表 部分。 局部变量表存放了编译时期可知的各种 基本数据类型 (boolean, byte, char, short, int, float, long, double), 对象引用 , 和 returnAddress类型 (指向了一条字节码指令的地址)。 局部变量表所需的内存空间在编译时期完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

java虚拟机理解探索1

早过忘川 提交于 2020-02-15 22:50:04
以下内容源于个人对《深入java虚拟机》的理解总结 基本概念: java虚拟机可以指一种抽象规范,也可以指一种具体实现,亦可以指一个java虚拟机实例。 虚拟机生命周期: 一个java虚拟机实例的天职是:负责运行一个java程序。当启动一个java程序时,一个虚拟机实例诞生。程序关闭退出,虚拟机实例亦随之消亡。如果在同一台计算机上运行三个java程序,将得到三个java虚拟机实例。每个java程序都运行与它自己的java虚拟机实例中。 一个java虚拟机实例通过调用main()方法来运行一个java程序。 垃圾收集 垃圾收集器的主要工作就是自动回收不再被运行的程序引用的对象所占的内存。此外它也可能去移动那些还在使用的对象,以此减少碎片。 在谈论垃圾回收前,首先了解下java虚拟机的内部体系结构,如下图所示 中间虚线框部分为运行时数据区域,由5部分组成,分别为方法区,堆,栈,程序计数器及本地方法栈。 1.程序计数器 对于一个运行中的java程序而言,其中每一个线程都有自己的PC寄存器,它是该线程启动时创建。 它的作用可以看做当前字节码执行的位置指示器。 2.本地方法栈 任何本地方法接口都会使用本地方法栈。当线程调用本地方法时,虚拟机会创建一个新的栈帧并压人java栈,然而当它调用的是本地方法时,虚拟机会保持java栈不变,不再在线程的java栈中压人新的帧。虚拟机只是简单的动态连接

为什么 kubernetes 天然适合微服务

梦想的初衷 提交于 2020-02-15 22:49:12
本文由 网易云 发布。 作者:刘超,网易云首席解决方案架构师 最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样。(可参考 《容器平台选型的十大模式:Docker、DC/OS、K8S 谁与当先?》 ) 经过一段时间的思索,以及采访了从早期就开始实践 Kubernetes 的 网易云 架构师们后,我把反思所得总结为今天的这篇文章。 一、从企业上云的三大架构看容器平台的三种视角 如图所示,企业上云的三大架构为 IT 架构、应用架构和数据架构,在不同的公司,不同的人、不同的角色,关注的重点不同。 对大部分的企业来讲,上云的诉求是从 IT 部门发起的,发起人往往是运维部门,他们关注计算、网络、存储,试图通过云计算服务来减轻 CAPEX 和 OPEX。 有的公司有 ToC 的业务,因而累积了大量的用户数据,公司的运营需要通过这部分数据进行大数据分析和数字化运营,因而在这些企业里面往往还需要关注数据架构。 从事互联网应用的企业,往往首先关注的是应用架构,是否能够满足终端客户的需求,带给客户良好的用户体验。业务量上往往会有短期内出现爆炸式增长的现象,因而关注高并发应用架构,并希望这个架构可以快速迭代,从而抢占风口。 在容器出现之前,这三种架构往往通过虚拟机云平台的方式解决。当容器出现之后

深入理解java虚拟机读书笔记1--java内存区域

耗尽温柔 提交于 2020-02-15 21:08:28
  Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途、创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随线程的开始和结束而创建和销毁。 Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1 程序计数器   它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器。   java虚拟机的多线程是通过轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。   此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的区域。 2 java虚拟机栈   与程序计数器一样,java虚拟机栈也是线程私有的,它的生命周瑜与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。   在这里指出一下,经常说的java内存区分为堆内存(Heap)和栈内存(Stack),这种分法太粗糙。   局部变量表存放了编译器可知的各种基本数据类型(boolean、byte

虚拟机内存结构

喜夏-厌秋 提交于 2020-02-15 20:34:04
JVM的主要结构如下图所示,图片引用自 舒の随想日记 。 方法区和堆由所有线程共享,其他区域都是线程私有的 程序计数器(Program Counter Register) 类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined。 虚拟机栈(Java Stack) 虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。 如果请求的栈的深度过大,虚拟机可能会抛出 StackOverflowError 异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出 OutOfMemoryError 异常。 栈帧(Stack Frame) 栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(Frame Data)。 局部变量区(Loca

JVM 内存分析

故事扮演 提交于 2020-02-15 20:24:16
简述JVM垃圾回收机制 垃圾回收机制时Java提供的自动释放内存空间的机制. 垃圾回收机制时JVM自导的一个线程,用于回收没有被引用的对象. JVM有一个运行时的数据区来管理内存.其主要包括五大部分:程序计数器,虚拟机栈,本地方法栈,方法区,堆. 其中程序计数器,虚拟机栈,本地方法栈 每个线程私有的内存空间,和线程的生命周期相同.如栈中每个栈帧分配多少的内存基本上在类结构确定时就以几个确定了.无需考虑内存回收的问题. 方法区和堆就和上面不一样了,一个接口的多个类实现需要的内存可能不一样,只有在程序运行期才指导会创建哪些对象,这部分内存的分配和回收都是动态的, GC主要关注的就是该部分内存. Java虚拟机数据区域 黄色: 由所有线程共享的数据区. 绿色: 线程隔离的数据区. 程序计数器:当前线程所执行的字节码的行号指示器,在虚拟机的概念模式里,字节码解释器工作就是通过改变程序计数器的值来选择下一跳需要执行的字节码指令,分支,循环,跳转,异常处理,线程回复等基础功能都要依赖这个基础器来完成. Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,指挥执行一条线程中的指令.因此,为了线程切换之后能够恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线成之间的计数器互不影响,独立存储. 如果线程正在执行一个Java方法

深入理解Java虚拟机:第2章 Java内存区域与内存溢出异常

泄露秘密 提交于 2020-02-15 20:16:59
目录 2.2 运行时数据区域 (1)程序计数器 (2)虚拟机栈 (3)本地方法栈 (4)Java堆 (5)方法区 2.3 HotSpot虚拟机对象探秘 2.3.1 对象的创建 2.3.2 对象的内存布局 2.3.3 对象的访问定位 2.2 运行时数据区域 注: 虚拟机规范(The Java Virtual Machine Specification, Java SE 8 Edition)Run-Time Data Areas (1)程序计数器 线程私有。 当前线程所执行的字节码的行号指示器。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined)。 (2)虚拟机栈 线程私有。 Java方法执行的内存模型:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。局部变量表存放了编译期可知的基本数据类型、对象引用(reference类型)、returnAddress类型。 StackOverflowError 异常(如果线程请求的栈深度大于虚拟机所允许的深度), OutOfMemoryError 异常(如果虚拟机栈可以动态扩展, 扩展时无法申请到足够的内存

启动eclipse弹出提示Version 1.7.0_79 of the JVM is not suitable for this product. Version: 1.8 or greater is required怎样解决

点点圈 提交于 2020-02-15 19:54:39
启动eclipse时弹出如下弹出框: 解决办法: 在eclipse安装目录下找到eclipse.ini文件,并在 -vmargs -Dosgi.requiredJavaVersion=1.8 前面加上 -vm D:/Program Files/Java/jdk1.8.0_111/jre/bin/server/jvm.dll 注意:-vm要添加到-vmargs的前面 -vm D:/Program Files/Java/jdk1.8.0_111/jre/bin/server/jvm.dll要注意斜线的方向,如果写成 -vm D:\Program Files\Java\jdk1.8.0_111\jre\bin\server\jvm.dll 那么启动eclipse后会出现eclipse自动退出的现象 还有一个方法:卸载jdk1.7版本,安装jdk1.8版本 来源: https://www.cnblogs.com/nana-blog/p/10385723.html

【转】vmware安装ubuntu详细步骤

倖福魔咒の 提交于 2020-02-15 17:42:28
转自: http://blog.csdn.net/u013142781/article/details/50529030 不是每一个程序员都必须玩过 Linux ,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少大公司都要求熟悉在linux上开发,因此从个人职业发展有必要去多了解一下linux。 (博主网上查了一下,现在大部分服务器安装的系统主要有:ubuntu server、centos、suse linux enterprise, redhat linux等) 于是今天博主就在虚拟机上安装了Ubuntu,并分享整个安装过程给大家。之所以没有安装双系统,是考虑多很多不方便的地方,比如,你在linux上开发了一个实例,你想写博客,写博客肯定是在windows上方便多了,代码需要从一个系统弄到另外一个系统,这里是双系统的不方便。另外,虚拟机上安装linux的另外一个好处就是,你可以在windows上下载了工具安装包,然后在linux上安装。 好了,下面马上附上安装全过程。 一、下载Ubuntu镜像文件 下载地址: http://www.ubuntu.com 打开上面的连接,我们来到如下页面,点击download: 下一步,到如下页面,点击Ubuntu Desktop: