本地线程

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学习笔记二:垃圾收集算法

心已入冬 提交于 2020-03-08 12:59:56
垃圾回收要解决的问题: 哪些内存需要回收? 线程私有区域不需要回收,如PC、Stack、Native Stack;Java 堆和方法区需要 什么时候回收? 以后的文章解答 如何回收? 首先进行对象存活性的分析,然后利用GC回收算法进行回收,具体算法请看下文。 如何判断对象是否可以回收? 有两种方式:引用计数算法和可达性分析算法,目前主流商业JVM普遍采用可达性分析算法 引用计数算法 引用计数算法顾名思义,为对象的引用计数,每当有一地方引用它时,计数器加1,引用失效(离开作用域时)减1,当计数器值为0时,对象就可以被回收了。引用计数算法优点是判定效率高,缺点是无法解决对象互相引用的问题,使用此技术进行内存管理的技术有微软的COM、Flash、Python等 可达性分析算法 可达性分析算法,基本思路是以GC Roots为根、向下搜索,所走过的路径成为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链可达时,就成为此对象不可用,即可以被回收。注意再注意:该算法的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。分代式GC是一种部分收集(partial collection)的做法。在执行部分收集时,从GC堆的非收集部分指向收集部分的引用,也必须作为GC roots的一部分。具体到分两代的分代式GC来说

JAVA并发编程的学习之路

让人想犯罪 __ 提交于 2020-03-08 12:57:07
一Java内存模型 1 Java内存模型(JMM):为了屏蔽各种硬件和操作系统的内存访问差异, 以实现java程序在任何平台下有相同的并发效果,Java虚拟机规范中定义了java内存模型。 它规范了java虚拟机与计算机内存是如何协调工作的 ,规定了一个线程何时可以看到被其它线程修改过的共享变量的值,以及如何在必须时同步的访问共享变量。 2 同步8种操作:lock、unlock、read、load、use、assign、store、write lock:作用与主内存的变量,把变量设成一个线程独占的状态 unlock:作用与主内存的变量,把锁定的线程释放 read:作用与主内存的变量,把一个变量的值,输送到工作内存中 load:作用与工作内存的变量,把read从主内存读入的变量放入工作内存的副本中 use:作用与工作内存的变量,把工作内存中变量的值传给执行引擎,每当虚拟机遇到一个需要用到这个值的字节码指令时执行的操作 assign(赋值):作用与工作内存的变量, 把一个从执行引擎获取到的值赋给工作变量,每当虚拟机遇到一个需要赋值的字节码指令时执行的操作 store:作用与工作内存的变量,把工作内存中的变量值传入到主内存 write:作用与主内存的变量,把store传入过来的变量存入主内存 二线程安全性 1 线程安全性:当多个线程访问某个类时,不管这些线程采用何种调度方式

JVM初识

瘦欲@ 提交于 2020-03-08 11:28:00
###JVM初体验 基本概念:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 JVM大致可分为三部分 1.Java代码的执行 代码执行也可以分为三个过程 代码编译为class,命令javac 转载class,命令ClassLoader 执行class,亦可分为解释执行与编译执行两部分,编译执行可分为client complier与server compiler 2.内存管理 内存管理大致分为四个部分 内存空间:包含方法区、堆,本地方法栈、pc寄存器 内存分配:有堆上分配、TLAB分配、栈上分配 内存回收:1.用到的算法有:Copy、Mark-Sweep、Mark-Compact,2.sun jdk的分代回收可分为:新生代可用的GC、Minor GC触发机制以及日志格式、旧生代可用的GC、Full Gc触发机制以及日志格式 内存状况分析:jconsole、visualvm、jstat、jmap、MAT 3.线程资源同步与交互机制 线程资源同步:可分为线程资源执行机制和线程资源同步机制,线程资源同步机制:Sychronized的实现机制,lock/unlock实现机制 线程交互机制:Object.wait/notify/notifyall

Web Worker的学习

喜你入骨 提交于 2020-03-08 10:22:17
一、引 最近打算弄点面试778,所以开始系统的学习下js的一些知识,把一些还没好好认真看看的知识,都梳理一下吧,有幸能看到这篇文章的问,希望你也可以学的更好,我只是在前端路上一路埋头走下去不准备回头的小菜鸟,让我们开始吧 二、介绍 知道JS的都知道,JS是由于历史的原因导致它是单线程的语言,但是在越来越多的开发中发现,多线程也是有必要的,所以在HTML5的规范中,把多线程的解决方案 Web Worker 写了进来。具体的讲下 Web Worker 的作用,就是为 JS 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给子线程进行后台运行。而主线程在前端运行,两者互不干扰。等到 worker 线程完成计算任务,再把结果 post 给主线程。这样就会有很多好处,比如一些高I/O,或者计算密集型或者高延迟的任务都可以后台运行,而不影响前端UI的运行,各司其职,提高用户的体验 当然在 worker 有这么多好处的同时,也是有一点点的坏处的,上面说了创建的子线程是后台运行的,所以它和主线程是互不影响的,所以对子线程worker的操作只有对其通信,当子线程一创建即会运行,创建了多了也会影响资源的使用,所以当任务结束后,应该手动关闭子线程。 三、限制 它这么好,也是有点限制的。 同源问题,对于处理的脚本都要遵循是同源文件下的脚本。 子线程是和主线程相互独立的

第十二章 并发编程

心已入冬 提交于 2020-03-08 09:38:10
第十二章 并发编程 1、并发:逻辑控制流在时间上重叠 2、并发程序:使用应用级并发的应用程序称为并发程序。 3、三种基本的构造并发程序的方法: 进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。 I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化为状态机。 线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。 12.1 基于进程的并发编程 构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个 新的子进程 来为每个新客户端提供服务。 基于进程的并发echo服务器的重点内容 (1)需要一个SIGCHLD处理程序,来 回收 僵死子进程的资源。 (2)父子进程 必须关闭 各自的connfd拷贝。对父进程尤为重要,以 避免存储器泄露 。 (3)套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。 注意:进程的模型: 共享文件表 ,但不是共享用户地址空间。 优点:一个进程不可能不小心覆盖两个进程的虚拟存储器。 缺点:独立的地址空间使得进程共享状态信息变得更加困难。进程控制和IPC的开销很高。 Unix IPC 是指所有允许进程和同一台主机上其他进程 进行通信 的技术,包括管道、先进先出(FIFO)、系统V共享存储器,以及系统V信号量。 12.2 基于I

java中volatile关键字的含义

老子叫甜甜 提交于 2020-03-07 23:59:19
转: java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法 或者 代码块。 volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。 下面看一个例子,我们实现一个计数器,每次线程启动的时候,会调用计数器inc方法,对计数器进行加一 执行环境——jdk版本:jdk1.6.0_31 ,内存 :3G cpu:x86 2.4G 1 public class Counter { 2 3 public static int count = 0; 4 5 public static void inc() { 6 7 //这里延迟1毫秒,使得结果明显 8 try { 9 Thread.sleep(1); 10 } catch

《面试必问之jvm与性能优化》(二)

烂漫一生 提交于 2020-03-07 17:16:12
1. 说说各个区域的作用? 1、运行时数据区域 运行时数据区域包括方法区、虚拟机栈、本地方法栈、堆、程序计数器。其中方法区和堆是所有线程共享的数据区,其他的是线程隔离的数据区。 1.1、程序计数器 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,确定下一条需要执行的字节码指令。java的多线程是通 过线程轮流切换并分配处理器执行时间的方式来实现的,在任何确定的一个时刻,一个处理器只会执行一条线程中的指令。为了线程切换之后能恢复到正确的执行位 置,每个线程都需要有一个独立的程序计数器,各个线程之间的计数器互不影响。如果线程正在执行的是一个java方法,则计数器记录的是正在执行的虚拟机字 节码指令的地址,如果正在执行的是native方法,则计数器值为空。 1.2、java虚拟机栈 java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用 于存在局部变量表、操作栈、动态链接、方法出口等信息。通过所说的栈是局部变量表,即与对象内存分配关系最密切的内存区域。局部变量表的内存空间在编译期 间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是确定的,在运行期不会改变。 java虚拟机栈有两种异常:如果线程请求的栈深度大于虚拟机所允许的深度

JVM深入解析

有些话、适合烂在心里 提交于 2020-03-07 14:37:23
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1,64位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中,各种字节码指令往栈中存取数据。 d、动态链接

JVM垃圾回收机制

久未见 提交于 2020-03-07 13:55:32
问题引入:     谈谈JVM垃圾回收机制 怎样判断一个对象是否是垃圾? 判断是否是垃圾有两种方式,(1)引用计数法,无法解决循环引用问题,Java不使用,Python使用              (2)可达性分析,以GC Root为根进行可达性遍历,无法被遍历到的判定为垃圾 ps :什么是GC Root根 ?虚拟机栈中的局部变量表,方法区中的静态变量引用的对象,方法区中常量引用的对象,本地方法栈中引用的对象(native) 典型垃圾回收算法 :(1)标记清除算法 :先标记垃圾,再清除。会产生内存碎片,效率也不太高           (2)复制算法:不会产生内存碎片,但将内存缩小到原来的一半,占用空间。性能取决于存活对象的多少,如果存活对象很多,很费时           (3)标记整理算法:先标记,再清除,再整理内存。比较耗时。           (4)分代收集算法:当前商业虚拟机的垃圾收集都采用“分代收集”算法,根据对象存活周期的不同将内存分为几块。一般是把java对分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中每次垃圾收集时都有大量对象死去,只有少量对象存活,所以就采用复制算法,只需要付出少了存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对他进行分配担保,就要使用“标记-清除”或“标记-整理”算法