banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Thắc mắc về Stack trong Java  XML
  [Programming]   Thắc mắc về Stack trong Java 27/07/2008 07:26:30 (+0700) | #1 | 143534
[Avatar]
zThienLongz
Member

[Minus]    0    [Plus]
Joined: 29/08/2006 10:09:05
Messages: 104
Location: World
Offline
[Profile] [PM] [WWW]
Mình đã học về stack cũng như bộ nhớ C++ khá kĩ giờ đang học chuyển sang học java. Trong quá trình code về csdl thấy có vài điểm lạ trong stack của java.
Đoạn code của mình như sau:
file DB.java
Code:
import java.sql.*;
public class DB {
	private String driver = "com.mysql.jdbc.Driver";
	private String host = "jdbc:mysql://localhost";
	private String dbName = "test";
	private int port = 3306;
	private String userDB = "root";
	private String passDB = "macarong";
	private Statement sta;
	
	public DB() {
		super();
	}
	
	public void connect() throws Exception {
		Class.forName(driver);
		String url = host + ":" + port + "/" + dbName;
		Connection con = DriverManager.getConnection(url,userDB,passDB);
		sta = con.createStatement();
	}
	
	public ResultSet execSQL(String query) throws Exception {
		ResultSet res = sta.executeQuery(query);
		return res != null ? res : null;
	}
	
	public int updateSQL(String sql) throws Exception {
		int i = sta.executeUpdate(sql);
		return i > 0 ? i : 0;
	}
}

file mystack.java
Code:
import java.sql.*;
public class mystack {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DB db = new DB();
		try {
			db.connect();
			ResultSet rs = db.execSQL("select * from User");
			while(rs.next()) {
				System.out.print(rs.getString("Username") + "\t" + rs.getString("Email"));
			}
		} catch (Exception e) {
			System.out.print("Loi he thong:" + e);
		}
	}

}

Chương trình ở trên chạy ngon lành nhưng mình lại ko hiểu tại sao vậy
Khi mình gọi hàm db.connect() thì nó thực hiện những gì trong phương thức connect(): biến "con" đc tạo ra rùi con.createStatement(); tạo ra 1 đối tượng kiểu Statement và sau đó biến sta tham chiếu tới nó. Cái mình thắc mắc ở đây là khi kết thúc phướng thức bình thường như trong C/C++ thì stack đó sẽ bị hủy , các biến đc khai báo bên trong method sẽ biến mất , còn đây tại sao stack ko bị hủy có phải là do thuộc tính "sta" tham chiếu tới 1 đối tượng ( 1 biến ) trong stack (vì trong java cách truyền tham số là class là truyền bằng pass by reference) nên khi kết thúc method stack ko bị hủy.
Một câu hỏi phụ nếu như ko có 1 đối tượng nào (1 biến của class ) bên ngoài tham chiếu tới 1 đối tượng trong stack thì stack có bị hủy ko
[Up] [Print Copy]
  [Question]   Re: Thắc mắc về Stack trong Java 27/07/2008 07:54:38 (+0700) | #2 | 143540
[Avatar]
4hfoo
Elite Member

[Minus]    0    [Plus]
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
[Profile] [PM]
Bạn có thể nói bạn làm cách nào để biết stack không bị hủy không vậy?

Trong Java thì đối tượng sẽ bị hủy khi hệ thống chạy garbage collection. Việc chạy cái này là do garbage collector trong JVM quyết định, người lập trình không thể quyết định được.

Nếu có ít nhất 1 tham chiếu (reference) đến 1 object thì object đó sẽ không bị hủy.

Thân.
[Up] [Print Copy]
  [Question]   Re: Thắc mắc về Stack trong Java 27/07/2008 09:34:33 (+0700) | #3 | 143566
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
trong C++ có thể làm như thế này:
Code:
Object *getObject(){
         Object *obj = new Object();
         return obj;
}


như vậy vẫn có thể tham chiếu đến đối tượng được khai báo trong function đó được, thực ra thì biến obj được lưu trữ trong heap chứ không phải là stack (được tạo bởi new), nên nó chỉ bị hủy đi khi nào ta gọi delete. Nó khác với trường hợp

Code:
Object *getObject(){
         Object obj;
         return &obj;
}

lúc này biến obj được lưu trữ trong stack, nên khi thoát khỏi hàm vùng stack đó rất có thể sẽ bị đè lên. Tớ nghĩ là JVM nó dùng cách thứ nhất.
[Up] [Print Copy]
  [Question]   Re: Thắc mắc về Stack trong Java 27/07/2008 09:44:52 (+0700) | #4 | 143571
[Avatar]
zThienLongz
Member

[Minus]    0    [Plus]
Joined: 29/08/2006 10:09:05
Messages: 104
Location: World
Offline
[Profile] [PM] [WWW]
Hix, em quên mất mấy obj xài vùng nhớ heap
Cám ơn anh nhìu.
[Up] [Print Copy]
  [Question]   Re: Thắc mắc về Stack trong Java 27/07/2008 11:44:50 (+0700) | #5 | 143588
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Vậy trong Java và .NET, cái gì create trong stack vậy ?
[Up] [Print Copy]
  [Question]   Re: Thắc mắc về Stack trong Java 27/07/2008 12:15:51 (+0700) | #6 | 143591
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]

TQN wrote:
Vậy trong Java và .NET, cái gì create trong stack vậy ? 

hì hì, anh TQN nói luôn đi ah.
[Up] [Print Copy]
  [Question]   Re: Thắc mắc về Stack trong Java 27/07/2008 22:37:38 (+0700) | #7 | 143626
[Avatar]
zThienLongz
Member

[Minus]    0    [Plus]
Joined: 29/08/2006 10:09:05
Messages: 104
Location: World
Offline
[Profile] [PM] [WWW]
@ TQN: hix anh cứ đùa hoài, cái này theo em có rất nhìu thứ đc tạo trong stack như các dữ liễu có kiểu cơ bản như char, int , float...v.v....ngoài ra nếu stack còn lưu giữ số thứ tự dòng lệnh mà hàm trả lại (The line number of the calling function to return to when the called function returns.)
[Up] [Print Copy]
  [Question]   Re: Thắc mắc về Stack trong Java 27/07/2008 23:32:43 (+0700) | #8 | 143631
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Ừ, thì sách và help nó nói vậy, nói sao nghe vậy, chứ có ai biết là runtime loader nó có lưu mấy thứ đó trong stack hay không. Lúc có lúc không ai biết đâu mà lần, rồi box, unbox gì đó nữa...
Java thì lâu rồi không đụng tới nên bụi đóng lớp rồi, chứ .NET thì phải qua JIT. Stack của 1 thread trong .NET có tới 2 stack: stack của managed interpreter (ildasm ra thấy push/pop/ldxxx/lsxxx... trên stack này), + thêm 1 native stack của JIT quản lý.
Thật tình là tui cũng không nắm rõ được cơ chế truy xuất và hoạt động 2 stack này. Hỏi các bạn xem có bạn nào biết đấy mà.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|