【java】jvm虚拟机

1.java虚拟机
http://blog.csdn.net/lzm18064126848/article/details/53841869
命令:
在操作系统中,一个命令就是01的二进制文件,操作系统也只能是识别01数字。因此当我们在cmd输入一个命令的时候就是启动了一个进程
然后将命令相对应的二进制文件加载到进程对应的操作地址中,链接执行,完成目标功能。
进程:
java虚拟机是一个进程,因为操作系统执行的基本单位单位就是进程,因此通过输入java命令其实就是启动虚拟机进程
类加载器:
javac编译执行生成.class文件,这不能被操作系统识别的二进制文件,因此需要中间翻译。第一步就是根据需要将相关联的.class文件加载
到虚拟机进程相对应的地址空间中,这里就需要用到类加载器
执行引擎:
加载完class文件以后就需要翻译,这部分功能就是通过执行引擎来完成的。生成目标字节码。然后链接执行
内存空间:
在执行的过程中,对象需要堆空间,引用、数据需要栈空间,.class放在方法区中
垃圾回收:
当没有用的对象很多的时候,自动启动垃圾回收。

http://blog.csdn.net/lzm18064126848/article/details/53842316
具体介绍类加载器、执行引擎、内存空间
理解几张大图:
第一张:java虚拟机运行过程图 上一篇博客已经说了
第二张:类加载器  委托模式  和javascript的事件捕获委托类似
第三张:加载完毕以后  链接过程中的几个小步骤:验证语法、准备数据空间、resovling。 再是初始化,常量和静态变量
第四张:运行区域  线程私有的 jvm stack 、本地方法区域、pc寄存器   所有线程共有的   堆、方法区  其中有运行常量池

http://www.cnblogs.com/java-my-life/archive/2012/08/01/2615221.html
一个java程序对应一个java虚拟机
守护进程和非守护进程  http://blog.csdn.net/lzm18064126848/article/details/53842953
体系结构:类加载器、执行引擎、运行区域、垃圾回收
数据类型 基本数据、引用类型  基本类型有整数型、浮点型、returnAddress 最后一个用户不能使用 是jvm用来执行finally语句用的 与指令相关
			引用类型有类类型、接口类型、数组类型
参数传递机制:按照值传递  按照引用传递  区别于c++的按值传递、引用传递、指针传递  http://blog.csdn.net/lzm18064126848/article/details/48952271
其实在明白c++传递机制就很容易懂得java的传递机制了   可以将java的引用理解为弱化的c++的指针


2.运行区域
http://blog.csdn.net/lzm18064126848/article/details/48135235---内存管理深入理解
主要是对栈、堆、方法区三个区域的深入理解,并且利用一个程序作为样例,体验其内存的变化过程

3.垃圾回收
http://blog.csdn.net/lzm18064126848/article/details/53844350
堆内存模型  
新生代和老生代的模型比例为1:2   老生代主要存放应用程序生命周期长的存活对象
新生代分为Eden和两个Survivor两个区域  比例为8:1:1  Eden存放新生的对象 Survivor存放每次垃圾回收后存活的对象

可回收对象的判定算法: 
引用计数算法--无法解决循环引用的问题
可达性分析算法(根搜索算法)

stop the word
因为在垃圾回收过程中,如果引用状态发生改变是会被垃圾回收的,因此在程序执行过程中需要暂停程序,这也就是卡顿的缘由

回收算法
标记清除算法
复制算法
标记整理算法
分代回收算法

触发类型
GC_FOR_MALLOC: 表示是在堆上分配对象时内存不足触发的GC。
GC_CONCURRENT: 当我们应用程序的堆内存达到一定量,或者可以理解为快要满的时候,系统会自动触发GC操作来释放内存。
GC_EXPLICIT: 表示是应用程序调用System.gc、VMRuntime.gc接口或者收到SIGUSR1信号时触发的GC。
GC_BEFORE_OOM: 表示是在准备抛OOM异常之前进行的最后努力而触发的GC。

http://blog.csdn.net/lzm18064126848/article/details/53844594
可达性分析算法补充:不是第一次无法到达引用节点就判定为回收对象,后续还要经过两次无法到达才算回收对象
String str = new String("hello");
SoftReference<String> sr = new SoftReference<String>(new String("java"));
WeakReference<String> wr = new WeakReference<String>(new String("world"));
softreference在内存不足的时候会被判定为回收对象  weakreference不管啥时候都会成为回收对象
一定为成为回收对象的几种常见情况:
1)显示地将某个引用赋值为null或者将已经指向某个对象的引用指向新的对象
2)局部引用所指向的对象
3)只有弱引用与其关联的对象

注意,在堆区之外还有一个代就是永久代(Permanet Generation),它用来存储class类、常量、方法描述等。
对永久代的回收主要回收两部分内容:废弃常量和无用的类。

典型的垃圾回收器
1.Serial/Serial Old
Serial/Serial Old收集器是最基本最古老的收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程。
Serial收集器是针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。
它的优点是实现简单高效,但是缺点是会给用户带来停顿。

2.ParNew
ParNew收集器是Serial收集器的多线程版本,使用多个线程进行垃圾收集。

3.Parallel Scavenge
Parallel Scavenge收集器是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控的吞吐量。

4.Parallel Old
Parallel Old是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法。

5.CMS
CMS(Current Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep算法。

6.G1
G1收集器是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。
因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型


http://www.cnblogs.com/sunniest/p/4575144.html
上面主要是根据触发类型来大致判断触发的条件,这里就是写几个常见的触发full gc的情况
年老代(Tenured)被写满
持久代(Perm)被写满 
System.gc()被显示调用 
上一次GC之后Heap的各域分配策略动态变化

Java有了GC同样会出现内存泄露问题
1.静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。
2.各种连接,数据库连接,网络连接,IO连接等没有显示调用close关闭,不被GC回收导致内存泄露。
3.监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。

https://www.zhihu.com/question/35164211
怎么在面试时回答Java垃圾回收机制(GC)相关问题?

http://charles-xiao.github.io/2015/07/29/%E6%B5%85%E6%9E%90java%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6/
java与C++内存管理机制对比
在C++中,所有的对象都会被销毁,局部对象的销毁发生在以右花括号为界的对象作用域的末尾处,而程序猿new出来的对象则应该主动调用delete操作符从而调用析构函数去回收对象占用的内存。
但是C++这种直接操作内存的方式存在很大内存泄露风险,而且人为管理内存复杂且困难。
在java中,内存管理由JVM完全负责,java中的“垃圾回收器”负责自动回收无用对象占据的内存资源,这样可以大大减少程序猿在内存管理上花费的时间,可以更集中于业务逻辑和具体功能实现;
但这并不是说java有了垃圾回收器程序猿就可以高枕无忧,将内存管理抛之脑外了!一方面,实际上java中还存在垃圾回收器没法回收以某种“特殊方式”分配的内存的情况(这种特殊方式我们将在下文中进行详细描述);另一方面,java的垃圾回收是不能保证一定发生的,除非JVM面临内存耗尽的情况。所以java中部分对象内存还是需要程序猿手动进行释放,合理地对部分对象进行管理可以减少内存占用与资源消耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值