一、内存管理:
 
1,内存结构:
栈和堆区别,栈是连续内存区,一般是2M单位,堆是不连续的链表。受限于虚拟内存,new时分配
PC寄存器、java栈、堆、方法区、本地方法区、运行常量池
java栈:对应一个线程,每个栈中的栈帧关联每个方法,运行一个方法创建一个栈帧,执行完就弹出栈帧。不是线程共享,不用关心数据一致性和同步锁这些线程问题。
:程序猿最关心的,是new对象和对象数组时创建的,所有线程共享,保证一致性。
方法区:储存类结构信息,比如class文件解析后,常量池,方法数据,方法体,构造函数,实例初始化等储存在这里。
常量区:每个class文件的常量表,是方法区的一部分。即和方法区的常量池是一回事。
本地方法栈,为运行Native方法准备的,类似java栈。
 
 
2,内存分配策略:
静态分配: 程序编译和连接的时候,不允许有可变数据结构如可变数组,也不允许嵌套或递归。 C语言,源文件大小,和编译生成另外一个大小
栈内存分配:程序对数据区编译时是未知的,运行时才知道,但规定进入一个程序模块时,必须知道所需的数据区大小。也是先进后出的栈
堆分配:运行到相应代码时才会知道空间大小。
 
3,java内存分配:
堆和栈
栈一般不关心,是对应到线程的。速度比对快,仅次于寄存器。栈帧的数据大小和生存期必须确定,缺乏灵活性。
堆,程序猿最要关心的,每个java应用对应唯一JVM实例,每个实例唯一对应一个堆。当然由这个应用的所有线程共享。由于垃圾回收GC来释放。
通俗的说,栈来执行程序,一个栈对应一个线程,堆来存放对象。堆要请求操作系统来分配内存,所以分配和销毁都需要时间,所以效率低。优点是灵活可变。
 
二、内存回收
 
1,静态内存回收
自动的,方法结束,对应的栈帧也就撤销。
 
2,动态内存回收
对象是否被使用,何时回收。
不被引用的对象,即不可达。这些对象会被回收
 
内存泄露就是被引用了,可达的。但是无用的,程序不用使用它们。不被GC回收,占内存浪费。
 
三、基于分代GC算法
 
分几组,年轻和年老的,几次回收后还存活,就放到年老组,年老组手机频度不那么高。
对不同的区使用不同收集算法。
1,串行
在client模式下默认,单线程完成,JVM其他应用被暂停。
适合内存有限,回收慢
 
2,并行
在server模式下默认,多线程,其它应用也被暂停。
效率高,堆过大时,暂停时间长
 
3,并发
并发数默认为4
old区暂停时间段,但产生内存碎片,耗CPU

4,G1收集器

G1是目前垃圾收集技术发展的最新成果之一,它与前面的几款GC最大的不同在于:
 
G1可管理整个堆区,包括新生代和老年代。G1在物理上不区分新生代和老年代。G1会把整个堆划分为很多区域(Region),新生代和老年代现在变更了仅仅是逻辑上的概念,它们并不需要在物理上严格区分。G1会对所有Region进行回收效率排序,优先清理回收效率最高的Region
除此之外,G1与CMS也是并发执行的GC,即执行清理时可以与用户线程同时(并发)执行,但是G1可以做到比CMS更短暂的停顿时间
 
 
GC组合实践:Server模式下的HotSpot JVM
为新生代和老年代指定不同的GC
1,老年代用并发
2,-XX:UseG1GC  全部用G1GC
 
-Xms是设置内存初始化的大小
-Xmx是设置最大能够使用内存的大小
 
设置方法:
1,eclipse可以设置VM参数 对在当前开发环境中运行的java程序皆生效
编辑当前使用的JRE,在缺省VM参数中输入:
 
2,tomcat,对tomcat下的应用程序生效
打开Tomcat根目录下的bin文件夹,编辑catalina.bat,在setJAVA_OPTS=%JAVA_OPTS%....这句之后加上:setJAVA_OPTS=%JAVA_OPTS%-Xms1024m-Xmx1024m
 
四、内存泄露
 
就是被引用了,可达的。但是无用的,程序不用使用它们。不被GC回收,占内存浪费。
如何检测JVM内存泄漏
如何检测Java的JVM内存泄漏。目前,我们通常使用一些工具来检查Java程序的JVM内存泄漏问题。市场上已有几种专业检查JavaJVM内存泄漏的工具,它们的基本工作原理大同小异,
都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化
 
五、写代码时要注意的内存泄露
 
0,单例+对象池是个好习惯,无论数据库连接池、http连接池,还是redis,MQ消息队列。可以说单例+对象池是性能优化的万能灵药,减少了资源占用,提升了效率。
1,避免使用Vector,对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象。也要注意List、MAP
2,小心内部类,如果内部类被引用了。导致整个对象被引用,实际上整个对象可能用不到。
3,注意代码中死循环或递归调用 
由于我是C#转来的,Vector和内部类不在我的食谱中无需考虑。
3,Js也要小心内存泄露。同样小心循环引用,对于后台人员写JS,这不是问题
 
 
 

2,理解JVM的更多相关文章

  1. 深入理解JVM内幕(转)

    转自:http://blog.csdn.net/zhoudaxia/article/details/26454421/ 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime ...

  2. 深入理解JVM内幕:从基本结构到Java 7新特性

    转自:http://www.importnew.com/1486.html 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境 ...

  3. [译]深入理解JVM

    深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...

  4. 深入理解JVM垃圾收集机制(JDK1.8)

    垃圾收集算法 标记-清除算法 最基础的收集算法是"标记-清除"(Mark-Sweep)算法,分两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 不足: ...

  5. 深入理解JVM(一)编译openJDK

    此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好, ...

  6. 走进JVM【二】理解JVM内存区域

    引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...

  7. 《深入理解JVM虚拟机》读书笔记

    前言:<深入理解JVM虚拟机>是JAVA的经典著作之一,因为内容更偏向底层,所以之前一直没有好好的阅读过.最近因为刚好有空,又有了新目标.所以打算和<构架师的12项修炼>一起看 ...

  8. 理解JVM GC

    理解JVM GC对于我们把控Java应用有很大的帮助.下面我从运维角度,把网上的JVM相关的资料整理如下,以加深对JVM GC的理解.如有错误的地方,请看官指正. JVM内存使用分类 JVM的内存分区 ...

  9. 如何从编程的本质理解JVM内存模型

    如何从编程的本质理解JVM内存模型 一般聊JVM内存模型都是把图截出来,然后对着图,解释上面堆.栈之类的概念.这篇将分享下,如何从编程的本质上理解,JVM内存模型是什么样子,为什么是这个样子,不再死记 ...

  10. 深入理解JVM之JVM内存区域与内存分配

    深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...

随机推荐

  1. 战神CPU计算机硬件组装

    今天本来更新DP常见优化的,但是下午土木学院吴书记找我组装电脑,晚上A题后,临时有一些事情,没来得及整理. 这里分享一下战神CPU(死垃圾)的组装. 一顿操作猛如虎,很艰难的装好机子了,发现吴书记被坑 ...

  2. 【[SDOI2014]旅行】

    听说这是动态开点主席树的板子题,但是发现我还不会,于是就来写一写 其实跟主席树一个样子的 这里就是存个板子吧 #include<cstdio> #include<cstring> ...

  3. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

  4. [19/03/12-星期二] 数组_遍历(for-each)&复制&java.util.Arrays类

    一.遍历 for-each即增强for循环,是JDK1.5新增加的功能,专门用于读取数组或集合中所有的元素,即对数组进行遍历. //数组遍历 for-each public class Test_03 ...

  5. 外部的 JavaScript

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. 关于ProjectServer定制化项目中心页面

    ProjectServer界面很多客户接受不了,随便用户可以根据自己需要展示页面,但大多数国内用户喜欢确定的样式,我就是要这样的页面,不要个人定制. 那只有自己再做一个项目中心的webpart嵌入,对 ...

  7. Openresty最佳案例 | 第2篇:Lua入门

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616622 本文出自方志朋的博客 什么是lua Lua 是一种轻量小巧的脚本语言,用标准 ...

  8. P1247 取火柴游戏

    题目描述 输入k及k个整数n1,n2,-,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不 ...

  9. 【2017 ICPC亚洲区域赛沈阳站 K】Rabbits(思维)

    Problem Description Here N (N ≥ 3) rabbits are playing by the river. They are playing on a number li ...

  10. CSRF的原理和防范措施

    a)攻击原理: i.用户C访问正常网站A时进行登录,浏览器保存A的cookie ii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参 ...