本地线程

解决Unable to create new native thread

不羁的心 提交于 2019-12-26 20:36:00
两种类型的Out of Memory java.lang.OutOfMemoryError: Java heap space error 当JVM尝试在堆中分配对象,堆中空间不足时抛出。一般通过设定JAVA启动参数 -Xmx 最小可用内存解决。 java.lang.OutOfMemoryError: Unable to create new native thread 当JVM向OS申请创建线程,而OS不能分配一个本地线程时抛出。 了解系统参数 系统级最大进程ID $ sysctl -a | grep kernel.pid_max kernel.pid_max = 32768 # 输出结果表示当前系统允许的最大进程数为32768 $ cat /proc/sys/kernel/pid_max # 命令功用与上述同样 $ echo 200000 > /proc/sys/kernel/pid_max # 修改系统级最大进程数为200000,可通过sysctl查看修改 系统级最大线程数 # /proc/sys/kernel/threads-max 限制了系统级最大线程数 $ echo 120000 > /proc/sys/kernel/threads-max # 修改系统级最大线程数为120000,可通过sysctl查看修改 # Linux没有每个进程单独的最大线程数限制 ulimit

JVM知识点整理

*爱你&永不变心* 提交于 2019-12-26 17:28:47
JVM Java虚拟机在执行java程序的过程中,会把它的内存划分为若干个不同的运行时数据区域,如图所示: 程序计数器PC 程序计数器是一块较小的内存空间,字节码解释器工作时,就是通过改变这个计数器的值来选取下一条要执行的字节码指令。 如果线程执行的是java方法,计数器存储的 正在执行 的虚拟机字节码地址 如果线程执行的是native方法,那么这个计数器值为空(Undefined) 为了线程切换后,会回到正确的执行位置,每个线程都需要有一个独立的程序计数器(线程私有的) 唯一不会报出Out of Memory的区域 虚拟机栈 概念 Java虚拟机栈也是线程私有的。它的生命周期与线程相同。 虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时,会创建一个栈帧,该栈帧用于存储局部变量表、操作数栈、动态链接方法出口等信息。每一个方法从调用到执行完成的过程,就对应着一个栈帧入栈到出栈的过程。 经常有人说“栈内存”,就是指虚拟机栈。 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlow异常。 如果虚拟机栈的大小可以动态扩展,但是虚拟机无法申请到足够的内存,就会抛出OutOfMemory异常。 栈帧 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息。 局部变量表

python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用

余生颓废 提交于 2019-12-26 00:47:31
什么是多任务? 简单地说,就是操作系统可以同时运行多个任务。实现多任务有多种方式, 线程、进程、协程。 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已) 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的 真的多任务叫并行,假的多任务叫并发 。 我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务。 一个CPU,在一个时间切片里只能运行一个程序。 从操作系统的角度: 进程和线程,都是一种CPU的执行单元。 进程:表示一个程序的上下文执行活动(打开、执行、保存...) 线程:进程执行程序时候的最小调度单位(执行a,执行b...),可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等, 线程是操作系统调度执行的最小单位 一个程序至少有一个进程,一个进程至少有一个线程。 多进程/多线程: 表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。 进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。 进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。 进程是系统进行资源分配的最小单位 线程:一个进程可以有多个线程

深入理解JVM - JVM内存模型

不羁的心 提交于 2019-12-25 23:00:54
各版本的差异 JDK1.6 在JDK1.6 的时候运行时常量池在方法区中 JDK1.7 在JDK1.7 的时候运行时常量池在堆中 JDK1.8 在JDK1.8 的时候,JVM内存模型直接将方法区移到了本地内存中,叫元数据空间。该区域的内存大小就只受本机总内存的限制,但是当申请不到足够内存时也会报出 程序计数器 主要作用是:存储当前线程运行时的字节码行号,占用空间小且线程私有。 字节码解释器会通过改变程序计数器的值来选取下一条需要执行的字节码指令,并且分支(if)、循环、跳转、异常处理、线程恢复等基础功能都是基于程序计数器来实现的。 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 JAVA 虚拟机栈 线程私有,描述的是Java方法执行的内存模型,主要作用是:存储运行当前线程需要执行的所有方法所对应的栈帧。 一个线程栈的默认大小是1M,可用参数 –Xss调整大小,例如-Xss256k; 栈帧 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是Java 虚拟机栈(Virtual Machine Stack)的栈元素。 每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法的执行过程,就是一个栈帧在虚拟机栈中从入栈到出栈的过程。

JVM(一)JVM的基本结构

这一生的挚爱 提交于 2019-12-25 18:25:02
JVM基本结构 一 JVM基本结构示意图 二 JVM结构详解 一 程序计数器   程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,如果线程执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果是一个Native方法,则这个计数器的值为空(Undefined). 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器的执行时间来实现的,在任何一个确定的时刻,一个处理器都会执行一条线程中的指令,因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的线程计数器,各个线程之间计数器互不影响,独立存储,这类内存区域为“线程私有”的内存。 二 虚拟机栈(Virtual Machine Stacks)   Java虚拟机栈与程序计数器一样,是线程私有的,它的生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈,动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 局部变量表: 1 存放基本数据类型   byte、shot、int 、boolean、double、char 占用一个局部变量空间 float、long 占用两个局部变量空间 2 对象引用   reference类型,他不等同于对象本身

各大公司Java后端开发面试题

吃可爱长大的小学妹 提交于 2019-12-25 13:14:40
各大公司Java后端开发面试题 原创 2017年03月01日 11:31:11 标签: java / 面试题 / Spring / 春招 / BAT 40184 ThreadLocal(线程变量副本) Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。 采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。 ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。 ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。 Spring中绝大部分Bean都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了。 友情链接: 深入研究java.lang.ThreadLocal类 Java内存模型: Java虚拟机规范中将Java运行时数据分为六种。 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置

Java并发编程(五) 任务的取消

笑着哭i 提交于 2019-12-25 03:00:22
在Java中无法抢占式地停止一个任务的执行,而是通过中断机制实现了一种协作式的方式来取消任务的执行。外部程序只能向一个线程发送中断请求,然后由任务自己负责在某个合适的时刻结束执行。 1. 设置取消标志 这是最基本也是最简单的停止一个任务执行的办法,即设置一个取消任务执行的标志变量,然后反复检测该标志变量的值。 public class MyTask implements Runnable { private volatile running = true; public void run() { while(running) { //...操作 } } public void stop() { running = false; } } 通常需要使用volatile关键字来修饰标志变量,以保证该任务类是线程安全的。但是,如果run方法中存在阻塞的操作,则该任务可能永远也无法正常退出。 2. 中断线程的执行 每个线程都有一个boolean类型的变量来标志该线程的中断状态,Thread类中包含三个与中断状态相关的方法: interrupt方法试图中断线程并设置中断状态标志变量为true; isInterrupted方法测试线程是否已经中断,返回中断状态变量的值; interrupted方法用于清除线程的中断状态,并返回之前的值,即如果当前线程是中断状态,则重新设置为false

Java并发编程:深入剖析ThreadLocal

 ̄綄美尐妖づ 提交于 2019-12-25 02:12:39
Java并发编程:深入剖析ThreadLocal   想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。   以下是本文目录大纲:   一.对ThreadLocal的理解   二.深入解析ThreadLocal类   三.ThreadLocal的应用场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3920407.html 一.对ThreadLocal的理解   ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。   这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。   我们还是先来看一个例子: class ConnectionManager { private static Connection connect = null; public static Connection

吃透了这些JVM核心知识点,阿里架构师都问不倒你!(附学习笔记+面试真题+视频解析)

自闭症网瘾萝莉.ら 提交于 2019-12-25 00:13:53
作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识。 JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准。而大多数人可能没有对 JVM 的实际开发和使用经验,接下来这一系列文章将带你深入了解 JVM 需要掌握的各个知识点。这也将帮助你完成从初级程序员到高级程序员的转变。 今天分享一份平时学习的Java程序员必备的JVM学习文档,这份文档不管是懂得JVM的开发者和刚刚学习的朋友都是一份非常不错的内容,同时也是面试复习的精选文档!还准备了一份目前互联网公司Java面试的高频面试知识点文档免费分享给大家! 这份JVM知识整理文档内容包括: JVM面试专题 JVM和性能优化学习思维笔记(Xmind) 深入理解Java虚拟机 Java虚拟机并发编程 Java虚拟机:JVM高级特性与最佳实践 JVM性能调优-JVM内存整理及GC回收 实战Java虚拟机 快速获取资源传送门: 史上最详细面试学习核心笔记免费获取:Java基础+算法+JVM+数据库+SSM框架+Redis+消息队列+Spring全家桶等 内存模型以及分区,需要详细到每个区放什么。 JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区 new: 方法区:主要是存储类信息,常量池

jmeter基础概念

两盒软妹~` 提交于 2019-12-24 21:45:23
从性能工具的原理划分 : Jmeter工具和其他性能工具在原理上完全一致,工具包含4个部分: (1)负载发生器:用于产生负载,通常以多线程或是多进程的方式模拟用户行为。 (2)用户运行器:通常是一个脚本运行引擎,用户运行器附加在线程或进程上,根据脚本要求模拟指定的用户行为。 (3)资源生成器:用于生成测试过程中服务器、负载机的资源数据。 (4)报表生成器:根据测试中霍地的数据生成报表,提供可视化的数据显示方式。 测试计划元件 Test Plan (测试计划) :用来描述一个性能测试,包含与本次性能测试所有相关的功能。也就说本的性能测试的所有内容是于基于一个计划的。 下面看一下一个计划下面都有哪些主要的功能模块(右键单击“测试计划”弹出菜单)。 Threads (Users)线程 用户 虽然有三个添加线程组的选项,名字不一样, 创建之后,其界面是完全一样的。之前的版本只有一个线程组的名字。现在多一个setUp theread Group 与terDown Thread Group 1) setup thread group   一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行。 2) teardown thread group.   一种特殊类型的ThreadGroup的