本地线程

JVM第一弹

微笑、不失礼 提交于 2020-02-04 11:56:09
JVM第一弹 基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收、堆和一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。 运行过程 我们都知道Java代码源文件,通过编译器能够产生相应的.Class字节码文件,而字节码文件又通过Java虚拟机中的解释器,编译成特定机器上的机器码。 ① Java源文件 ——> 编译器 ——> 字节码文件 ② 字节码文件 ——> JVM ——> 机器码 每种平台的解释器是不同的,但是虚拟机是相同的,这也就是java为什么能够跨平台的原因了。当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序 启动就会存在多个虚拟机实例。 程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。 类加载器 什么是类的加载? 类的加载是指将类的字节码文件数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。 类的加载的最终产品是位于堆区内中的Class对象,Class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口。 类加载器包括: 启动类加载器(BootStrap) ——主要有C++进行实现的。用来加载jdk安装目录下的:jre/lib下的可执行jar包。

进程池,线程池使用

大兔子大兔子 提交于 2020-02-04 11:13:32
进程的概念 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。[3] 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。 引入进程原因 为了提高资源利用率和系统处理能力,现阶段计算机系统都是多道程序系统,即多道程序并发执行。 优化系统资源,方便计算机调度,避免系统运算紊乱。 进程的并行与并发 并行 :并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核CPU) 并发 :并行是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A,交替使用,目的是提高效率。 并行简图 并发(线程) 二、进程线程 1、进程 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程

JVM系列(二)——Jvm内存结构

醉酒当歌 提交于 2020-02-04 04:01:06
    JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块,由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配;方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);栈又分为java虚拟机栈和本地方法栈主要用于方法的执行。     如何通过参数来控制各区域的内存大小呢? 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。 -XX:NewSize设置新生代最小空间大小。 -XX:MaxNewSize设置新生代最大空间大小。 -XX:PermSize设置永久代最小空间大小。 -XX:MaxPermSize设置永久代最大空间大小。 -Xss设置每个线程的堆栈大小。 没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。 老年代空间大小=堆空间大小-年轻代大空间大小     JVM和系统调用之间的关系: 1.Java堆(Heap)     对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例

谈谈线程安全与锁优化

佐手、 提交于 2020-02-04 02:46:02
写在前面 本文是作为阅读《深入理解Java虚拟机》第13章线程安全与锁优化的读书笔记; 线程安全是以多个线程之间存在共享对象为前提的。它并不是一个非黑即白的问题。Brian Goetz 曾就线程安全的“安全程度” 按以下由强至弱做了划分: 不可变;这类对象不需要进行任何线程安全的保障措施,只要这个对象被构建出来,其外部的可见状态永远也不会改变。如果共享数据是一个基本数据类型,那么只要在定义时使用 final 关键字修饰它,就可以保证它是不可变的。如果共享数据是一个对象类型,那就需要保证对象的行为不会对其状态产生任何影响才行,像 String 类的对象。 绝对线程安全;这类的划分的定义和不可变很像,但不可变更加的纯粹,简单。如果一个对象要是绝对线程安全的,那么需要保证多个线程中,对该对象的各种行为调用组合,都会得到想要的结果。举个例子来说, Vector 是线程安全的,但并不是绝对线程安全,比如,在一个线程对一定容量大小的 Vector 进行 remove 操作,另一线程进行 get 操作,最终,你会得到一个数组越界异常,这并不是我们想要的结果。其实,绝对线程安全是一种很苛刻的条件,所以,Java 中所讲的线程安全,通常指的是下面的相对线程安全。 相对线程安全;针对单个对象的单独操作是线程安全的。像上面 Vector 的 get 、remove 等操作。 线程兼容

单例模式——我只有一个对象

与世无争的帅哥 提交于 2020-02-03 22:02:18
面试官:带笔了吧,那写两种单例模式的实现方法吧 沙沙沙刷刷刷~~~ 写好了 面试官:你这个是怎么保证线程安全的,那你知道,volatile 关键字? 类加载器?锁机制???? 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 单例模式——独一无二的对象 单例模式,从我看 《Java 10分钟入门》那天就听过的一个设计模式,还被面试过好几次的设计模式问题,今天一网打尽~~ 有一些对象我们确实只需要一个,比如,线程池、数据库连接、缓存、日志对象等,如果有多个的话,会造成程序的行为异常,资源使用过量或者不一致的问题。你也许会说,这种我用全局变量不也能实现吗,还整个单例模式,好像你很流弊的样子,如果将对象赋值给一个全局变量,那程序启动就会创建好对象,万一这个对象很耗资源,我们还可能在某些时候用不到,这就造成了资源的浪费,不合理,所以就有了单例模式。 单例模式的定义 单例模式确保一个类只有一个实例,并提供一个全局唯一访问点 单例模式的类图 单例模式的实现 饿汉式 static 变量在类装载的时候进行初始化 多个实例的 static 变量会共享同一块内存区域 用这两个知识点写出的单例类就是饿汉式了,初始化类的时候就创建,饥不择食,饿汉 public class Singleton { //构造私有化,防止直接new private

Java知识之JVM

…衆ロ難τιáo~ 提交于 2020-02-03 21:22:31
类加载器 类装载器ClassLaoder负责加载class文件,class文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则有Execution Engine决定虚拟机自带的类加载器 引导类加载器 这个类加载使用C/C++与亚伯实现的,嵌套在JVM内部,它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类 并不继承自java.lang.ClassLoader,没有父加载器 加载扩展类和应用程序类加载器,并指定未他们的父类加载器,处于安全考虑,Bootstrap启动类加载器只加载包名未java、javax、sun等开头的类 扩展类加载器 Java语言编写 派生于ClassLoader类 父类加载器为启动类加载器 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext,子目录下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载 应用类加载器 java语言编写 派生于ClassLoader类 父类加载器为扩展类加载器

Java 基础流程图、架构图

爱⌒轻易说出口 提交于 2020-02-03 20:00:51
Java 基础流程图、架构图 1. Spring 的生命周期 流程: 首次容器启动后,对 bean 进行初始化 按照 bean 的定义,注入属性 检测该贵姓是否实现了 xxxAware 接口,并将相关 xxxAware 实力注入给 bean,如 BeanNameAware 等 以上步骤,bean对象已正确构造,通过实现 BeanPostProcessor接口,可以再进行一些自定义方法处理。如:postProcessBeforeInitialzation BeanPostProcessor的前置处理完成后,可以实现postConstruct,afterPropertiesSet,init-method等方法, 增加我们自定义的逻辑 通过实现BeanPostProcessor接口,进行postProcessAfterInitialzation后置处理 接着Bean准备好被使用啦。 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法 通过给destroy-method指定函数,就可以在bean销毁前执行指定的 2. TCP 三次握手,四次握手 三次握手: 第一次握手(SYN=1, seq=x),发送完毕后,客户端进入 SYN_SEND 状态 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后

JVM系列(二)——Jvm内存结构

六月ゝ 毕业季﹏ 提交于 2020-02-03 15:57:31
    JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块,由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配;方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);栈又分为java虚拟机栈和本地方法栈主要用于方法的执行。     如何通过参数来控制各区域的内存大小呢? 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。 -XX:NewSize设置新生代最小空间大小。 -XX:MaxNewSize设置新生代最大空间大小。 -XX:PermSize设置永久代最小空间大小。 -XX:MaxPermSize设置永久代最大空间大小。 -Xss设置每个线程的堆栈大小。 没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。 老年代空间大小=堆空间大小-年轻代大空间大小     JVM和系统调用之间的关系: 1.Java堆(Heap)     对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例

java内存模型

≡放荡痞女 提交于 2020-02-03 13:22:24
1.java内存模型是什么? java内存模型即Java Memory Model,简称JMM,其规范了Java虚拟机与计算机内存时如何协同工作的,规定了一个线程如何和何时看到其他线程修改过的值,以及在必须时,如何同步访问共享变量。 2.JVM的内存分配 在解释Java内存模型之前,我们先了解下JVM的内存分配的几个概念,如下图所示,Java内存模型把内存分为两大块,一个是堆一个是栈。 堆heap:运行时的数据区,由垃圾回收负责,动态分配大小。存取速度较慢; 栈stack:存取速度比堆快,仅次于寄存器,数据可以共享,大小和生存期等是固定的 3 java内存模型的抽象结构 接下来我们从抽象角度看看线程和主存之间的抽象关系: 线程之间的共享变量存储在主内存里,每个线程都有个私有的本地内存,存储了该线程以读/写共享变量的副本。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。本地内存是JMM的一个抽象概念,并不真实存在。 从上图来看,如果线程A与线程B之间要通信的话,必须要经历下面2个步骤。 1)线程A把本地内存A中更新过的共享变量刷新到主内存中去。 2)线程B到主内存中去读取线程A之前已更新过的共享变量。 本地内存A和本地内存B由主内存中共享变量x的副本。假设初始时,这3个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中

Java虚拟机

穿精又带淫゛_ 提交于 2020-02-03 12:25:42
jvm的框架结构:jvm在运行时会产生一个运行时数据区,里面包含了方法区,Java堆,虚拟机栈,本地方法栈,程序计数器等5个模块,其中,Java堆主要用来存放Java对象实例(Java虚拟机规范写:class,instances,arrays),另外,Java堆会划分多个线程私有分配缓冲区来进行内存管理。Java堆被垃圾收集器(GC)所管理,就是说Java堆里面的内存会被GC自动管理。 来源: CSDN 作者: 过圣诞节的小马哥 链接: https://blog.csdn.net/qq_40236645/article/details/90237272