jvm java
zbuger
这个作者很懒,什么都没留下…
展开
-
关于java中的本地缓存-总结概
为什么要有本地缓存?在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大),但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略。 为什么是本地缓存,而不是分布式的集群缓存? 目前的数据,大转载 2017-04-25 23:03:57 · 2024 阅读 · 0 评论 -
volatile关键字[推荐]
Volatile关键字平时在阅读jdk源码的时候,经常看到源码中有写变量被volatile关键字修饰,但是却不是十分清除这个关键字到底有什么用处,现在终于弄清楚了,那么我就来讲讲这个volatile到底有什么用吧。当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对转载 2016-03-31 12:14:36 · 320 阅读 · 0 评论 -
java atomic
http://ifeve.com/java-atomic/引言Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。Atomic包介绍转载 2016-04-02 16:07:46 · 469 阅读 · 0 评论 -
jvm工作模式
目前的Java虚拟机支持Client和Server两种运行模式。使用参数-client可以指定使用Client模式,使用参数-server可以指定使用Server模式。默认情况下,虚拟机会根据当前计算机系统环境自动选择运行模式。使用-version参数可以查看当前的模式,如下所示:./java -version java version "1.7.0_40" Java(TM) SE R原创 2016-04-11 11:02:46 · 686 阅读 · 0 评论 -
堆内存
堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为转载 2016-03-09 16:09:44 · 393 阅读 · 0 评论 -
jvm参数设置
堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx3550m -Xms355原创 2016-03-26 21:58:33 · 326 阅读 · 0 评论 -
Synchronize实现原理(很难)
在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供Lock API外还在语法层面上提供了synchronized关键字来实现互斥同步原语。那么到底在JVM内部是怎么实现synchronized关键子的呢?一、synchronized的字节码表示: 在java语言中存在两种内建的synchronize转载 2016-03-31 22:25:15 · 14523 阅读 · 1 评论 -
聊聊JVM的年轻代
http://ifeve.com/jvm-yong-generation/1.为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们转载 2016-03-25 10:32:37 · 349 阅读 · 0 评论 -
jvm调优(二)
调优设置堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx355转载 2016-03-25 10:10:20 · 367 阅读 · 0 评论 -
jvm调优(一)
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAd转载 2016-03-25 10:09:05 · 325 阅读 · 0 评论 -
java可重入锁
目录什么是可重入锁为什么要可重入如何实现可重入锁有不可重入锁吗demo代码展示参考文章1 . 什么是可重入锁锁的概念就不用多解释了,当某个线程A已经持有了一个锁,当线程B尝试进入被这个锁保护的代码段的时候.就会被阻塞.而锁的操作粒度是”线程”,而不是调用(至于为什么要这样,下面解释).同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁,这就是可重入锁jav转载 2016-07-04 11:03:43 · 1624 阅读 · 0 评论 -
synchronize深入理解
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块。1. synchronized 方法:通过在方法声明中加转载 2016-07-05 21:57:38 · 3417 阅读 · 0 评论 -
ByteBuffer常用方法详解
缓冲区(Buffer)缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:使用缓冲区有这么两个好处:1、减少实际的物理读写次数2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数举个简单的例子,比如A地有1w块砖要搬到B地由于转载 2017-04-23 21:56:25 · 2571 阅读 · 0 评论 -
直接内存和堆内存的性能比较
背景知识在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。 显转载 2017-04-23 21:33:12 · 717 阅读 · 0 评论 -
使用sun.misc.Cleaner或者PhantomReference实现堆外内存的自动释放
Java NIO包是通过sun.misc.Cleaner和PhantomReference来实现堆外内存的自动释放的。现在我们来学习下Cleaner和PhantomReference的使用,自己封装实现堆外内存的自动释放。sun.misc.Cleaner是JDK内部提供的用来释放非堆内存资源的API。JVM只会帮我们自动释放堆内存资源,但是它提供了回调机制,通过这个类能方便的释放系统的转载 2017-04-23 16:16:01 · 619 阅读 · 0 评论 -
java堆外内存
JVM可以使用的内存分外2种:堆内存和堆外内存. 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。 使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。转载 2017-04-23 15:12:07 · 813 阅读 · 0 评论 -
Netty之Java堆外内存扫盲贴
Java的堆外内存本来是高贵而神秘的东西,只在一些缓存方案的收费企业版里出现。但自从用了Netty,就变成了天天打交道的事情,毕竟堆外内存能减少IO时的内存复制,不需要堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中;而且也没了烦人的GC。好在,Netty所用的堆外内存只是Java NIO的 DirectByteBuffer类,通读一次很快。还有一些sun.misc.*的类转载 2017-04-23 15:17:25 · 2085 阅读 · 0 评论 -
静态成员的垃圾回收
今天在网上看到一个讨论命题:当一个单例的对象长久不用时,会不会被jvm的垃圾收集机制回收。原文链接下面就对Java中的垃圾回收和静态类型做一些总结:一、Java中的内存分配1、stack(栈),用于装变量和引用类型。如基本类型和引用类型的引用变量。 2、heap(堆) ,用于装new出来的值。 3、用来装静态变量的区域。如static变量,字符串常量。 4、转载 2017-04-20 10:00:41 · 2371 阅读 · 0 评论 -
分布式系统数据一致性
在前面三篇文章中,介绍了关于分布式系统中数据一致性的问题,这一篇主要介绍CAP定理以及自己对CAP定理的了解。CAP定理是2000年,由 Eric Brewer 提出来的Brewer认为在分布式的环境下设计和部署系统时,有3个核心的需求,以一种特殊的关系存在。这里的分布式系统说的是在物理上分布的系统,比如我们常见的web系统。这3个核心的需求是:Consistency,Av转载 2016-04-03 23:16:32 · 506 阅读 · 0 评论 -
G1垃圾收集器入门
G1垃圾收集器入门说明concurrent: 并发, 多个线程协同做同一件事情(有状态)parallel: 并行, 多个线程各做各的事情(互相间无共享状态)参考: What’s the difference between concurrency and parallelism概述目的本文介绍如何使用G1,及在 Hotspot JVM 中怎么转载 2016-07-28 22:48:22 · 858 阅读 · 0 评论 -
Sun JVM 年轻代和老年代垃圾回收都需要暂停JVM
The Young Generation is where all new objects are allocated and aged. When the young generation fills up, this causes a minor garbage collection. Minor collections can be optimized assuming a high obj转载 2016-07-28 22:20:05 · 1224 阅读 · 0 评论 -
JVM调优工具
http://pengjiaheng.iteye.com/blog/552456Jconsole,jProfile,VisualVMJconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里 JProfiler:商业软件,需要付费。功能强大。详细说明参考这里 Visua转载 2016-03-23 21:22:58 · 448 阅读 · 0 评论 -
Spring Bean生命周期
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例.Spring 中bean 的生命周期短暂吗?在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一转载 2016-03-31 20:15:54 · 328 阅读 · 0 评论 -
JNDI 是什么
JNDI 是什么JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。那么,JNDI到底起什么作用?要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”转载 2016-03-22 10:32:06 · 306 阅读 · 0 评论 -
CMS垃圾回收器
1.总体介绍:CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。2.CMS过程:初始标记(STW initial m转载 2016-04-01 12:44:52 · 675 阅读 · 0 评论 -
HashMap的key是对象
使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。 1.hashcode()和equals()是在哪里被用到的?什么用的? HashMap是基于散列函数,以数组和链表的方式实现的。 而对于每一个对象,通过其hashCode()方法可为其生成一个整形值(散列码),该整型值被处理后,将会作为数组下标,存放该对象所对应的原创 2016-03-31 20:39:04 · 4932 阅读 · 2 评论 -
Full Gc触发条件
除直接调用System.gc外,触发Full GC执行的情况有如下四种。1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space 为避免以上两种状况引起的Full GC,调优时应尽量做原创 2016-03-31 19:49:34 · 1763 阅读 · 0 评论 -
Scanner 的坑
一般在java中扫描用Scanner sc=new Scanner(System.in);本来想着要在扫描的时候将sc关闭的,就这么用sc.close();可是今天写了一个程序,scan了很多次,中间还有嵌套的,所以在子扫描中关闭了,然后回到main方法,出现了exceptionException in thread "main" java.util.NoSuchElementEx原创 2016-03-19 21:57:40 · 644 阅读 · 0 评论 -
java线程池
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。转载 2016-03-19 12:33:55 · 324 阅读 · 0 评论 -
class文件结构
Java语言是跨平台的,其跨平台的基石是字节码,字节码按照java虚拟机规范的格式组成了class文件,并在虚拟机上运行。因此class文件的结构也是java跨平台很重要的一个基础。下面简单看看class文件的结构:以上是class文件的基本结构,整个class文件分Magic,Version,Constant_pool,Access_flag,This_class,S转载 2016-03-31 13:18:10 · 484 阅读 · 0 评论 -
老年代对象的来源
一般情况是三种,但是尤其以第一种来源最多1.新生代对象每经历依次minor gc,年龄会加一,当达到年龄阀值会直接进入老年代。阀值大小一般为152.Survivor空间中年龄所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而无需等到年龄阀值3.大对象直接进入老年代原创 2016-03-31 12:47:15 · 2233 阅读 · 0 评论 -
java内存泄漏
一、Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方转载 2016-03-18 19:44:43 · 314 阅读 · 0 评论 -
Java序列化机制中的类版本问题
Java序列化机制中的类版本问题内容简介某些实现了serializable接口的java类中会看到名称为serialVersionUID的静态字段,本文从根本上解释这个字段的含义。知识铺垫在java中,类的序列化和反序列化是由jvm实现,当然,不同的jvm可能有不同的实现方式,本文讨论java官方的jvm版本。一个类,实现serializable接口之后原创 2016-03-31 21:24:12 · 719 阅读 · 0 评论 -
java反射原理
【转自 http://blog.csdn.net/xiaoxian8023 】 Java中反射机制使用的还是比较广泛的,系统的灵活性、可扩展性大都都是通过反射等方式来加载外部插件,使得系统与插件解耦的同时,增加了功能。但是很多人都只是会用,却是不知道它的实现机制,今天就由我来带大家揭开反射机制的神秘面纱。原创 2016-03-31 09:38:09 · 301 阅读 · 0 评论 -
java volatile内存操作细节
在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量原创 2016-04-03 16:48:46 · 507 阅读 · 1 评论 -
volatile的特性
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = 0L;转载 2016-03-23 22:12:21 · 363 阅读 · 0 评论 -
java串行化
一、串行化的概念和目的1.什么是串行化对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization)。串行化的主要任务是写出对象实例变量的原创 2016-03-31 21:16:43 · 1395 阅读 · 0 评论 -
java Semaphore
Semaphore为并发包中提供用于控制某资源同时可以被几个线程访问的类实例代码:[java] view plain?// 允许2个线程同时访问 final Semaphore semaphore = new Semaphore(2); ExecutorService executorService =转载 2016-04-02 15:53:20 · 726 阅读 · 0 评论 -
java动态代理实现原理
http://rejoy.iteye.com/blog/1627405之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白。比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了。 废话不多说了,先来看一下JDK的动态是怎么用的。 Java代码 packag转载 2016-04-02 10:14:03 · 536 阅读 · 1 评论 -
一个简单的java缓存实现
一个简单的java缓存实现import java.util.Map;import java.util.WeakHashMap;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLoc原创 2016-04-02 10:09:12 · 1030 阅读 · 0 评论