本地线程

JVM学习

谁都会走 提交于 2019-12-02 13:43:22
      一、程序计数器    记住下一条jvm指令的执行地址,解释器会去程序计数器拿jvm指令。   线程私有的 ,CPU会给每个线程分配时间片,时间片执行完会切换线程。    唯一不会出现内存溢出的区域。 二、虚拟机栈    线程运行需要的内存空间,每个线程都有一个栈。    由多个栈帧组成,每个方法运行需要的内存(参数、局部变量、返回值),先入后出。    每个线程只能有一个活动栈帧,就是正在执行的方法。    垃圾回收不涉及栈内存。    栈内存参数:-Xss 1024k。 栈内存变大,总线程就会变少。     方法内的局部变量如果没有逃离方法的作用范围,则是线程安全的。    栈内存溢出错误: StackOverflowError     案例 :     ( 一 )CPU占用过高        1、查看所有进程的cpu占用率,获取哪个进程占用cpu最高: top 。       2、查看某个进程的那个线程占用cpu最高: ps H -eo pid,tid,%cpu | grep ${pid} 。       3、查看某个进程的所有线程详细信息: jstack ${pid} 。 三、本地方法栈    本地方法运行使用的内存,例如object.clone(),被 native 修饰的。 四、堆(heap)    通过new创建的对象都会放在堆中,线程共享的,有垃圾回收机制

春秋招面经总结:下个篇章的开始

依然范特西╮ 提交于 2019-12-02 12:50:31
写在前面 1. 写作目的: 对自己上一阶段的总结,也希望给准备找工作的同学们多多少少一点帮助,大牛们请无视。 2. 基本介绍 :普通985本+海外渣硕,大二转到CS专业,大三项目交流3+2,19年10月留学毕业,有工程项目,无实习无额外加分项,主Java研发岗,非battmd级别选手,加一起拿了4个offer,最后准备去星环了。 一,面经集合(按公司划分) 最早是去年的12月开始,中间有几个月在研究室抗压没有面,考虑到读者的阅读喜好所以按公司划分面经,强调一点是时间线很重要,前后自己面试能力也有差距,请留意。一般都是远程视频/电话面,每场面经内问题提问顺序不定。一些过于水的面经没有包括在内(比如8月前的某为,银行) 字节跳动 字节跳动一面12.24(游戏研发 秋招补招) 程序: 1.实现优先队列 2.设计2D游戏功能 输入两个角色位置 输出射击转向角 3.环形buffer设计 提问: 1.二叉树与堆的关系 2.B+树 3.时间复杂度 4.内积点乘叉乘 5.CAS机制 6.重载 重写和多态 字节跳动二面12.28 1.内积点乘叉乘 2.堆 3. 排序 各种数据结构 4. 时间复杂度空间复杂度分析 5. 集合类中为什么不用int(为什么Java集合不能存放基本数据类型,只存放对象的引用) 6. 同步和异步 7. 多态 8. TCP表头 9. 四次挥手 字节跳动一面3.30(服务器研发

Java线程面试题 Top 50

白昼怎懂夜的黑 提交于 2019-12-02 12:48:21
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请 点击这里 。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请 点击这里 。 3) 如何在Java中实现线程? 在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。更多详细信息请 点击这里 . 4) 用Runnable还是Thread? 这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答

JVM内存结构

安稳与你 提交于 2019-12-02 12:33:59
JVM运行时内存区域结构 一、方法区(线程共享) 1. 什么是方法区? 方法区是系统分配的一个内存逻辑区域,用来存储类型信息(类的描述信息)。 2. 方法区的特点 方法区是线程安全的。由于方法区是线程共享的,所以方法区的数据访问必须设计成是线程安全的。例如,如果有多个线程访问方法区的同一个类,而这个类还没有被加载,这时候只能有一个线程去进行类加载,其他的线程必须等待。 方法区的大小不是固定的。JVM可以根据应用需要动态的调整。此外,方法区也不必是连续的。 方法区也可以被垃圾回收,当某个类不再被使用的时候,JVM将卸载这个类,进行垃圾回收。 3. 方法区里面存的是什么? 3.1 类型信息 对每个加载的类型,JVM必须在方法区保存这个类型的: 类型的全限定名 这个类型直接父类的完整有效名(java.lang.Object和Interface除外) 这个类型的修饰符(public,abstract, final的某个子集) 直接超接口的全限定名 类型标志(该类是类类型还是接口类型) 3.2 类型的常量池 存放该类型所用到的常量的有序集合,包括直接常量(如字符串、整数、浮点数的常量)和对其他类型、字段、方法的符号引用。常量池中每一个保存的常量都有一个索引,就像数组中的字段一样。因为常量池中保存中所有类型使用到的类型、字段、方法的字符引用,所以它也是动态连接的主要对象

ThreadLocal简介与原理

断了今生、忘了曾经 提交于 2019-12-02 12:27:32
一、引入场景 1. 打印方法执行的耗时 public void service(){ before(); doSomething(); after(); } 2. 在before和after记录当前时间,两者相减得到doSomething()的耗时 private long startTime; // 定义变量开始时间 public void before(){ startTime=System.CurrentTimeMills(); // 记录开始时间 } public void doSomething(); public void after(){ endTime=System.CurrentTimeMills(); // 记录结束时间 costTime=endTime-startTime; // 计算耗时 } 3. 多线程下,共享变量开始时间startTime可能会被别的线程改写,不是线程安全的 4. 多线程解决方法: a. 加锁,性能不好 b. ThreadLocal 二、概念 1. ThreadLocal线程本地变量,即把共享变量拷贝一份放在当前线程内,变成线程私有的变量 2. 变量的生命周期在当前线程范围内,别的线程不能访问,线程间数据隔离 3. 场景:当一个变量需要与线程关联,并且线程后面还会用到该值,比如traceId 三、ThreadLocal原理 1.

jav面试(十五)--(1)请谈一谈ClassLoader(类加载器), 以及对双亲委派模型理解(2)JVM内存(3)JAVA锁(4)ThreadLocal

限于喜欢 提交于 2019-12-02 11:02:33
1.请谈一谈ClassLoader(类加载器), 以及对双亲委派模型理解 从java虚拟机的角度讲,只有两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用的是c++实现的,是虚拟机的一部分,另一类就是所有其他类加载器,这些类加载器都由java语言实现,独立于虚拟机外部,并且全都继承自抽象类。 从开发人员的角度看,类加载器还可以划分为3种系统类加载器: 启动类加载器(Bootstrap ClassLoader) ,负责加载存放在<JAVA_HOME>/lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符的类库即使放在lib目录中也不会被加载)类库加载到虚拟机中内存中。启动类加载器无法被java程序直接引用,用户在编写自定义类加载器是,如果需要把加载请求委派给引导类加载器,那直接使用null代替即可。 扩展类加载器(Extension ClassLoader) :这个类加载器有sun.misc.Launcher$ExtClassLoader实现,负责加载<JAVA_HOME>/lib/ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。 应用类加载器(Application

hibernate openSession()和getCurrentSession()区别

≡放荡痞女 提交于 2019-12-02 10:09:04
<1> getCurrentSession创建的session会和绑定到当前线程,而openSession(重新建立一个新的session )不会。 <2> getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭 <3> getCurrentSession设置本地事务时要,在hibernate.cfg.xml文件里进行如下设置: <property name=“hibernate.current_session_context_class”>thread</property> 参考 :http://blog.csdn.net/loveyout/article/details/4193894 来源: oschina 链接: https://my.oschina.net/u/1989867/blog/542264

mysql优化

风格不统一 提交于 2019-12-02 09:19:22
Mysql优化 字段设计 遵循三范式。你想想你们公司如果连数据库字段都没有一个规则的话,也就是说你们公司开发都没有一个限制,那么你们是不是开发起来对接起来很麻烦呀,包括后面来的人接手前面的工作,完成搞不懂前一个 人的开发流程。这样维护起来是不是很麻烦? 原则:定长和非定长数据类型的选择 decimal不会损失精度,存储空间会随数据的增大而增大。double占用固定空间,较大数的存储会损失精度。非定长的还有varchar、text 原则:尽可能使用 not null 非 null 字段的处理要比 null 字段的处理高效些!且不需要判断是否为 null 。 因为 null 在 MySQL中,不好处理,存储需要额外空间,运算也需要特殊的运算符。 语句优化: 语句 1:select * from student limit 9,4 语句 2:slect * from student limit 4 offset 9 // 语句1和2均返回表student的第10、11、12、13行 // 语句2中的4表示返回4行,9表示从表的第十行开始 再 说一下我数据库查询这里的思路,因为逐步写入 EXCEL的数据实际上来自Mysql的分页查询,大家知道其语法是 LIMIT offset, num 不过随着 offset 越来越大 Mysql在每次分页查询时需要跳过的行数就越多

java高级-高性能-多线程并发编程--1.1.1 java程序运行原理

蹲街弑〆低调 提交于 2019-12-02 09:18:01
了解内容 class文件 class文件包含了java程序执行的 字节码 ; 数据按照格式紧凑的排列在class文件中的二进制流 ,中间无任何分割符; 文件 开头 有一个 16进制特色的标志(0x ca fe ba be) 复杂的文件格式并不是给程序员看的 ,而是专门给JVM 看,人可以借助工具查看. 经过不同的JVM解析 , 转换为具体平台上的机器指令 实现跨平台 class内容 线程角度看内存图的介绍 方法区 JVM用来存储加载的类信息, 常量,静态变量,编译后的代码等数据. 每一个Java应用都唯一对应一个JVM实例, 每一个实例唯一对应一个堆 。应用程序在运行中所创建的 所有类实例或数组 都放在这个堆中,并由应用所有的线程共享. 堆内存 可以细分为: 老年代 ,新生代 JVM启动时创建,存放对象的实例. 这里涉及 垃圾回收器 虚拟机栈 用于执行java方法 设立的 每个线程都在这个空间有一个私有的空间. 线程栈=栈帧+栈帧+栈帧+栈帧+栈帧+… 一个线程会执行一个/多个方法 ,一个方法对应一个栈帧 栈帧包含:局部变量,操作数栈 ,动态链接 ,方法返回地址,附加信息等 栈内存默认最大是1M,超出 抛出异常 StackOverflowError 堆 溢出 错误 本地方法栈 和虚拟栈类似 . HotSpot虚拟机中 虚拟机栈和本地方法栈 是一样的 用于为虚拟机使用Native

转:理解ThreadLocal

杀马特。学长 韩版系。学妹 提交于 2019-12-02 08:38:23
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。 线程局部变量并不是Java的新发明,很多语言(如IBM IBM XL FORTRAN)在语法层面就提供线程局部变量。在Java中没有提供在语言级支持,而是变相地通过ThreadLocal的类提供支持。 所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。 ThreadLocal的接口方法 ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: void set(Object value)