线程

Java基础教程:Java内存区域

拥有回忆 提交于 2020-03-09 05:28:41
Java基础教程:Java内存区域 运行时数据区域   Java虚拟机 在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域 。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。   根据《Java虚拟机规范》,Java虚拟机管理的内存将会包括以下几个运行时数据区域    程序计数器   程序技术器是一块较小的内存空间,可 视为当前线程所执行的字节码的行号计时器 。   在多线程开发中,为了线程切换后能恢复到正确的执行位置, 每条线程都需要有一个独立的程序技术器 ,各条线程之间的技术器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。   如果 当前线程执行的不是Java方法,而是Native方法,则这个计数器值为空。   该区域是唯一一个不存在OutOfMemoryError情况的区域。 Java虚拟机栈   同程序计时器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同。虚拟机栈描述是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程 。 TIPS: 我们常把内存划分为堆和栈,其中栈就是指的Java虚拟机栈

《深入java虚拟机》读后(1)

时光怂恿深爱的人放手 提交于 2020-03-09 05:20:58
第二章 java内存区域与内存溢出异常 一、运行时数据区域 1. 程序计数器:当前线程所执行的字节码的行号指示器。(线程私有) 2. java虚拟机栈:描述java方法执行的内存模型。(线程私有) 每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈和出栈的过程。 3. 本地方法栈:描述虚拟机使用到的native方法的内存模型。(线程私有) 4. java堆:存放对象实例。垃圾收集器管理的主要区域。 5. 方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。 运行时常量池是方法区的一部分。用于存放编译时期产生的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放。(具备动态性) 6. 直接内存:本机直接内存。 二、 HotSpot虚拟机中对象 1. 对象的创建 1)虚拟机遇到一条new指令。 2)检查这个指令的参数能否在常量池中定位到类的符号引用,并检查这个符号引用代表的类是否被加载、解析和初始化过。 3)给对象分配内存。(在类加载完成后已确定所需内存大小) 4)虚拟机将分配到的内存空间初始化为零值。(确保对象的实例字段在java代码中可以不赋初始值就直接使用) 5)设置对象(对象头) 6)执行<init>方法 注

jvm02

风格不统一 提交于 2020-03-09 05:16:50
java虚拟机内存管理 每个线程就是一个顺序的执行单元,线程共享区即多个线程共享同一块区域,线程独占区即每个线程都有自己的虚拟机栈,本地方法栈,程序计数器。 程序计数器是一个比较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,位于线程独占区,如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果执行的是native方法,计数器的值为underfined Java虚拟机栈 虚拟机描述的是java方法执行的动态内存模型 栈帧 每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成,用于存储变量表,操作数栈,动态链接,方法出口等。 局部变量表 存储编译期可知的各种基本数据类型,引用类型,returnAddress类型, 局部变量表的内存空间在编译期完成分配,当进入一个方法,这方法需要在帧分配多少内存是固定的,在方法运行期是不会改变局部变量表的大小(存储的只是对象的引用) 1 public class Demo { 2 3 public void tes() { 4 System.out.println("方法执行...."); 5 tes(); 6 } 7 8 public static void main(String[] args) { 9 new Demo().tes(); 10 11 } 12 13 } 方法执行.... 方法执行.

一、JVM — Java内存区域

前提是你 提交于 2020-03-09 05:16:11
Java 内存区域详解 写在前面 (常见面试题) 基本问题 拓展问题 一 概述 二 运行时数据区域 2.1 程序计数器 2.2 Java 虚拟机栈 2.3 本地方法栈 2.4 堆 2.5 方法区 2.5.1 方法区和永久代的关系 2.5.2 常用参数 2.5.3 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? 2.6 运行时常量池 2.7 直接内存 三 HotSpot 虚拟机对象探秘 3.1 对象的创建 Step1:类加载检查 Step2:分配内存 Step3:初始化零值 Step4:设置对象头 Step5:执行 init 方法 3.2 对象的内存布局 3.3 对象的访问定位 四 重点补充内容 4.1 String 类和常量池 4.2 String s1 = new String("abc");这句话创建了几个字符串对象? 4.3 8 种基本类型的包装类和常量池 参考 Java 内存区域详解 如果没有特殊说明,都是针对的是 HotSpot 虚拟机。 写在前面 (常见面试题) 基本问题 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题 String 类和常量池 8 种基本类型的包装类和常量池 一 概述 对于 Java

Java内存区域

耗尽温柔 提交于 2020-03-09 05:15:53
运行时数据区域: 程序计数器 : 通过改变计数器的值来选取下一条字节码指令,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,即“线程私有”如果线程执行的是Java方法,那么计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,则计数器的值为空,此区域没有OutOfMemoryError情况。 Java虚拟机栈 : 线程私有,描述Java方法执行的内存模型,每个方法都会创建栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等。。方法调用直至完成,对应栈帧入栈到出栈。局部变量表内存空间在编译期间完成分配,运行期间不会改变其大小。线程请求栈的深度大于所允许的深度,则抛出StackOverflowError异常;如果扩展时无法申请到足够的内存,就抛出OutOfMemoryError异常。 设置本地方法栈大小-Xoss(其实无效,应使用后面的),栈容量只由-Xss设定。 单个线程下,抛出的都是StackOverflowError。 如果是建立过多线程导致的内存溢出,可以通过减少最大堆和减少栈容量(每个线程被分配到的栈大小)来换取更多的线程。 本地方法栈 : 执行Native方法,会有StackOverflowError和OutOfMemoryError异常。 Java堆 : jvm中最大的一块,线程共享,唯一目的是存放对象实例

面试题之JVM内存区域

余生颓废 提交于 2020-03-09 05:15:40
1、Java内存区域(运行时数据区域):   jdk1.8之前:虚拟机运行内存分栈、堆和方法区这几种。 栈:虚拟机栈、本地方法栈、程序计数器。(线程私有,每个线程都拥有各自的) 程序计数器:一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。主要有2个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪里了。 注意:唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 Java虚拟机栈:生命周期与线程相同(随着线程创建而创建,随着线程死亡而死亡),描述的是Java方法执行的内存模型,每次方法调用的数据都是通过栈传递的。Java内存大概就是堆内存和栈内存,栈是虚拟机栈或是虚拟机栈中局部变量表部分。(实际上,Java虚拟机栈是由一个个栈帧组成,每个栈帧中都拥有:局部变量表、操作数、动态链接、方法出口信息) 局部变量表主要存放了编译器可知的各种数据类型 (boolean、byte、char、short、int、float、long、double)、 对象引用 (reference类型,不同于对象本身,可能是指向一个代表对象起始地址的引用指针

01.HTML5的新标签

人盡茶涼 提交于 2020-03-09 04:47:34
H5 新特性 1.语义化标签:header、footer、section、nav、aside、article 2.增强型表单:input 的多个 type 3.新增表单元素:datalist、keygen、output 4.新增表单属性:placehoder、required、min 和 max 5.音频视频:audio、video 6.canvas 7地理定位 8.拖拽 9.本地存储:localStorage - 没有时间限制的数据存储;sessionStorage - 针对一个 session 的数据存储,当用户关闭浏览器窗口后,数据会被删除 10.新事件:onresize、ondrag、onscroll、onmousewheel、onerror、onplay、onpause 11.WebSocket:单个 TCP 连接上进行全双工通讯的协议 1.语义化标签 注意:标签语义化的好处? 1)即使没有CSS的情况下,也能看出代码的结构 2)有利于其他的设备更好的解析 3)有利于SEO(Search Engine Optimization利用搜索引擎规则提高排名),利于爬虫抓取有用的信息 4)便于开发人员后期维护 2.增强型表单 HTML5 拥有多个新的表单 Input 输入类型。这些新特性提供了更好的输入控制和验证 html5 也新增以下表单元素 3.html5 新增的表单属性 4

JVM内存模型

我的梦境 提交于 2020-03-09 01:01:39
JVM的内存划分: 方法区: 是线程共享的,常量静态变量的JIT(即时编译器)编译后代码也在方法区存放。用来 存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。 虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有个别名Non-Heap(非堆),目的是为了与Java堆区分。 堆内存: 是 线程共享的,垃圾回收的主要场所 。Java虚拟机所管理的 内存最大的一块 ,在 虚拟机启动时创建。 此内存区域的 唯一目的就是存放对象实例 (也就是new出来的),几乎所有的对象实例以及数组都在这里分配。Java堆是垃圾收集管理器的主要区域,因此也被称作GC堆。 程序计数器: 当前线程执行的字节码的位置指示器。是一块较小的内存空间,可以看做是 当前线程所执行的符号指示器。 两个主要作用: 字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,如:顺序执行,选择,循环,异常处理。 在多线程的情况下,程序计数器用于记录当前程序执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行的位置。 注意: 程序计数器是 唯一一个不会出现OutOfMemoryError的内存区域 ,他的生命周期随着现成的创建而创建,随着线程的结束而死亡。 Java虚拟机(栈内存): 保存局部变量,基本数据类型以及堆内存中对象的引用变量。是线程私有的

JVM,DVM虚拟机

允我心安 提交于 2020-03-09 00:44:59
Java虚拟机–JVM,类加载器,双亲委派 https://www.iteye.com/blog/welcome66-2216572 1、JVM(Java Virtual Machine),java虚拟机 JVM就是虚拟出来的计算机,有自己完善的架构,处理器,堆栈,寄存器,指令系统。使用jvm就是为了支持与操作系统无关,java跨平台的原理,因为java代码都在这上运行, .java 文件通过javac命令编译后生成. class 字节码文件,JVM的java解释器负责把.class字节码文件转化为特定的机器码文件运行。 1.进程级别,守护线程和非守护线程(用户线程) 守护线程:后台线程,为前台线程提供便利服务,比如GC线程。不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。 非守护线程:前台线程 设置守护线程: public final void setDaemon ( boolean on ) 判断守护线程: public final boolean isDaemon ( ) 2.生命周期: 启动:启动java是开启,起点是public static void main 运行:main起点,两种线程:守护线程(JVM),非守护线程(JAVA),java也可以创建自己的守护线程 消亡:程序终止则退出,也可以用System.exit或Runtime类来退出 3.体系结构

JVM—GC垃圾回收器总结

本小妞迷上赌 提交于 2020-03-08 23:11:12
收集算法(标记-清理、复制、标记-整理、分代收集)是内存回收的方法论,垃圾收集器就是内存回收的具体实现。 主要有7个gc器,如下图。 1 Serial收集器 1.1 介绍 Serial收集器是单线程的收集器。 单线程 :1.不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,2.且在垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。 Stop the world :是VM在后台自动发起和自动完成的,在用户不可见情况下把用户正常工作的线程全部停掉。 1.2 缺点: 由于Stop The World,给用户带来不良体验,比如,计算机每运行一段时间就会暂停响应几分钟来处理垃圾收集。 1.3 优点 1)简单而高效(与其他收集器的单线程比); 2)对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。 1.4 应用场景 1)VM运行在 Client 模式下的默认新生代收集器; 2)在用户的桌面应用场景中,停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,不频繁发生,是可接受的 1.5 Serial/Serial Old收集器运行示意图 2 ParNew收集器 2.1 介绍 ParNew收集器是Serial收集器多线程版本(是GC线程的多线程,并行)。 • 并行 :Parallel指多条垃圾收集线程并行工作