
JAVA
文章平均质量分 82
早就戒了
这个作者很懒,什么都没留下…
展开
-
浅谈JVM(四)——类加载
Java中任何一个类型对象在使用之前都必须经历加载、连接、初始化三个类加载步骤。一旦成功执行这三个步骤,它就可以被使用了,我们可以通过访问类的静态类成员表变量,或者使用new关键字创建对象实例。类加载器类加载是JVM执行类加载的前提。简单来说,类加载的主要任务就是根据一个类的全限定名来读取此类的二进制字节流(.class)文件到JVM内部,然后再转为一个实例对象。在程序中,类加载器只有三种:Boo原创 2017-10-18 20:14:26 · 405 阅读 · 0 评论 -
浅谈JVM(一)——JVM内存模型
JVM内存模型如下图所示:JVM运行时,内粗可以分为如下几个部分:堆(Heap)方法区(Method Area)虚拟机栈(Java Stack)本地方法区(Native Method Stack)程序计数器(PC Register)堆(Heap)和方法区堆(Heap)Java堆是绝大多数Java开发人员最关注的。堆是属于线程共享的一块内存区域,它在JVM启动的时候被创建,并且在实际空间中原创 2017-10-16 19:39:04 · 424 阅读 · 0 评论 -
JAVA并发编程(七)——线程池
什么是线程池?为了避免系统频繁的创建和销毁线程,我们可以让创建好的线程重复使用,类似与数据库开发中经常接触到的数据库连接池。在线程池中,会有几个活跃着的线程,当我们需要线程的时候直接从里面拿取空闲的线程来使用,使用完以后,直接归还即可。JDK中的Executor框架为了能更好的控制多个线程,JDK中java.util.cocurrent 包下提供了Executor框架,帮助发开人员控制线程的启动、执原创 2017-10-14 15:36:10 · 274 阅读 · 0 评论 -
JAVA并发编程(六)——性能优化(下)
对于高并发的环境下,无论使用什么加锁策略,程序的性能始终不能与无锁的程序相媲美,那么是否存在一种不使用加锁也能实现各个线程之间同步的策略呢?答案当然是肯定的。那就是比较交换(CAS)策略。CASAtomicInteger、AtomicLongUnsafeAtomicReference、AtomicStampedReferenceCASCAS是比较交还的英文缩写,和使用锁相比,使用CAS会使原创 2017-10-14 10:39:05 · 396 阅读 · 0 评论 -
JAVA并发编程(四)——线程状态与中断
本节主要来讲一讲线程的状态以及它的中断,就好像描述一个美女的外貌,是性感的,有气质的,还是可爱的(不是很恰当的比喻)。线程的各种状态以及转换 New Runnable Waiting TimedWaiting Ready Blocking Terminated线程的中断以及处理 interrupt、 interrupted、isinterrupted(); InterruptE原创 2017-10-13 16:59:58 · 293 阅读 · 0 评论 -
JAVA并发编程(五)——性能优化(上)
在程序中加入锁是非常消耗性能的,对锁的申请和释放需要消耗大量的资源,所以我们需要对上锁的程序进行优化,在保证程序正确运行的前提下提高性能。我们能做的 减小锁的占有时间 减小锁的粒度 用分离锁代替独占锁 锁粗化JVM能做的 锁偏向 轻量级锁 自旋锁 锁消除ThreadLocal我们能做的减小锁的占有时间我们对比一下下面两个例子:public syn原创 2017-10-13 20:33:49 · 536 阅读 · 1 评论 -
浅谈JVM(五)——字节码文件ClassFile
Java代码被前端编译器javac成功编译为一个符合Java虚拟机规范的字节码文件,然后JVM读取运行字节码文件。那么我们平常写的java代码编译后的字节码文件是怎样的呢?以及怎样的字节码文件符合规范的呢?一般来说ClassFile文件结构如下;ClassFile{ u4 magic; u2 minor_version; u2原创 2017-10-30 15:36:53 · 323 阅读 · 0 评论 -
浅谈JVM(二)——内存分配和垃圾回收
对于C/C++开发人员来说,他们需要在代码层面上控制一个对象生命周期,自由宣布对象的产生和灭亡。我们称之为手动的内存管理。虽然灵活,但是增加了内存溢出和内存泄漏的风险。而对于Java来说,我们并不需要手动的内存管理,因为JVM自带了内存管理机制,实现了自动的内存管理,并且会大大降低出现内存溢出和内存泄漏的风险。但是,过度的依赖于JVM自带的内存管理机制,会弱化我们在程序出现内存溢出时问题的定位和解原创 2017-10-16 21:00:58 · 365 阅读 · 0 评论 -
JAVA并发编程(二)——同步控制(上)
在并发编程中,同步控制是最重要也是最需要保障的。想象这样的场景:你去银行取了100万,余额理应还有900万,但是ATM机却告诉你,余额还剩1000万,那这多出来的100万哪里来的呢?这里我将介绍JAVA中控制线程同步最基本的方法。同步控制基本方法Synchronized和他的伙伴ReentrantLock和他的女朋友们Synchronized、wait()、notify()Synchronized原创 2017-10-12 16:37:36 · 332 阅读 · 0 评论 -
JAVA并发编程(一)—基本概念和术语
JAVA并发编程(一)—基本概念和术语 在学习java并发编程时候之前,我们必须要搞清楚一些基本概念和术语。 1.并发和并行的区别 2.线程和进程的区别 3.阻塞和非阻塞 4.死锁、饥饿 5.原子性、可见性 6.指令重排 1.同步和异步的区别并发和并行是一个非常容易混淆的概念,也是面试中面试官经常问到的问题,虽然两者都可以表示多个任务一块执行,但是侧重点原创 2017-10-12 15:42:41 · 753 阅读 · 0 评论 -
JAVA并发编程(八)——Callable和Future
Future模式在多线程开发中,Future模式是经常使用到的一种设计模式,其核心思想就是异步调用。当我们要调用一个函数方法fun时,fun的执行很慢,如果我们不需要着急知道fun的结果时,我们可以让调用者直接返回去做其他的任务,让fun在后台继续执行。当我们需要用到fun的结果时再去取。Future模式就好像我们在网上购物,我们只要负责下单就可以做自己的事情,而不需要傻傻的等待商品到来。我们只需要原创 2017-10-19 09:44:08 · 395 阅读 · 0 评论