JVM
作者:互联网
JVM探究
-
这是一篇有很多外链的笔记(可以按这个学习JVM,有一些概念比较难理解,查找了比较全面的介绍,可以多看几遍)
-
对JVM的理解 Java8虚拟机和之前的变化更新
-
什么是OOM,什么是栈溢出StackOverFloeError?怎么分析?
-
JVM的常用调用参数有那些
-
内存快照如何抓取?怎么分析Dump文件,
-
JVM,类加载器
-
JVM的位置
-
JVM的体系结构
-
类加载器
-
虚拟机加载器
-
启动类加载器
-
扩展类加载器
-
应用类加载器
-
(看源码看源码)
-
-
双亲委派机制
-
沙箱安全机制
!((4条消息) java中的安全模型(沙箱机制)改变ing-CSDN博客沙箱安全机制)很详细,需要看几遍才能理解一..
什么是沙箱?
Java安全模型的核心就是Java沙箱(sandbox),什么是沙箱?沙箱是一个限制程序运行的环境。沙箱机制就是将 Java 代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。沙箱主要限制系统资源访问,那系统资源包括什么?——
CPU、内存、文件系统、网络
。不同级别的沙箱对这些资源访问的限制也可以不一样。所有的Java程序运行都可以指定沙箱,可以定制安全策略。
java中的安全模型:
在Java中将执行程序分成本地代码和远程代码两种,本地代码默认视为可信任的,而远程代码则被看作是不受信的。对于授信的本地代码,可以访问一切本地资源。而对于非授信的远程代码在早期的Java实现中,安全依赖于沙箱 (Sandbox) 机制。如下图所示 JDK1.0安全模型
但如此严格的安全机制也给程序的功能扩展带来障碍,比如当用户希望远程代码访问本地系统的文件时候,就无法实现。因此在后续的 Java1.1 版本中,针对安全机制做了改进,增加了
安全策略
,允许用户指定代码对本地资源的访问权限。如下图所示 JDK1.1安全模型在 Java1.2 版本中,再次改进了安全机制,增加了
代码签名
。不论本地代码或是远程代码,都会按照用户的安全策略设定,由类加载器加载到虚拟机中权限不同的运行空间,来实现差异化的代码执行权限控制。如下图所示 JDK1.2安全模型当前最新的安全机制实现,则引入了域 (Domain) 的概念。虚拟机会把所有代码加载到不同的系统域和应用域,系统域部分专门负责与关键资源进行交互,而各个应用域部分则通过系统域的部分代理来对各种需要的资源进行访问。虚拟机中不同的受保护域 (Protected Domain),对应不一样的权限 (Permission)。存在于不同域中的类文件就具有了当前域的全部权限,如下图所示 最新的安全模型(jdk 1.6)
以上提到的都是基本的
Java 安全模型概念
,在应用开发中还有一些关于安全的复杂用法
,其中最常用到的 API 就是 doPrivileged。doPrivileged 方法能够使一段受信任代码获得更大的权限,甚至比调用它的应用程序还要多,可做到临时访问更多的资源
。有时候这是非常必要的,可以应付一些特殊的应用场景。例如,应用程序可能无法直接访问某些系统资源,但这样的应用程序必须得到这些资源才能够完成功能。 -
Native(面试会问)
硬件方面,平时写的比较少,
会进入本地方法栈,
-
native :凡是带了native 关键字的,说明java的作用范围达不到了,回去调用底层c语言的库
-
会进入本地方法栈
-
调用本地方法本地接口 JNI
-
JNI作用:扩展Java的使用,融合不同的编程语言为ava所用!最初: C、C++。
-
Java诞生的时候C、C++横行,想要立足,必须要有调川c、C++的程序~
-
它在内存区域中专门开辟了一块标记区域:Native Method Stack,登记native方法
-
在最终执行的时候,加战本地方法库中的方法通过JNI
-
Java程序驱动打印机,管理系绒
!((4条消息) 全面了解Java中Native关键字的作用毕富国的博客-CSDN博客java中native关键字的作用)
-
-
PC寄存器(了解)
寄存器是中央处理器内的组成部分。 寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 在中央处理器的控制部件中,包含的寄存器有指令寄存器 (IR)和程序计数器 (PC)。
-
方法区(面试)
==静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中。但是实例变量存在堆内存中,和方法区无关==
-
栈和堆
数据结构,(考研要学,宝们加油)
-
三种JVM(了解)
●Sun公司HotSpot Java Hotspot™ 64-Bit Server VM (build 25.181-b13,mixed mode)
●BEA JRockit
●IBM J9 VM
我们学习都是: Hotspot
-
新生区、老年区 ●类:诞生和成长的地方,甚至死亡;
●伊甸园,所有的对象都是在伊甸园区new出来的!
●幸存者区(0,1) +伊甸园=新生区
图 重GC和轻GC
伊甸园满了就触发轻GC,经过轻GC存活下来的就到了幸存者区,幸存者区满之后意味着新生区也满了,则触发重GC,经过重GC之后存活下来的就到了养老区。 真理:经过研究,99%的对象都是临时对象!|
图 JVM探究
元空间:逻辑上存在,物理上不存在 (因为存储在本地磁盘内) 所以最后并不算在JVM虚拟机内存中
-
永 久区 这个区域常驻内存的。用来存放JDK自身携带的Class对象。Interface元数据,存储的是Java运行时的一些环境~ 这个区域不存在垃圾回收,关闭虚拟机就会释放内存 ●jdk1.6之前:永久代,常量池是在方法区; ●jdk1.7:永久代,但是慢慢的退化了,去永久代,常量池在堆中 ●jdk1.8之后:无永久代,常量池在元空间
-
堆内存调优
测试代码
public static void main(String[] args) {
String s = "";
while (true) {
s += "11111111111111111111111111111111111111111111111111111";
}
}
123456图 虚拟机放入参数
图 控制台报错 到最后会报OOM(OutOfMemory)堆内存溢出报错
在一个项目中,突然出现了OOM故障,那么该如何排除 研究为什么出错~ ●能够看到代码第几行出错:内存快照分析工具,MAT, Jprofiler ●Dubug, 一行行分析代码!
MAT, Jprofiler作用 ●分析Dump内存文件,快速定位内存泄露; ●获得堆中的数据 ●获得大的对象~
MAT是eclipse集成使用 在这里不学 Jprofile使用 1.在idea中下载jprofile插件 2.联网下载jprofile客户端 3.在idea中VM参数中写参数 -Xms1m -Xmx8m -XX: +HeapDumpOnOutOfMemoryError 4.运行程序后在jprofile客户端中打开找到错误 告诉哪个位置报错 命令参数详解 // -Xms设置初始化内存分配大小/164 // -Xmx设置最大分配内存,默以1/4 // -XX: +PrintGCDetails // 打印GC垃圾回收信息 // -XX: +HeapDumpOnOutOfMemoryError //oom DUMP
JProfiler工具
package com.ar.chapter02;
import java.util.ArrayList;
//Dump:
public class Text2 {
byte[] array = new byte[1*1024*1024];//1m
public static void main(String[] args) {
ArrayList<Text2> list= new ArrayList<>();
int count=0;
try {
while (true){
list.add(new Text2());
count =count+1;
}
}catch (Exception e){
System.out.println("count:" + count);
e.printStackTrace();
}
}
}
这样是不正确的不能输出,需要Dump文件
也有语法哦
1/-Xms设置初始化内存分配大小/164 -Xmx设置最大分配内存,默认1/4 1/-XMs设置初始化内存分配大小/164-XMX设置最大分配内存,默认1/4
-XX:+PrintGCDetails 1/打EIGC垃圾回收 -XX:+PrintGCDetails 1/打EIGC垃圾回收
-XX: +HeapDumpOnoutofMemoryErrorlloom DUMP -XX:+HeapDumpOnoutofMemoryErrorlloom转储
//-Xms1m -Xmx8m -XX :+HeapDumponoutofMemoryError //-Xms1-Xmx8m-XX:+HeapDumponoutofMemoryError
通过JProfiler查找问题OOM
标签:Java,本地,代码,内存,JVM,沙箱 来源: https://www.cnblogs.com/ar000517/p/15758626.html