html简单网页代码 案例_制作网页代码案例(w3cschool)
大家好,我是冰河~~
作為程序員,多多少少都會遇到一些內存溢出的場景,如果你還沒遇到,說明你工作的年限可能比較短,或者你根本就是個假程序員!哈哈,開個玩笑。
當初面試官讓我現場手寫內存溢出案例代碼,我就以Java代碼的方式列舉了幾個典型的內存溢出案例。今天分享給大家,希望大家在日常工作中,盡量避免寫這些low水平的代碼。
小伙伴們點贊,收藏,評論,走起呀
我們先來看看今天要介紹哪些內存溢出案例,冰河這里總結了一張圖,如下所示。
說干就干,咱們開始吧!!
定義主類結構
首先,我們創建一個名稱為BlowUpJVM的類,之后所有的案例實驗都是基于這個類進行。如下所示。
public class BlowUpJVM {
}
棧深度溢出
public static void testStackOverFlow(){
BlowUpJVM.testStackOverFlow();
}
棧不斷遞歸,而且沒有處理,所以虛擬機棧就不斷深入不斷深入,棧深度就這樣溢出了。
永久代內存溢出
public static void testPergemOutOfMemory1(){
//方法一失敗
List<String> list = new ArrayList<String>();
while(true){
list.add(UUID.randomUUID().toString().intern());
}
}
打算把String常量池堆滿,沒想到失敗了,JDK1.7后常量池放到了堆里,也能進行垃圾回收了。
然后換種方式,使用cglib,用Class把老年代取堆滿
public static void testPergemOutOfMemory2(){
try {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOM.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
catch (Exception e){
e.printStackTrace();
}
}
虛擬機成功內存溢出了,那JDK動態代理產生的類能不能溢出呢?
public static void testPergemOutOfMemory3(){
while(true){
final OOM oom = new OOM();
Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(oom, args);
return result;
}
});
}
}
事實表明,JDK動態代理差生的類不會造成內存溢出,原因是:JDK動態代理產生的類信息,不會放到永久代中,而是放在堆中。
本地方法棧溢出
public static void testNativeMethodOutOfMemory(){
int j = 0;
while(true){
Printer.println(j++);
ExecutorService executors = Executors.newFixedThreadPool(50);
int i=0;
while(i++<10){
executors.submit(new Runnable() {
public void run() {
}
});
}
}
}
這個的原理就是不斷創建線程池,而每個線程池都創建10個線程,這些線程池都是在本地方法區的,久而久之,本地方法區就溢出了。
JVM棧內存溢出
public static void testStackOutOfMemory(){
while (true) {
Thread thread = new Thread(new Runnable() {
public void run() {
while(true){
}
}
});
thread.start();
}
}
線程的創建會直接在JVM棧中創建,但是本例子中,沒看到內存溢出,主機先掛了,不是JVM掛了,真的是主機掛了,無論在mac還是在windows,都掛了。
溫馨提示,這個真的會死機的。
堆溢出
public static void testOutOfHeapMemory(){
List<StringBuffer> list = new ArrayList<StringBuffer>();
while(true){
StringBuffer B = new StringBuffer();
for(int i = 0 ; i < 10000 ; i++){
B.append(i);
}
list.add(B);
}
}
不斷往堆中塞新增的StringBuffer對象,堆滿了就直接溢出了。
測試案例完整代碼
public class BlowUpJVM {
//棧深度溢出
public static void testStackOverFlow(){
BlowUpJVM.testStackOverFlow();
}
//不能引起永久代溢出
public static void testPergemOutOfMemory1(){
//方法一失敗
List<String> list = new ArrayList<String>();
while(true){
list.add(UUID.randomUUID().toString().intern());
}
}
//永久代溢出
public static void testPergemOutOfMemory2(){
try {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOM.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
catch (Exception e){
e.printStackTrace();
}
}
//不會引起永久代溢出
public static void testPergemOutOfMemory3(){
while(true){
final OOM oom = new OOM();
Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(oom, args);
return result;
}
});
}
}
//本地方法棧溢出
public static void testNativeMethodOutOfMemory(){
int j = 0;
while(true){
Printer.println(j++);
ExecutorService executors = Executors.newFixedThreadPool(50);
int i=0;
while(i++<10){
executors.submit(new Runnable() {
public void run() {
}
});
}
}
}
//JVM內存溢出
public static void testStackOutOfMemory(){
while (true) {
Thread thread = new Thread(new Runnable() {
public void run() {
while(true){
}
}
});
thread.start();
}
}
//堆溢出
public static void testOutOfHeapMemory(){
List<StringBuffer> list = new ArrayList<StringBuffer>();
while(true){
StringBuffer B = new StringBuffer();
for(int i = 0 ; i < 10000 ; i++){
B.append(i);
}
list.add(B);
}
}
}
寫在最后
如果你想進大廠,想升職加薪,或者對自己現有的工作比較迷茫,都可以私信我交流,希望我的一些經歷能夠幫助到大家~~
推薦閱讀:
- 《奉勸那些剛參加工作的學弟學妹們:要想進大廠,這些核心技能是你必須要掌握的!完整學習路線!!(建議收藏)》
- 《奉勸那些剛參加工作的學弟學妹們:這些計算機與操作系統基礎知識越早知道越好!萬字長文太頂了!!(建議收藏)》
- 《我用三天時間開發了一款老少皆宜的國民級游戲,支持播放音樂,現開放完整源代碼和注釋(建議收藏)!!》
- 《我是全網最硬核的高并發編程作者,CSDN最值得關注的博主,大家同意嗎?(建議收藏)》
- 《畢業五年,從月薪3000到年薪百萬,我掌握了哪些核心技能?(建議收藏)》
- 《我入侵了隔壁妹子的Wifi,發現。。。(全程實戰干貨,建議收藏)》
- 《千萬不要輕易嘗試“熊貓燒香”,這不,我后悔了!》
- 《清明節偷偷訓練“熊貓燒香”,結果我的電腦為熊貓“獻身了”!》
- 《7.3萬字肝爆Java8新特性,我不信你能看完!(建議收藏)》
- 《在業務高峰期拔掉服務器電源是一種怎樣的體驗?》
- 《半小時實現Java手擼Http協議,爽!!(附完整源碼,建議收藏)》
- 《畢業五年,年薪百萬,只因我做對了這些事!!(建議收藏)》
最后,附上并發編程需要掌握的核心技能知識圖,祝大家在學習并發編程時,少走彎路。
好了,今天就到這兒吧,小伙伴們點贊、收藏、評論,一鍵三連走起呀,我是冰河,我們下期見~~
總結
以上是生活随笔為你收集整理的html简单网页代码 案例_制作网页代码案例(w3cschool)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3DMAX怎么渲染 3DMAX渲染的具体
- 下一篇: Fiori elements:when