您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 浅谈JAVA内存模型
Java内存模型以及应用程序常见优化方法开场白Java工程师最初的一点疑问?Java中的类、方法是怎样放在内存中的呢?X=1是怎样一回事请呢?volatile是什么?有什么用呢?final是有何用的呢?debug查看堆栈是怎么一会事情?多线程中变量需要注意什么?Java虚拟机的内部体系结构方法区一个class的线性二进制流常量池、字段信息、方法信息、类的信息、字节码等类的静态变量被所有类实例共享所有线程共享方法区方法区也可以被垃圾收集Final常量在编译时就直接编译在class文件的常量池中class能被回收吗?堆Java程序运行时创建的所有类实例和数组都放在同一个堆中。一个JVM一个堆不同的JVM不同的堆,互不干扰多个线程共享使用一个堆程序计数器(PC寄存器)每一个线程都有它自己的PC(程序计数器)寄存器,它是在线程启动时创建的。当线程执行某个Java方法时,PC寄存器的内容总是下一条被执行指令的“地址”,地址是本地指针或者偏移量如果线程执行本地方法,PC寄存器的值是“undefined”Java栈一个线程一个Java栈(以帧为单位压栈、出栈)Java栈中包含多个帧(一个方法一个帧)Java方法返回(正常返回、异常返回),无论哪种返回,都弹出当前帧,让上一个方法的帧作为当前帧栈内的所有数据私有,两个线程间数据不共享A方法B方法C方法D方法JMM是什么的东西什么是java内存模型(JMM)JMM描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节.JMM的特征visibility可视性(多核,多线程间数据的共享)ordering有序性(对内存进行的操作应该是有序的)主存java堆内存线程引擎保证线程的正确执行顺序线程之间无法相互直接访问,变量传递均需要通过主存完成b=1是原子操作吗?a=b是原子操作吗?Java中线程和主存互操作定义了6个行为:load,save,read,write,assign和use这些操作行为具有原子性,且相互依赖,有明确的调用先后顺序指令的执行是不是线性顺序的?不是怎样解决呢?happends-beforeordering原则classSample{inta=1,b=2;voidhither(){//线程hithera=b;}voidyon(){//线程yonb=a;}}happens-before法则定义程序次序法则线程中的每个动作A都happens-before于该线程中的每一个动作B,其中,在程序中,所有的动作B都出现在动作A之后监视器锁法则对一个监视器锁的解锁happens-before于每一个后续对同一监视器的加锁Volatile变量法则对volatile域的写入操作happens-before于每一个后续对同一域的读操作线程启动法则在一个线程里,对Thread.start的调用会happens-before于每一个启动线程中的动作线程终结法则线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者重Thread.join调用中成功返回,或者Thread.isAlive返回false中断法则一个线程调用另外一个线程的interrupthappens-before于被中断的线程发现中断终结法则一个对象的构造函数的结束happens-before于这个对象finalizer的开始传递性如果Ahappens-before于B,而且Bhappens-before于C,那么Ahappens-before于CclassSample{inta=1,b=2;//线程hither调用synchronizedvoidhither(){a=b;}//线程yon调用synchronizedvoidyon(){b=a;}}Web应用和桌面程序比较Web应用性能方面的影响高并发数据量大数据库优化...机器配置8CPU、1.2G内存(或者更好)多台服务器“能加服务器解决的性能问题就不是问题?”桌面程序(永中Office)运行方式桌面程序是跑在客户端的,所以有些资源是固定的(例如CPU和内存),不像Web服务器一样可以通过加服务器来解决性能问题目标:128M,cpu667上能运行256M,cpu667上常用功能流程运行结论启动花12M内存代码30M程序优化目标内存的使用最大化不浪费内存CPU只做有用的事情不做无用功硬盘空间节省总之:能用一块钱完成的事情绝不用两块钱程序优化方法设计结构优化(效果最明显,但不通用)算法优化聪明人做的事情,我自认为不聪明,也没有这么多的算法需要你优化参数优化代码优化桌面程序内存优化Class装载减少部分Class的大小简化Class之间的引用100个小Class和一个大Class的问题(合理使用,与设计模式、代码结构之间平衡)加启动参数-vertify(减少类的加载),利用verbose检查桌面程序内存优化合理使用内存简化数据存储对象位操作共享属性属性共享文本共享定义默认属性防止内存泄漏内存回收(对象已经不再使用的情况下)Java能自己回收内存吗?能Java能回收循环引用的对象吗?能当对象不使用时需要设置obj=null吗?说法不一我认为需要(而且有成功经验),但是Web程序大部分不需要,看情况而定。其他方面优化Lazy模式,使用时才初始化短路模式和面向对象的结构有一定冲突,会影响代码结构欺骗客户的眼睛让第一次看到的不一定是真实的后台线程完成相关后续功能类似Ajax功能工具OptimizeJProfile方法设计、Code时有意识的注意性能问题完成后用工具查看性能内存是否泄漏CPU是否消耗过高,对待重点问题重点解决一套系统保证后续代码不影响前期的优化以上观点是桌面程序的优化,不一定适合于网站,但是优化的想法是相同的谢谢大家
本文标题:浅谈JAVA内存模型
链接地址:https://www.777doc.com/doc-2312565 .html